<?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>23357</bug_id>
          
          <creation_ts>2009-01-15 14:53:24 -0800</creation_ts>
          <short_desc>Land new files in WebCore/rendering related to accelerated compositing</short_desc>
          <delta_ts>2009-03-02 11:51:52 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P1</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>23359</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Simon Fraser (smfr)">simon.fraser</reporter>
          <assigned_to name="Simon Fraser (smfr)">simon.fraser</assigned_to>
          <cc>cmarrin</cc>
    
    <cc>dino</cc>
    
    <cc>hyatt</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>105969</commentid>
    <comment_count>0</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-15 14:53:24 -0800</bug_when>
    <thetext>Bug to track the landing of new files in WebCore/rendering related to accelerate
compositing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105988</commentid>
    <comment_count>1</comment_count>
      <attachid>26775</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-15 16:49:06 -0800</bug_when>
    <thetext>Created attachment 26775
Patch, changelog</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106141</commentid>
    <comment_count>2</comment_count>
      <attachid>26775</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2009-01-16 16:25:00 -0800</bug_when>
    <thetext>Comment on attachment 26775
Patch, changelog

Issues:
  Should use the 2-clause bsd license.
  Should avoid the &quot;in&quot; prefix for parameters
  Multiline if-statements need braces.



+#include &quot;RenderLayerBacking.h&quot;

This include should be the first include after &quot;config.h&quot;

+struct LayerHitTestData {
+    LayerHitTestData(RenderLayer* inRootLayer, const HitTestRequest&amp; inRequest, HitTestResult&amp; inResult, const IntRect&amp; hitTestRect)
+    : m_rootLayer(inRootLayer)
+    , m_request(inRequest)
+    , m_hitTestRect(hitTestRect)
+    , m_result(inResult)

The initialization list should be indented further and the &quot;in&quot; prefixes are not necessary.

+        if (renderer()-&gt;node()-&gt;isHTMLElement() &amp;&amp; renderer()-&gt;node()-&gt;hasID())
+            m_graphicsLayer-&gt;setName(renderer()-&gt;renderName() + String(&quot; &quot;) + ((HTMLElement*)renderer()-&gt;node())-&gt;id());

Please use a c++ style cast


+float RenderLayerBacking::compositingOpacity(float rendererOpacity) const
+{
+    float finalOpacity = rendererOpacity;
+    
+    for (RenderLayer* curr = m_owningLayer-&gt;parent(); curr != 0; curr = curr-&gt;parent()) {

No need for curr != 0.  It can just be curr.


+// A simple background is either none or a solid color.
+static bool hasSimpleBackground(RenderStyle* inStyle)
+{
+    return !inStyle-&gt;hasBackgroundImage();
+}
+
+static bool hasBorderOutlineOrShadow(RenderStyle* inStyle)
+{
+    return (inStyle-&gt;hasBorder() || inStyle-&gt;hasBorderRadius() || inStyle-&gt;hasOutline() || (inStyle-&gt;boxShadow() != 0));
+}

The &quot;in&quot; prefix is not necessary.

+        Vector&lt;RenderLayer*&gt;* posZOrderList = m_owningLayer-&gt;posZOrderList();
+        if (posZOrderList &amp;&amp; posZOrderList-&gt;size() &gt; 0)
+            for (Vector&lt;RenderLayer*&gt;::const_iterator it = posZOrderList-&gt;begin(); it != posZOrderList-&gt;end(); ++it) {
+                RenderLayer* curLayer = (*it);
+                if (!curLayer-&gt;isComposited())
+                    return true;
+            }

The if-statement should have braces.

+    }
+
+    Vector&lt;RenderLayer*&gt;* overflowList = m_owningLayer-&gt;overflowList();
+    if (overflowList &amp;&amp; overflowList-&gt;size() &gt; 0)
+        for (Vector&lt;RenderLayer*&gt;::const_iterator it = overflowList-&gt;begin(); it != overflowList-&gt;end(); ++it) {
+            RenderLayer* curLayer = (*it);
+            if (!curLayer-&gt;isComposited())
+                return true;
+        }

Same here.

+
+    IntSize  contentOffset = contentOffsetInCompostingLayer();

Extra space.

+        // Paint any child layers that have overflow.
+        Vector&lt;RenderLayer*&gt;* overflowList = m_owningLayer-&gt;overflowList();
+        if (overflowList)
+            for (Vector&lt;RenderLayer*&gt;::iterator it = overflowList-&gt;begin(); it != overflowList-&gt;end(); ++it)
+                it[0]-&gt;paintLayer(rootLayer, context, paintDirtyRect, haveTransparency, paintRestriction, paintingRoot);
+        
+        // Now walk the sorted list of children with positive z-indices.
+        Vector&lt;RenderLayer*&gt;* posZOrderList = m_owningLayer-&gt;posZOrderList();
+        if (posZOrderList)
+            for (Vector&lt;RenderLayer*&gt;::iterator it = posZOrderList-&gt;begin(); it != posZOrderList-&gt;end(); ++it)
+                it[0]-&gt;paintLayer(rootLayer, context, paintDirtyRect, haveTransparency, paintRestriction, paintingRoot);

If statements need braces.

+        // FIXME: move into a helper function
+        FloatQuad   hitTestQuad(hitTestRect);

Extra space.

+    // Layer to clip children
+    bool hasClippingLayer() const   { return m_clippingLayer != 0; }
+    GraphicsLayer* clippingLayer() const  { return m_clippingLayer; }
+
+    // Layer to get clipped by ancestor
+    bool hasAncestorClippingLayer() const   { return m_ancestorClippingLayer != 0; }
+    GraphicsLayer* ancestorClippingLayer() const  { return m_ancestorClippingLayer; }
+
+    bool hasContentsLayer() const   { return m_contentsLayer != 0; }
+    GraphicsLayer* contentsLayer() const   { return m_contentsLayer; }

Extra spaces before the opening brace.

+    RenderLayer* findHitCompositingLayer(RenderLayer* rootLayer, const HitTestRequest&amp;, HitTestResult&amp;, const IntRect&amp; hitTestRect, const IntPoint&amp; hitTestPoint);
+
+private:

This private: is redundant

+
+#if ENABLE(3D_TRANSFORMS)
+// This symbol is used to determine from a script whether 3D transforms are enabled (via &apos;nm&apos;).
+bool WebCoreHas3DTransforms = true;

This seems a little odd. How is this used and why?

+#include &quot;SystemTime.h&quot;

I think this is now in WTF

+
+#ifndef NDEBUG
+#include &quot;CString.h&quot;
+#include &quot;RenderTreeAsText.h&quot;
+#endif
+
+namespace WebCore {
+
+struct CompositingState {
+    CompositingState(RenderLayer* inCompAncestor)
+    : m_subtreeIsCompositing(false)
+    , m_compositingAncestor(inCompAncestor)
+    , m_depth(0)

Initialization list should be indented and the &quot;in&quot; prefix is not necessary

+    {
+    }
+    
+    bool m_subtreeIsCompositing;
+    RenderLayer* m_compositingAncestor;
+    int m_depth;        // just used for debugging

If this is just for debugging, shoudld it be in #ifndef NDEBUG?
+void RenderLayerCompositor::enableCompositingMode(bool enable /* = true */)
+{
+    if (enable != m_compositing) {
+        m_compositing = enable;

Early return might be cleaner here.

+    
+    {
+        // If you uncomment this, be sure to comment the layout() and updateCompositingLayers() lines in
+        // RenderTreeAsText.cpp, externalRepresentation(), to avoid recursion.
+        //String dump = externalRepresentation(m_renderView);
+        //fprintf(stderr, &quot;%s&quot;, dump.utf8().data());

We really don&apos;t like including commented out code.  If you would like to keep this in, you should surround it with a #define that
is usually off.

+    Vector&lt;RenderLayer*&gt;* negZOrderList = layer-&gt;negZOrderList();
+    if (negZOrderList)
+        for (Vector&lt;RenderLayer*&gt;::iterator it = negZOrderList-&gt;begin(); it != negZOrderList-&gt;end(); ++it) {
+            RenderLayer* curLayer = (*it);
+            if (!curLayer-&gt;isComposited()) {
+                IntRect childUnionBounds = calculateCompositedBounds(curLayer, layer);
+                unionBounds.unite(childUnionBounds);
+            }
+        }
+
+    Vector&lt;RenderLayer*&gt;* posZOrderList = layer-&gt;posZOrderList();
+    if (posZOrderList)
+        for (Vector&lt;RenderLayer*&gt;::iterator it = posZOrderList-&gt;begin(); it != posZOrderList-&gt;end(); ++it) {
+            RenderLayer* curLayer = (*it);
+            if (!curLayer-&gt;isComposited()) {
+                IntRect childUnionBounds = calculateCompositedBounds(curLayer, layer);
+                unionBounds.unite(childUnionBounds);
+            }
+        }
+
+    Vector&lt;RenderLayer*&gt;* overflowList = layer-&gt;overflowList();
+    if (overflowList)
+        for (Vector&lt;RenderLayer*&gt;::iterator it = overflowList-&gt;begin(); it != overflowList-&gt;end(); ++it) {
+            RenderLayer* curLayer = (*it);
+            if (!curLayer-&gt;isComposited()) {
+                IntRect curAbsBounds = calculateCompositedBounds(curLayer, layer);
+                unionBounds.unite(curAbsBounds);
+            }
+        }

If statements need braces.


+    bool childOverflowOnly = layer-&gt;isOverflowOnly();
+    RenderLayer* curr = layer-&gt;parent();
+    
+    for ( ; curr != 0; curr = curr-&gt;parent()) {

The RenderLayer* curr = layer-&gt;parent(); can be inside the for-loop header and there is no need for the != 0.

+RenderLayer* RenderLayerCompositor::enclosingNonStackingClippingLayer(const RenderLayer* layer) const
+{
+    RenderLayer* curr = layer-&gt;parent();
+    for ( ; curr != 0; curr = curr-&gt;parent()) {

Same here.

+    ASSERT(!layer-&gt;m_overflowListDirty);
+    Vector&lt;RenderLayer*&gt;* overflowList = layer-&gt;overflowList();
+    if (overflowList &amp;&amp; overflowList-&gt;size() &gt; 0)
+        for (Vector&lt;RenderLayer*&gt;::const_iterator it = overflowList-&gt;begin(); it != overflowList-&gt;end(); ++it) {
+            RenderLayer* curLayer = (*it);
+            computeCompositingRequirements(curLayer, childState);
+        }
+
+    if (layer-&gt;isStackingContext()) {
+        Vector&lt;RenderLayer*&gt;* posZOrderList = layer-&gt;posZOrderList();
+        if (posZOrderList &amp;&amp; posZOrderList-&gt;size() &gt; 0)
+            for (Vector&lt;RenderLayer*&gt;::const_iterator it = posZOrderList-&gt;begin(); it != posZOrderList-&gt;end(); ++it) {
+                RenderLayer* curLayer = (*it);
+                computeCompositingRequirements(curLayer, childState);
+            }
+    }

Braces around multiline if-statements.



+void RenderLayerCompositor::rebuildCompositingLayerTree(RenderLayer* layer, struct CompositingState&amp; ioCompState)
+{
+#if 0
+    bool internalNeedToComposite = requiresCompositingLayer(layer);
+
+    for (int i = 0; i &lt; ioCompState.m_depth; ++i)
+        fprintf(stderr, &quot;  &quot;);
+
+    fprintf(stderr, &quot;rebuildCompositingLayerTree %p: has layer %d, requires layer %d, force layer %d, stacking %d\n&quot;,
+                    this, layer-&gt;isComposited(), internalNeedToComposite, ioCompState.m_subtreeIsCompositing, layer-&gt;isStackingContext());
+
+    for (int i = 0; i &lt; ioCompState.m_depth; ++i)
+        fprintf(stderr, &quot;  &quot;);
+    fprintf(stderr, &quot;forceCompositingLayer(%d) %p\n&quot;, ioCompState.m_subtreeIsCompositing, this);
+#endif

This is pretty much the same thing as commented out code.  If we want to keep this, we should a named macro.

+    ASSERT(!layer-&gt;m_overflowListDirty);
+    Vector&lt;RenderLayer*&gt;* overflowList = layer-&gt;overflowList();
+    if (overflowList &amp;&amp; overflowList-&gt;size() &gt; 0)
+        for (Vector&lt;RenderLayer*&gt;::iterator it = overflowList-&gt;begin(); it != overflowList-&gt;end(); ++it) {
+            RenderLayer* curLayer = (*it);
+            rebuildCompositingLayerTree(curLayer, childState);
+            if (curLayer-&gt;isComposited())
+                setCompositingParent(curLayer, childState.m_compositingAncestor);
+        }
+    
+    if (layer-&gt;isStackingContext()) {
+        Vector&lt;RenderLayer*&gt;* posZOrderList = layer-&gt;posZOrderList();
+        if (posZOrderList &amp;&amp; posZOrderList-&gt;size() &gt; 0)
+            for (Vector&lt;RenderLayer*&gt;::const_iterator it = posZOrderList-&gt;begin(); it != posZOrderList-&gt;end(); ++it) {
+                RenderLayer* curLayer = (*it);
+                rebuildCompositingLayerTree(curLayer, childState);
+                if (curLayer-&gt;isComposited())
+                    setCompositingParent(curLayer, childState.m_compositingAncestor);
+            }
+    }

Multiline if-statment.

+        Vector&lt;RenderLayer*&gt;* negZOrderList = layer-&gt;negZOrderList();
+        if (negZOrderList)
+            for (Vector&lt;RenderLayer*&gt;::iterator it = negZOrderList-&gt;begin(); it != negZOrderList-&gt;end(); ++it) {
+                RenderLayer* curLayer = (*it);
+                int x = 0, y = 0;
+                curLayer-&gt;convertToLayerCoords(layer, x, y);
+                IntRect childRect(inRect);
+                childRect.move(-x, -y);
+                repaintCompositingLayerRect(curLayer, childRect, true);
+            }
+
+        Vector&lt;RenderLayer*&gt;* posZOrderList = layer-&gt;posZOrderList();
+        if (posZOrderList)
+            for (Vector&lt;RenderLayer*&gt;::iterator it = posZOrderList-&gt;begin(); it != posZOrderList-&gt;end(); ++it) {
+                RenderLayer* curLayer = (*it);
+                int x = 0, y = 0;
+                curLayer-&gt;convertToLayerCoords(layer, x, y);
+                IntRect childRect(inRect);
+                childRect.move(-x, -y);
+                repaintCompositingLayerRect(curLayer, childRect, true);
+            }
+
+        Vector&lt;RenderLayer*&gt;* overflowList = layer-&gt;overflowList();
+        if (overflowList)
+            for (Vector&lt;RenderLayer*&gt;::iterator it = overflowList-&gt;begin(); it != overflowList-&gt;end(); ++it) {
+                RenderLayer* curLayer = (*it);
+                int x = 0, y = 0;
+                curLayer-&gt;convertToLayerCoords(layer, x, y);
+                IntRect childRect(inRect);
+                childRect.move(-x, -y);
+                repaintCompositingLayerRect(curLayer, childRect, true);
+            }

Same here,

+void RenderLayerCompositor::willBeDetached()
+{
+    if (m_rootPlatformLayer &amp;&amp; m_rootLayerAttached) {
+        Frame* frame = m_renderView-&gt;frameView()-&gt;frame();
+        if (!frame)
+            return;
+        Page* page = frame-&gt;page();
+        if (!page)
+            return;
+        page-&gt;chrome()-&gt;client()-&gt;attachRootGraphicsLayer(frame, 0);
+        m_rootLayerAttached = false;
+    }
+}
+
+void RenderLayerCompositor::wasAttached()
+{
+    if (m_rootPlatformLayer) {
+        Frame* frame = m_renderView-&gt;frameView()-&gt;frame();
+        if (!frame)
+            return;
+        Page* page = frame-&gt;page();
+        if (!page)
+            return;
+        page-&gt;chrome()-&gt;client()-&gt;attachRootGraphicsLayer(frame, m_rootPlatformLayer);
+        m_rootLayerAttached = true;
+    }
+}

These might both look cleaner with early returns.

+
+#define VERBOSE_COMPOSITINGLAYER    0

We usually put these at the top of the file.

+    void computeCompositingRequirements(RenderLayer*, struct CompositingState&amp; compState);
+    void rebuildCompositingLayerTree(RenderLayer* layer, struct CompositingState&amp; compState);
+

+    void removeCompositedChildren(RenderLayer* layer);
+
+    void parentInRootLayer(RenderLayer* layer);

The &quot;layer&quot; and &quot;compState&quot; parameter names are not necessary</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106155</commentid>
    <comment_count>3</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-16 18:09:49 -0800</bug_when>
    <thetext>I&apos;ll fix all these issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106814</commentid>
    <comment_count>4</comment_count>
      <attachid>26775</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-23 16:02:01 -0800</bug_when>
    <thetext>Comment on attachment 26775
Patch, changelog

Will attach new patch with stylistic changes addressed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106817</commentid>
    <comment_count>5</comment_count>
      <attachid>26986</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-23 16:22:41 -0800</bug_when>
    <thetext>Created attachment 26986
Patch, changelog</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106822</commentid>
    <comment_count>6</comment_count>
      <attachid>26988</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-23 16:25:57 -0800</bug_when>
    <thetext>Created attachment 26988
Patch, changelog</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107538</commentid>
    <comment_count>7</comment_count>
      <attachid>26988</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2009-01-29 10:21:15 -0800</bug_when>
    <thetext>Comment on attachment 26988
Patch, changelog

Looks great.  I&apos;ll be much more picky about GraphicsLayer when I see it. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107808</commentid>
    <comment_count>8</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-30 17:48:04 -0800</bug_when>
    <thetext>Committing to http://svn.webkit.org/repository/webkit/trunk ...
	M	WebCore/ChangeLog
	M	WebCore/WebCore.xcodeproj/project.pbxproj
	A	WebCore/rendering/RenderLayerBacking.cpp
	A	WebCore/rendering/RenderLayerBacking.h
	A	WebCore/rendering/RenderLayerCompositor.cpp
	A	WebCore/rendering/RenderLayerCompositor.h
Committed r40434
</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26775</attachid>
            <date>2009-01-15 16:49:06 -0800</date>
            <delta_ts>2009-01-23 16:02:21 -0800</delta_ts>
            <desc>Patch, changelog</desc>
            <filename>23357_patch.txt</filename>
            <type>text/plain</type>
            <size>104019</size>
            <attacher name="Simon Fraser (smfr)">simon.fraser</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
N2UwZmU2ZC4uNjIwNzNjNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyNSBAQAorMjAwOS0wMS0xNSAgU2ltb24gRnJhc2Vy
ICA8c2ltb24uZnJhc2VyQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MjMzNTcKKyAgICAgICAgCisgICAgICAgIE5ldyBmaWxlcyB0byBzdXBwb3J0IGFjY2VsZXJh
dGVkIGNvbXBvc2l0aW5nIGF0IHRoZSBSZW5kZXJMYXllcgorICAgICAgICBsZXZlbC4KKyAgICAg
ICAgCisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAg
ICBOZXcgZmlsZXMgYWRkZWQgdG8gcHJvamVjdC4KKyAgICAgICAgCisgICAgICAgICogcmVuZGVy
aW5nL1JlbmRlckxheWVyQmFja2luZy5jcHA6IEFkZGVkLgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJMYXllckJhY2tpbmcuaDogQWRkZWQuCisgICAgICAgIE5ldyBvYmplY3QgdG8gc3RvcmUg
Y29tcG9zaXRpbmctcmVsYXRlZCBkYXRhIGZvciBhIHNpbmdsZQorICAgICAgICBSZW5kZXJMYXll
ci4KKyAgICAgICAgCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckxheWVyQ29tcG9zaXRvci5j
cHA6IEFkZGVkLgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJMYXllckNvbXBvc2l0b3IuaDog
QWRkZWQuCisgICAgICAgIFBlci1SZW5kZXJWaWV3IGNvbnRyb2xsZXIgb2JqZWN0IGZvciBjb21w
b3NpdGluZyBoaWVyYXJjaHkKKyAgICAgICAgbWFpbnRlbmFuY2UuCisKIDIwMDktMDEtMTUgIERp
bWl0cmkgR2xhemtvdiAgPGRnbGF6a292QGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdl
ZCBieSBEYXJpbiBBZGxlci4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qIGIvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHBy
b2oKaW5kZXggNjk2ZjIwZS4uYmEzOWVkZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9XZWJDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2oKKysrIGIvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2oKQEAgLTExNyw2ICsxMTcsMTAgQEAKIAkJMEE0ODQ0OTkwQ0E0NENCMjAw
QjdCRDQ4IC8qIFNvZnRMaW5raW5nLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSAwQTQ4NDQ5ODBDQTQ0Q0IyMDBCN0JENDggLyogU29mdExpbmtpbmcuaCAq
Lzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkwRjU2MDI4
RjBFNEI3NjU4MDA2NUIwMzggLyogUmVuZGVyTWFycXVlZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY1NjAyOEQwRTRCNzY1ODAwNjVCMDM4IC8qIFJl
bmRlck1hcnF1ZWUuaCAqLzsgfTsKIAkJMEY1NjAyOTAwRTRCNzY1ODAwNjVCMDM4IC8qIFJlbmRl
ck1hcnF1ZWUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gMEY1NjAyOEUwRTRCNzY1ODAwNjVCMDM4IC8qIFJlbmRlck1hcnF1ZWUuY3BwICovOyB9Owor
CQkwRjU4MENGRDBGMTJERTlCMDA1MUQ2ODkgLyogUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRjU4MENGOTBGMTJE
RTlCMDA1MUQ2ODkgLyogUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmggKi87IH07CisJCTBGNTgwQ0ZF
MEYxMkRFOUIwMDUxRDY4OSAvKiBSZW5kZXJMYXllckNvbXBvc2l0b3IuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY1ODBDRkEwRjEyREU5QjAwNTFE
Njg5IC8qIFJlbmRlckxheWVyQ29tcG9zaXRvci5jcHAgKi87IH07CisJCTBGNTgwQ0ZGMEYxMkRF
OUIwMDUxRDY4OSAvKiBSZW5kZXJMYXllckJhY2tpbmcuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGNTgwQ0ZCMEYxMkRFOUIwMDUxRDY4OSAvKiBSZW5k
ZXJMYXllckJhY2tpbmcuaCAqLzsgfTsKKwkJMEY1ODBEMDAwRjEyREU5QjAwNTFENjg5IC8qIFJl
bmRlckxheWVyQmFja2luZy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSAwRjU4MENGQzBGMTJERTlCMDA1MUQ2ODkgLyogUmVuZGVyTGF5ZXJCYWNraW5n
LmNwcCAqLzsgfTsKIAkJMEZDNzA1MjEwRUIxODE1NjAwQjkwQUQ4IC8qIEF0b21pY1N0cmluZ0hh
c2guaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGQzcw
NTIwMEVCMTgxNTYwMEI5MEFEOCAvKiBBdG9taWNTdHJpbmdIYXNoLmggKi87IHNldHRpbmdzID0g
e0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEZENzIzODIwRUM4QkQ5MzAwQ0E1
REQ3IC8qIEZsb2F0UXVhZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gMEZENzIzODAwRUM4QkQ5MzAwQ0E1REQ3IC8qIEZsb2F0UXVhZC5oICovOyBzZXR0
aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGRDcyMzgzMEVDOEJE
OTMwMENBNURENyAvKiBGbG9hdFF1YWQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gMEZENzIzODEwRUM4QkQ5MzAwQ0E1REQ3IC8qIEZsb2F0UXVhZC5j
cHAgKi87IH07CkBAIC00OTMxLDYgKzQ5MzUsMTAgQEAKIAkJMEE0ODQ0OTgwQ0E0NENCMjAwQjdC
RDQ4IC8qIFNvZnRMaW5raW5nLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNv
ZnRMaW5raW5nLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGNTYwMjhEMEU0Qjc2
NTgwMDY1QjAzOCAvKiBSZW5kZXJNYXJxdWVlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IFJlbmRlck1hcnF1ZWUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY1
NjAyOEUwRTRCNzY1ODAwNjVCMDM4IC8qIFJlbmRlck1hcnF1ZWUuY3BwICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVyTWFycXVlZS5jcHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CisJCTBGNTgwQ0Y5MEYxMkRFOUIwMDUxRDY4OSAvKiBSZW5kZXJMYXllckNv
bXBvc2l0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVyTGF5ZXJD
b21wb3NpdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGNTgwQ0ZBMEYxMkRF
OUIwMDUxRDY4OSAvKiBSZW5kZXJMYXllckNvbXBvc2l0b3IuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmNwcDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEY1ODBDRkIwRjEyREU5QjAwNTFENjg5IC8qIFJlbmRlckxh
eWVyQmFja2luZy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBSZW5kZXJMYXll
ckJhY2tpbmcuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEY1ODBDRkMwRjEyREU5
QjAwNTFENjg5IC8qIFJlbmRlckxheWVyQmFja2luZy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IHBhdGggPSBSZW5kZXJMYXllckJhY2tpbmcuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQkwRkM3MDUyMDBFQjE4MTU2MDBCOTBBRDggLyogQXRvbWljU3RyaW5nSGFz
aC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBdG9taWNTdHJpbmdIYXNoLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRDcyMzgwMEVDOEJEOTMwMENBNURENyAv
KiBGbG9hdFF1YWQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRmxvYXRRdWFk
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRDcyMzgxMEVDOEJEOTMwMENBNURE
NyAvKiBGbG9hdFF1YWQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0g
RmxvYXRRdWFkLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTEzOTk0LDYgKzE0
MDAyLDEwIEBACiAJCQkJQkNFQTQ4MzkwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlcklubGluZS5o
ICovLAogCQkJCUJDRUE0ODNBMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJMYXllci5jcHAgKi8s
CiAJCQkJQkNFQTQ4M0IwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckxheWVyLmggKi8sCisJCQkJ
MEY1ODBDRkIwRjEyREU5QjAwNTFENjg5IC8qIFJlbmRlckxheWVyQmFja2luZy5oICovLAorCQkJ
CTBGNTgwQ0ZDMEYxMkRFOUIwMDUxRDY4OSAvKiBSZW5kZXJMYXllckJhY2tpbmcuY3BwICovLAor
CQkJCTBGNTgwQ0Y5MEYxMkRFOUIwMDUxRDY4OSAvKiBSZW5kZXJMYXllckNvbXBvc2l0b3IuaCAq
LywKKwkJCQkwRjU4MENGQTBGMTJERTlCMDA1MUQ2ODkgLyogUmVuZGVyTGF5ZXJDb21wb3NpdG9y
LmNwcCAqLywKIAkJCQlBOEVBNzNCNjBBMTkwMEUzMDBBOEVGNUYgLyogUmVuZGVyTGVnZW5kLmNw
cCAqLywKIAkJCQlBOEVBNzNCRDBBMTkwMEUzMDBBOEVGNUYgLyogUmVuZGVyTGVnZW5kLmggKi8s
CiAJCQkJQUJCNTQxOUMwQUNEREZFNDAwMjgyMEVCIC8qIFJlbmRlckxpc3RCb3guY3BwICovLApA
QCAtMTY1NDIsNiArMTY1NTQsOCBAQAogCQkJCTQ5ODM5MTUyMEYxRTc2QjQwMEMyMzc4MiAvKiBE
T01XZWJLaXRDU1NNYXRyaXhJbnRlcm5hbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNDk4MzkxNTkw
RjFFNzc2OTAwQzIzNzgyIC8qIFdlYktpdENTU01hdHJpeC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJ
NDk4MzkxNjQwRjFFOEVFMTAwQzIzNzgyIC8qIEpTV2ViS2l0Q1NTTWF0cml4Q29uc3RydWN0b3Iu
aCBpbiBIZWFkZXJzICovLAorCQkJCTBGNTgwQ0ZEMEYxMkRFOUIwMDUxRDY4OSAvKiBSZW5kZXJM
YXllckNvbXBvc2l0b3IuaCBpbiBIZWFkZXJzICovLAorCQkJCTBGNTgwQ0ZGMEYxMkRFOUIwMDUx
RDY4OSAvKiBSZW5kZXJMYXllckJhY2tpbmcuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1
bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMTg1MDEsNiAr
MTg1MTUsOCBAQAogCQkJCTQ5ODM5MTUxMEYxRTc2QjQwMEMyMzc4MiAvKiBET01XZWJLaXRDU1NN
YXRyaXgubW0gaW4gU291cmNlcyAqLywKIAkJCQk0OTgzOTE1ODBGMUU3NzY5MDBDMjM3ODIgLyog
V2ViS2l0Q1NTTWF0cml4LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTQ5ODM5MTYzMEYxRThFRTEw
MEMyMzc4MiAvKiBKU1dlYktpdENTU01hdHJpeENvbnN0cnVjdG9yLmNwcCBpbiBTb3VyY2VzICov
LAorCQkJCTBGNTgwQ0ZFMEYxMkRFOUIwMDUxRDY4OSAvKiBSZW5kZXJMYXllckNvbXBvc2l0b3Iu
Y3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMEY1ODBEMDAwRjEyREU5QjAwNTFENjg5IC8qIFJlbmRl
ckxheWVyQmFja2luZy5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVw
bG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5jcHAgYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJM
YXllckJhY2tpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NDFk
ODgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllckJhY2tp
bmcuY3BwCkBAIC0wLDAgKzEsMTI3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YK
KyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgor
ICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJBbmltYXRpb25Db250cm9sbGVyLmgiCisj
aW5jbHVkZSAiQ1NTU3R5bGVTZWxlY3Rvci5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2lu
Y2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXIuaCIKKyNp
bmNsdWRlICJIaXRUZXN0UmVxdWVzdC5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKKyNp
bmNsdWRlICJIVE1MTmFtZXMuaCIKKyNpbmNsdWRlICJSZW5kZXJJbWFnZS5oIgorI2luY2x1ZGUg
IlJlbmRlckxheWVyQ29tcG9zaXRvci5oIgorI2luY2x1ZGUgIlJlbmRlclZpZGVvLmgiCisjaW5j
bHVkZSAiUmVuZGVyVmlldy5oIgorCisjaW5jbHVkZSAiUmVuZGVyTGF5ZXJCYWNraW5nLmgiCisK
K3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RydWN0IExh
eWVySGl0VGVzdERhdGEgeworICAgIExheWVySGl0VGVzdERhdGEoUmVuZGVyTGF5ZXIqIGluUm9v
dExheWVyLCBjb25zdCBIaXRUZXN0UmVxdWVzdCYgaW5SZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiBp
blJlc3VsdCwgY29uc3QgSW50UmVjdCYgaGl0VGVzdFJlY3QpCisgICAgOiBtX3Jvb3RMYXllcihp
blJvb3RMYXllcikKKyAgICAsIG1fcmVxdWVzdChpblJlcXVlc3QpCisgICAgLCBtX2hpdFRlc3RS
ZWN0KGhpdFRlc3RSZWN0KQorICAgICwgbV9yZXN1bHQoaW5SZXN1bHQpCisgICAgeworICAgIH0K
KyAgICAKKyAgICBSZW5kZXJMYXllciogbV9yb290TGF5ZXI7CisgICAgY29uc3QgSGl0VGVzdFJl
cXVlc3QmIG1fcmVxdWVzdDsKKyAgICBjb25zdCBJbnRSZWN0JiBtX2hpdFRlc3RSZWN0OworICAg
IEhpdFRlc3RSZXN1bHQmIG1fcmVzdWx0OworfTsKKworCitSZW5kZXJMYXllckJhY2tpbmc6OlJl
bmRlckxheWVyQmFja2luZyhSZW5kZXJMYXllciogbGF5ZXIpCisgICAgOiBtX293bmluZ0xheWVy
KGxheWVyKQorICAgICwgbV9hbmNlc3RvckNsaXBwaW5nTGF5ZXIoMCkKKyAgICAsIG1fZ3JhcGhp
Y3NMYXllcigwKQorICAgICwgbV9jb250ZW50c0xheWVyKDApCisgICAgLCBtX2NsaXBwaW5nTGF5
ZXIoMCkKKyAgICAsIG1fZm9yY2VDb21wb3NpdGluZ0xheWVyKGZhbHNlKQorICAgICwgbV9pc1Np
bXBsZUNvbnRhaW5lckNvbXBvc2l0aW5nTGF5ZXIoZmFsc2UpCisgICAgLCBtX3NpbXBsZUNvbXBv
c2l0aW5nTGF5ZXJTdGF0dXNEaXJ0eSh0cnVlKQorICAgICwgbV9jb21wb3NpdGluZ0NvbnRlbnRP
ZmZzZXREaXJ0eSh0cnVlKQoreworICAgIGNyZWF0ZUdyYXBoaWNzTGF5ZXIoKTsKK30KKworUmVu
ZGVyTGF5ZXJCYWNraW5nOjp+UmVuZGVyTGF5ZXJCYWNraW5nKCkKK3sKKyAgICB1cGRhdGVDbGlw
cGluZ0xheWVycyhmYWxzZSwgZmFsc2UpOworICAgIHVwZGF0ZUNvbnRlbnRzTGF5ZXIoZmFsc2Up
OworICAgIGRlc3Ryb3lHcmFwaGljc0xheWVyKCk7Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJCYWNr
aW5nOjpjcmVhdGVHcmFwaGljc0xheWVyKCkKK3sKKyAgICBtX2dyYXBoaWNzTGF5ZXIgPSBHcmFw
aGljc0xheWVyOjpjcmVhdGVHcmFwaGljc0xheWVyKHRoaXMpOworICAgIAorI2lmbmRlZiBOREVC
VUcKKyAgICBpZiAocmVuZGVyZXIoKS0+bm9kZSgpLT5pc0RvY3VtZW50Tm9kZSgpKQorICAgICAg
ICBtX2dyYXBoaWNzTGF5ZXItPnNldE5hbWUoIkRvY3VtZW50IE5vZGUiKTsKKyAgICBlbHNlIHsK
KyAgICAgICAgaWYgKHJlbmRlcmVyKCktPm5vZGUoKS0+aXNIVE1MRWxlbWVudCgpICYmIHJlbmRl
cmVyKCktPm5vZGUoKS0+aGFzSUQoKSkKKyAgICAgICAgICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0
TmFtZShyZW5kZXJlcigpLT5yZW5kZXJOYW1lKCkgKyBTdHJpbmcoIiAiKSArICgoSFRNTEVsZW1l
bnQqKXJlbmRlcmVyKCktPm5vZGUoKSktPmlkKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBtX2dyYXBoaWNzTGF5ZXItPnNldE5hbWUocmVuZGVyZXIoKS0+cmVuZGVyTmFtZSgpKTsKKyAg
ICB9CisjZW5kaWYgIC8vIE5ERUJVRworCisgICAgdXBkYXRlTGF5ZXJPcGFjaXR5KCk7CisgICAg
dXBkYXRlTGF5ZXJUcmFuc2Zvcm0oKTsKK30KKwordm9pZCBSZW5kZXJMYXllckJhY2tpbmc6OmRl
c3Ryb3lHcmFwaGljc0xheWVyKCkKK3sKKyAgICBpZiAobV9ncmFwaGljc0xheWVyKQorICAgICAg
ICBtX2dyYXBoaWNzTGF5ZXItPnJlbW92ZUZyb21QYXJlbnQoKTsKKworICAgIGRlbGV0ZSBtX2dy
YXBoaWNzTGF5ZXI7CisgICAgbV9ncmFwaGljc0xheWVyID0gMDsKKworICAgIGRlbGV0ZSBtX2Nv
bnRlbnRzTGF5ZXI7CisgICAgbV9jb250ZW50c0xheWVyID0gMDsKKworICAgIGRlbGV0ZSBtX2Ns
aXBwaW5nTGF5ZXI7CisgICAgbV9jbGlwcGluZ0xheWVyID0gMDsKK30KKwordm9pZCBSZW5kZXJM
YXllckJhY2tpbmc6OnVwZGF0ZUxheWVyT3BhY2l0eSgpCit7CisgICAgbV9ncmFwaGljc0xheWVy
LT5zZXRPcGFjaXR5KGNvbXBvc2l0aW5nT3BhY2l0eShyZW5kZXJlcigpLT5vcGFjaXR5KCkpLCAw
LCAwKTsKK30KKwordm9pZCBSZW5kZXJMYXllckJhY2tpbmc6OnVwZGF0ZUxheWVyVHJhbnNmb3Jt
KCkKK3sKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSByZW5kZXJlcigpLT5zdHlsZSgpOworICAg
IGNvbnN0IEludFJlY3QgYm9yZGVyQm94ID0gcmVuZGVyZXIoKS0+Ym9yZGVyQm94KCk7CisKKyAg
ICAvLyBGSVhNRTogVGhpcyBzaG91bGQgdXNlIG1fb3duaW5nTGF5ZXItPnRyYW5zZm9ybSgpLCBi
dXQgdGhhdCBjdXJyZW50bHkgaGFzIHRyYW5zZm9ybS1vcmlnaW4KKyAgICAvLyBiYWtlZCBpbnRv
IGl0LCBhbmQgd2UgZG9uJ3Qgd2FudCB0aGF0LgorICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHQ7
CisgICAgc3R5bGUtPmFwcGx5VHJhbnNmb3JtKHQsIGJvcmRlckJveC5zaXplKCksIGZhbHNlKTsK
KworICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0VHJhbnNmb3JtKHQpOworfQorCit2b2lkIFJlbmRl
ckxheWVyQmFja2luZzo6dXBkYXRlQWZ0ZXJMYXlvdXQoKQoreworICAgIGludmFsaWRhdGVEcmF3
aW5nT3B0aW1pemF0aW9ucygpOworICAgIGRldGVjdERyYXdpbmdPcHRpbWl6YXRpb25zKCk7CisK
KyAgICB1cGRhdGVHcmFwaGljc0xheWVyR2VvbWV0cnkoKTsKK30KKworYm9vbCBSZW5kZXJMYXll
ckJhY2tpbmc6OnVwZGF0ZUdyYXBoaWNzTGF5ZXJzKGJvb2wgbmVlZHNDb250ZW50c0xheWVyLCBi
b29sIG5lZWRzVXBwZXJDbGlwcGluZ0xheWVyLCBib29sIG5lZWRzTG93ZXJDbGlwcGluZ0xheWVy
LCBib29sIG5lZWRzUmVwYWludCkKK3sKKyAgICBib29sIGxheWVyQ29uZmlnQ2hhbmdlZCA9IGZh
bHNlOworICAgIGlmICh1cGRhdGVDb250ZW50c0xheWVyKG5lZWRzQ29udGVudHNMYXllcikpCisg
ICAgICAgIGxheWVyQ29uZmlnQ2hhbmdlZCA9IHRydWU7CisgICAgCisgICAgaWYgKHVwZGF0ZUNs
aXBwaW5nTGF5ZXJzKG5lZWRzVXBwZXJDbGlwcGluZ0xheWVyLCBuZWVkc0xvd2VyQ2xpcHBpbmdM
YXllcikpCisgICAgICAgIGxheWVyQ29uZmlnQ2hhbmdlZCA9IHRydWU7CisKKyAgICAvLyBTZWUg
aWYgd2UgY2FuIG5vdyB1c2UgYW55IGRyYXdpbmcgb3B0aW1pemF0aW9ucy4KKyAgICBib29sIGRp
ZERyYXdDb250ZW50ID0gZ3JhcGhpY3NMYXllcigpLT5kcmF3c0NvbnRlbnQoKTsKKyAgICBpbnZh
bGlkYXRlRHJhd2luZ09wdGltaXphdGlvbnMoKTsKKyAgICBkZXRlY3REcmF3aW5nT3B0aW1pemF0
aW9ucygpOworICAgIGlmICghZGlkRHJhd0NvbnRlbnQgJiYgZ3JhcGhpY3NMYXllcigpLT5kcmF3
c0NvbnRlbnQoKSkKKyAgICAgICAgbmVlZHNSZXBhaW50ID0gdHJ1ZTsKKworICAgIC8vIFNldCBv
cGFjaXR5LCBpZiBpdCBpcyBub3QgYW5pbWF0aW5nLgorICAgIGlmICghcmVuZGVyZXIoKS0+YW5p
bWF0aW9uKCktPmlzQW5pbWF0aW5nUHJvcGVydHlPblJlbmRlcmVyKHJlbmRlcmVyKCksIENTU1By
b3BlcnR5T3BhY2l0eSkpCisgICAgICAgIHVwZGF0ZUxheWVyT3BhY2l0eSgpOworICAgIAorICAg
IC8vIFNldCB0cmFuc2Zvcm0gcHJvcGVydHksIGlmIGl0IGlzIG5vdCBhbmltYXRpbmcuCisgICAg
aWYgKCFyZW5kZXJlcigpLT5hbmltYXRpb24oKS0+aXNBbmltYXRpbmdQcm9wZXJ0eU9uUmVuZGVy
ZXIocmVuZGVyZXIoKSwgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm0pKQorICAgICAgICB1cGRh
dGVMYXllclRyYW5zZm9ybSgpOworICAgIAorICAgIHVwZGF0ZUdyYXBoaWNzTGF5ZXJHZW9tZXRy
eSgpOworICAgIAorICAgIG1fZ3JhcGhpY3NMYXllci0+dXBkYXRlQ29udGVudHNSZWN0KCk7Cisg
ICAgCisgICAgaWYgKG5lZWRzUmVwYWludCkgeworICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPnNl
dE5lZWRzRGlzcGxheSgpOworICAgICAgICBpZiAobV9jb250ZW50c0xheWVyKQorICAgICAgICAg
ICAgbV9jb250ZW50c0xheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKKyAgICB9CisgICAgCisgICAg
cmV0dXJuIGxheWVyQ29uZmlnQ2hhbmdlZDsKK30KKwordm9pZCBSZW5kZXJMYXllckJhY2tpbmc6
OnVwZGF0ZUdyYXBoaWNzTGF5ZXJHZW9tZXRyeSgpCit7CisgICAgLy8gSWYgd2UgaGF2ZW4ndCBi
dWlsdCB6LW9yZGVyIGxpc3RzIHlldCwgd2FpdCB1bnRpbCBsYXRlci4KKyAgICBpZiAobV9vd25p
bmdMYXllci0+aXNTdGFja2luZ0NvbnRleHQoKSAmJiBtX293bmluZ0xheWVyLT5tX3pPcmRlckxp
c3RzRGlydHkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fY29tcG9zaXRpbmdDb250ZW50T2Zm
c2V0RGlydHkgPSB0cnVlOworICAgIAorICAgIFJlbmRlckxheWVyKiBjb21wQW5jZXN0b3IgPSBj
b21wb3NpdG9yKCktPmVuY2xvc2luZ0NvbXBvc2l0aW5nTGF5ZXIobV9vd25pbmdMYXllciwgZmFs
c2UpOworICAgIEludFJlY3QgYW5jZXN0b3JDb21wb3NpdGluZ0JvdW5kczsKKworICAgIGNvbnN0
IFJlbmRlckxheWVyKiByb290TGF5ZXIgPSBtX293bmluZ0xheWVyLT5yb290KCk7CisgICAgCisg
ICAgLy8gRklYTUU6IG9wdGltaXplIGNhbGN1bGF0ZUNvbXBvc2l0ZWRCb3VuZHMgY2FsbHMuIFRv
byBtYW55IGNvb3JkIGNvbnZlcnNpb25zIGluIHRoaXMgY29kZS4KKyAgICBpZiAoY29tcEFuY2Vz
dG9yKQorICAgICAgICBhbmNlc3RvckNvbXBvc2l0aW5nQm91bmRzID0gY29tcG9zaXRvcigpLT5j
YWxjdWxhdGVDb21wb3NpdGVkQm91bmRzKGNvbXBBbmNlc3Rvciwgcm9vdExheWVyKTsKKyAgICAK
KyAgICBJbnRSZWN0IGNvbXBvc2l0aW5nQm91bmRzID0gY29tcG9zaXRvcigpLT5jYWxjdWxhdGVD
b21wb3NpdGVkQm91bmRzKG1fb3duaW5nTGF5ZXIsIHJvb3RMYXllcik7CisKKyAgICBpZiAoY29t
cEFuY2VzdG9yICYmIG1fYW5jZXN0b3JDbGlwcGluZ0xheWVyKSB7CisgICAgICAgIEludFJlY3Qg
Y2xpcHBpbmdMYXllckNvbnRlbnRCb3g7CisgICAgICAgIC8vIENhbGwgY2FsY3VsYXRlUmVjdHMg
dG8gZ2V0IHRoZSBiYWNrZ3JvdW5kUmVjdCB3aGljaCBpcyB3aGF0IGlzIHVzZWQgdG8gY2xpcCB0
aGUgY29udGVudHMgb2YgdGhpcworICAgICAgICAvLyBsYXllci4gTm90ZSB0aGF0IHdlIGNhbGwg
aXQgd2l0aCB0ZW1wb3JhcnlDbGlwUmVjdHM9dHJ1ZSBiZWNhdXNlIG5vcm1hbGx5IHdoZW4gY29t
cHV0aW5nIGNsaXAgcmVjdHMKKyAgICAgICAgLy8gZm9yIGEgY29tcG9zaXRpbmcgbGF5ZXIsIHJv
b3RMYXllciBpcyB0aGUgbGF5ZXIgaXRzZWxmLgorICAgICAgICBJbnRSZWN0IGluZmluaXRlUmVj
dChJTlRfTUlOLzIsIElOVF9NSU4vMiwgSU5UX01BWCwgSU5UX01BWCk7CisgICAgICAgIEludFJl
Y3QgbGF5ZXJCb3VuZHMsIGJhY2tncm91bmRSZWN0LCBmb3JlZ3JvdW5kUmVjdCwgb3V0bGluZVJl
Y3Q7CisgICAgICAgIG1fb3duaW5nTGF5ZXItPmNhbGN1bGF0ZVJlY3RzKGNvbXBBbmNlc3Rvciwg
aW5maW5pdGVSZWN0LCBsYXllckJvdW5kcywgYmFja2dyb3VuZFJlY3QsIGZvcmVncm91bmRSZWN0
LCBvdXRsaW5lUmVjdCwgdHJ1ZSk7CisgICAgICAgIC8vIEZJWE1FOiBpZiB0aGUgbGF5ZXIgdGhh
dCBpcyBjbGlwcGluZyBoYXMgYSB0cmFuc2Zvcm0sIHRoaXMgZG9lcyBub3Qgd29yayBjb3JyZWN0
bHkuCisgICAgICAgIGNsaXBwaW5nTGF5ZXJDb250ZW50Qm94ID0gYmFja2dyb3VuZFJlY3Q7Cisg
ICAgICAgIAorICAgICAgICBpbnQgYWJzWCA9IDAsIGFic1kgPSAwOworICAgICAgICBjb21wQW5j
ZXN0b3ItPmNvbnZlcnRUb0xheWVyQ29vcmRzKHJvb3RMYXllciwgYWJzWCwgYWJzWSk7CisgICAg
ICAgIGNsaXBwaW5nTGF5ZXJDb250ZW50Qm94Lm1vdmUoYWJzWCwgYWJzWSk7CisKKyAgICAgICAg
Ly8gUG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGNvbXBBbmNlc3RvcgorICAgICAgICBpZiAoY29t
cEFuY2VzdG9yLT5iYWNraW5nKCktPmhhc0NsaXBwaW5nTGF5ZXIoKSkgeworICAgICAgICAgICAg
SW50UmVjdCBwYXJlbnRDbGlwcGluZ0JveCA9IGNvbXBBbmNlc3Rvci0+cmVuZGVyZXIoKS0+Z2V0
T3ZlcmZsb3dDbGlwUmVjdChhYnNYLCBhYnNZKTsKKyAgICAgICAgICAgIG1fYW5jZXN0b3JDbGlw
cGluZ0xheWVyLT5zZXRQb3NpdGlvbihGbG9hdFBvaW50KCkgKyAoY2xpcHBpbmdMYXllckNvbnRl
bnRCb3gubG9jYXRpb24oKSAtIHBhcmVudENsaXBwaW5nQm94LmxvY2F0aW9uKCkpKTsKKyAgICAg
ICAgfSBlbHNlCisgICAgICAgICAgICBtX2FuY2VzdG9yQ2xpcHBpbmdMYXllci0+c2V0UG9zaXRp
b24oRmxvYXRQb2ludCgpICsgKGNsaXBwaW5nTGF5ZXJDb250ZW50Qm94LmxvY2F0aW9uKCkgLSBh
bmNlc3RvckNvbXBvc2l0aW5nQm91bmRzLmxvY2F0aW9uKCkpKTsKKworICAgICAgICBtX2FuY2Vz
dG9yQ2xpcHBpbmdMYXllci0+c2V0U2l6ZShjbGlwcGluZ0xheWVyQ29udGVudEJveC5zaXplKCkp
OworCisgICAgICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0UG9zaXRpb24oRmxvYXRQb2ludCgpICsg
KGNvbXBvc2l0aW5nQm91bmRzLmxvY2F0aW9uKCkgLSBjbGlwcGluZ0xheWVyQ29udGVudEJveC5s
b2NhdGlvbigpKSk7CisgICAgfSBlbHNlIGlmIChjb21wQW5jZXN0b3IgJiYgY29tcEFuY2VzdG9y
LT5iYWNraW5nKCktPmhhc0NsaXBwaW5nTGF5ZXIoKSkgeworICAgICAgICAvLyBUaGUgY2xpcHBp
bmcgbGF5ZXIgaXMgdGhlIHNpemUgb2YgdGhlIGFuY2VzdG9yJ3Mgb3ZlcmZsb3dDbGlwUmVjdCwg
c28gYWNjb3VudCBmb3IKKyAgICAgICAgLy8gaXRzIG9mZnNldCBpbiBpdHMgY29udGFpbmluZyBs
YXllci4KKyAgICAgICAgaW50IGFic1ggPSAwLCBhYnNZID0gMDsKKyAgICAgICAgY29tcEFuY2Vz
dG9yLT5jb252ZXJ0VG9MYXllckNvb3Jkcyhyb290TGF5ZXIsIGFic1gsIGFic1kpOworICAgICAg
ICBJbnRSZWN0IGNsaXBwaW5nTGF5ZXJDb250ZW50Qm94ID0gY29tcEFuY2VzdG9yLT5yZW5kZXJl
cigpLT5nZXRPdmVyZmxvd0NsaXBSZWN0KGFic1gsIGFic1kpOworCisgICAgICAgIG1fZ3JhcGhp
Y3NMYXllci0+c2V0UG9zaXRpb24oRmxvYXRQb2ludCgpICsgKGNvbXBvc2l0aW5nQm91bmRzLmxv
Y2F0aW9uKCkgLSBjbGlwcGluZ0xheWVyQ29udGVudEJveC5sb2NhdGlvbigpKSk7CisgICAgfSBl
bHNlCisgICAgICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0UG9zaXRpb24oRmxvYXRQb2ludCgpICsg
KGNvbXBvc2l0aW5nQm91bmRzLmxvY2F0aW9uKCkgLSBhbmNlc3RvckNvbXBvc2l0aW5nQm91bmRz
LmxvY2F0aW9uKCkpKTsKKyAgICAKKyAgICBGbG9hdFNpemUgb2xkU2l6ZSA9IG1fZ3JhcGhpY3NM
YXllci0+c2l6ZSgpOworICAgIEZsb2F0U2l6ZSBuZXdTaXplKGNvbXBvc2l0aW5nQm91bmRzLnNp
emUoKSk7CisgICAgaWYgKG9sZFNpemUgIT0gbmV3U2l6ZSkgeworICAgICAgICBtX2dyYXBoaWNz
TGF5ZXItPnNldFNpemUobmV3U2l6ZSk7CisgICAgICAgIC8vIEEgYm91bmRzIGNoYW5nZSB3aWxs
IGFsbW9zdCBhbHdheXMgcmVxdWlyZSByZWRpc3BsYXkuIFVzdWFsbHkgdGhhdCByZWRpc3BsYXkK
KyAgICAgICAgLy8gd2lsbCBoYXBwZW4gYmVjYXVzZSBvZiBhIHJlcGFpbnQgZWxzZXdoZXJlLCBi
dXQgbm90IGFsd2F5czoKKyAgICAgICAgLy8gZS5nLiBzZWUgUmVuZGVyVmlldzo6c2V0TWF4aW1h
bE91dGxpbmVTaXplKCkKKyAgICAgICAgbV9ncmFwaGljc0xheWVyLT5zZXROZWVkc0Rpc3BsYXko
KTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBoYXZlIGEgbGF5ZXIgdGhhdCBjbGlwcyBjaGlsZHJl
biwgcG9zaXRpb24gaXQuCisgICAgaWYgKG1fY2xpcHBpbmdMYXllcikgeworICAgICAgICBpbnQg
YWJzWCA9IDAsIGFic1kgPSAwOworICAgICAgICBtX293bmluZ0xheWVyLT5jb252ZXJ0VG9MYXll
ckNvb3Jkcyhyb290TGF5ZXIsIGFic1gsIGFic1kpOworICAgICAgICBJbnRSZWN0IGNsaXBwaW5n
TGF5ZXJDb250ZW50Qm94ID0gcmVuZGVyZXIoKS0+Z2V0T3ZlcmZsb3dDbGlwUmVjdChhYnNYLCBh
YnNZKTsKKyAgICAgICAgCisgICAgICAgIG1fY2xpcHBpbmdMYXllci0+c2V0UG9zaXRpb24oRmxv
YXRQb2ludCgpICsgKGNsaXBwaW5nTGF5ZXJDb250ZW50Qm94LmxvY2F0aW9uKCkgLSBjb21wb3Np
dGluZ0JvdW5kcy5sb2NhdGlvbigpKSk7CisgICAgICAgIG1fY2xpcHBpbmdMYXllci0+c2V0U2l6
ZShjbGlwcGluZ0xheWVyQ29udGVudEJveC5zaXplKCkpOworICAgIH0KKyAgICAKKyAgICBJbnRS
ZWN0IGxheWVyQm91bmRzID0gSW50UmVjdChtX293bmluZ0xheWVyLT54UG9zKCksIG1fb3duaW5n
TGF5ZXItPnlQb3MoKSwgcmVuZGVyZXIoKS0+d2lkdGgoKSwgcmVuZGVyZXIoKS0+aGVpZ2h0KCkp
OworCisgICAgLy8gQ29udmVydCB0byBhYnNvbHV0ZSBjb29yZHMgdG8gbWF0Y2ggYmJveC4KKyAg
ICBpbnQgYWJzWCA9IDAsIGFic1kgPSAwOworICAgIG1fb3duaW5nTGF5ZXItPmNvbnZlcnRUb0xh
eWVyQ29vcmRzKHJvb3RMYXllciwgYWJzWCwgYWJzWSk7CisgICAgbGF5ZXJCb3VuZHMubW92ZShh
YnNYIC0gbV9vd25pbmdMYXllci0+eFBvcygpLCBhYnNZIC0gbV9vd25pbmdMYXllci0+eVBvcygp
KTsKKworICAgIC8vIFVwZGF0ZSBwcm9wZXJ0aWVzIHRoYXQgZGVwZW5kIG9uIGxheWVyIGRpbWVu
c2lvbnMKKyAgICBjb25zdCBJbnRSZWN0IGJvcmRlckJveCA9IHJlbmRlcmVyKCktPmJvcmRlckJv
eCgpOworCisgICAgRmxvYXRQb2ludDNEIHRyYW5zZm9ybU9yaWdpbiA9IGNvbXB1dGVUcmFuc2Zv
cm1PcmlnaW4oYm9yZGVyQm94KTsKKyAgICAvLyBDb21wdXRlIHRoZSBhbmNob3IgcG9pbnQsIHdo
aWNoIGlzIGluIHRoZSBjZW50ZXIgb2YgdGhlIHJlbmRlcmVyIGJveCB1bmxlc3MgdHJhbnNmb3Jt
LW9yaWdpbiBpcyBzZXQuCisgICAgRmxvYXRQb2ludCAgYW5jaG9yKGNvbXBvc2l0aW5nQm91bmRz
LndpZHRoKCkgICE9IDAuMGYgPyAoKGxheWVyQm91bmRzLngoKSAtIGNvbXBvc2l0aW5nQm91bmRz
LngoKSkgKyB0cmFuc2Zvcm1PcmlnaW4ueCgpKSAvIGNvbXBvc2l0aW5nQm91bmRzLndpZHRoKCkg
IDogMC41ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpbmdCb3VuZHMuaGVpZ2h0
KCkgIT0gMC4wZiA/ICgobGF5ZXJCb3VuZHMueSgpIC0gY29tcG9zaXRpbmdCb3VuZHMueSgpKSAr
IHRyYW5zZm9ybU9yaWdpbi55KCkpIC8gY29tcG9zaXRpbmdCb3VuZHMuaGVpZ2h0KCkgOiAwLjVm
KTsKKyAgICBtX2dyYXBoaWNzTGF5ZXItPnNldEFuY2hvclBvaW50KGFuY2hvciwgdHJhbnNmb3Jt
T3JpZ2luLnooKSk7CisKKyAgICBpZiAobV9jb250ZW50c0xheWVyKSB7CisgICAgICAgIG1fY29u
dGVudHNMYXllci0+c2V0UG9zaXRpb24oSW50UG9pbnQoMCwgMCkpOworICAgICAgICBtX2NvbnRl
bnRzTGF5ZXItPnNldFNpemUobmV3U2l6ZSk7CisgICAgfQorCisgICAgbV9ncmFwaGljc0xheWVy
LT51cGRhdGVDb250ZW50c1JlY3QoKTsKK30KKwordm9pZCBSZW5kZXJMYXllckJhY2tpbmc6OnVw
ZGF0ZUludGVybmFsSGllcmFyY2h5KCkKK3sKKyAgICAvLyBtX2NvbnRlbnRzTGF5ZXIgaGFzIHRv
IGJlIGluc2VydGVkIGluIHRoZSBjb3JyZWN0IG9yZGVyIHdpdGggY2hpbGQgbGF5ZXJzLAorICAg
IC8vIHNvIGl0J3Mgbm90IGluc2VydGVkIGhlcmUuCisgICAgaWYgKG1fYW5jZXN0b3JDbGlwcGlu
Z0xheWVyKSB7CisgICAgICAgIG1fYW5jZXN0b3JDbGlwcGluZ0xheWVyLT5yZW1vdmVBbGxDaGls
ZHJlbigpOworICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPnJlbW92ZUZyb21QYXJlbnQoKTsKKyAg
ICAgICAgbV9hbmNlc3RvckNsaXBwaW5nTGF5ZXItPmFkZENoaWxkKG1fZ3JhcGhpY3NMYXllcik7
CisgICAgfQorCisgICAgaWYgKG1fY2xpcHBpbmdMYXllcikgeworICAgICAgICBtX2NsaXBwaW5n
TGF5ZXItPnJlbW92ZUZyb21QYXJlbnQoKTsKKyAgICAgICAgbV9ncmFwaGljc0xheWVyLT5hZGRD
aGlsZChtX2NsaXBwaW5nTGF5ZXIpOworICAgIH0KK30KKworLy8gUmV0dXJuIHRydWUgaWYgdGhl
IGxheWVycyBjaGFuZ2VkLgorYm9vbCBSZW5kZXJMYXllckJhY2tpbmc6OnVwZGF0ZUNsaXBwaW5n
TGF5ZXJzKGJvb2wgbmVlZHNBbmNlc3RvckNsaXAsIGJvb2wgbmVlZHNEZXNjZW5kYW50Q2xpcCkK
K3sKKyAgICBib29sIGxheWVyc0NoYW5nZWQgPSBmYWxzZTsKKworICAgIGlmIChuZWVkc0FuY2Vz
dG9yQ2xpcCkgeworICAgICAgICBpZiAoIW1fYW5jZXN0b3JDbGlwcGluZ0xheWVyKSB7CisgICAg
ICAgICAgICBtX2FuY2VzdG9yQ2xpcHBpbmdMYXllciA9IEdyYXBoaWNzTGF5ZXI6OmNyZWF0ZUdy
YXBoaWNzTGF5ZXIoMCk7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAgbV9hbmNlc3RvckNs
aXBwaW5nTGF5ZXItPnNldE5hbWUoIkFuY2VzdG9yIGNsaXBwaW5nIExheWVyIik7CisjZW5kaWYK
KyAgICAgICAgICAgIG1fYW5jZXN0b3JDbGlwcGluZ0xheWVyLT5zZXRNYXNrc1RvQm91bmRzKHRy
dWUpOworICAgICAgICAgICAgbGF5ZXJzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9
IGVsc2UgaWYgKG1fYW5jZXN0b3JDbGlwcGluZ0xheWVyKSB7CisgICAgICAgIG1fYW5jZXN0b3JD
bGlwcGluZ0xheWVyLT5yZW1vdmVGcm9tUGFyZW50KCk7CisgICAgICAgIGRlbGV0ZSBtX2FuY2Vz
dG9yQ2xpcHBpbmdMYXllcjsKKyAgICAgICAgbV9hbmNlc3RvckNsaXBwaW5nTGF5ZXIgPSAwOwor
ICAgICAgICBsYXllcnNDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgaWYgKG5lZWRz
RGVzY2VuZGFudENsaXApIHsKKyAgICAgICAgaWYgKCFtX2NsaXBwaW5nTGF5ZXIpIHsKKyAgICAg
ICAgICAgIG1fY2xpcHBpbmdMYXllciA9IEdyYXBoaWNzTGF5ZXI6OmNyZWF0ZUdyYXBoaWNzTGF5
ZXIoMCk7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAgbV9jbGlwcGluZ0xheWVyLT5zZXRO
YW1lKCJDaGlsZCBjbGlwcGluZyBMYXllciIpOworI2VuZGlmCisgICAgICAgICAgICBtX2NsaXBw
aW5nTGF5ZXItPnNldE1hc2tzVG9Cb3VuZHModHJ1ZSk7CisgICAgICAgICAgICBsYXllcnNDaGFu
Z2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobV9jbGlwcGluZ0xheWVyKSB7
CisgICAgICAgIG1fY2xpcHBpbmdMYXllci0+cmVtb3ZlRnJvbVBhcmVudCgpOworICAgICAgICBk
ZWxldGUgbV9jbGlwcGluZ0xheWVyOworICAgICAgICBtX2NsaXBwaW5nTGF5ZXIgPSAwOworICAg
ICAgICBsYXllcnNDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgaWYgKGxheWVyc0No
YW5nZWQpCisgICAgICAgIHVwZGF0ZUludGVybmFsSGllcmFyY2h5KCk7CisKKyAgICByZXR1cm4g
bGF5ZXJzQ2hhbmdlZDsKK30KKworYm9vbCBSZW5kZXJMYXllckJhY2tpbmc6OnVwZGF0ZUNvbnRl
bnRzTGF5ZXIoYm9vbCBuZWVkc0NvbnRlbnRzTGF5ZXIpCit7CisgICAgYm9vbCBsYXllckNoYW5n
ZWQgPSBmYWxzZTsKKyAgICBpZiAobmVlZHNDb250ZW50c0xheWVyKSB7CisgICAgICAgIGlmICgh
bV9jb250ZW50c0xheWVyKSB7CisgICAgICAgICAgICBtX2NvbnRlbnRzTGF5ZXIgPSBHcmFwaGlj
c0xheWVyOjpjcmVhdGVHcmFwaGljc0xheWVyKHRoaXMpOworI2lmbmRlZiBOREVCVUcKKyAgICAg
ICAgICAgIG1fY29udGVudHNMYXllci0+c2V0TmFtZSgiQ29udGVudHMiKTsKKyNlbmRpZgorICAg
ICAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXREcmF3c0NvbnRlbnQodHJ1ZSk7CisgICAgICAg
ICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldERyYXdpbmdQaGFzZShHcmFwaGljc0xheWVyUGFpbnRG
b3JlZ3JvdW5kTWFzayk7CisgICAgICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPnNldERyYXdpbmdQ
aGFzZShHcmFwaGljc0xheWVyUGFpbnRCYWNrZ3JvdW5kTWFzayk7CisgICAgICAgICAgICBsYXll
ckNoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtX2NvbnRlbnRzTGF5
ZXIpIHsKKyAgICAgICAgbV9jb250ZW50c0xheWVyLT5yZW1vdmVGcm9tUGFyZW50KCk7CisgICAg
ICAgIGRlbGV0ZSBtX2NvbnRlbnRzTGF5ZXI7CisgICAgICAgIG1fY29udGVudHNMYXllciA9IDA7
CisgICAgICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0RHJhd2luZ1BoYXNlKEdyYXBoaWNzTGF5ZXJQ
YWludEFsbE1hc2spOworICAgICAgICBsYXllckNoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgICBy
ZXR1cm4gbGF5ZXJDaGFuZ2VkOworfQorCitmbG9hdCBSZW5kZXJMYXllckJhY2tpbmc6OmNvbXBv
c2l0aW5nT3BhY2l0eShmbG9hdCByZW5kZXJlck9wYWNpdHkpIGNvbnN0Cit7CisgICAgZmxvYXQg
ZmluYWxPcGFjaXR5ID0gcmVuZGVyZXJPcGFjaXR5OworICAgIAorICAgIGZvciAoUmVuZGVyTGF5
ZXIqIGN1cnIgPSBtX293bmluZ0xheWVyLT5wYXJlbnQoKTsgY3VyciAhPSAwOyBjdXJyID0gY3Vy
ci0+cGFyZW50KCkpIHsKKyAgICAgICAgLy8gV2Ugb25seSBjYXJlIGFib3V0IHBhcmVudHMgdGhh
dCBhcmUgc3RhY2tpbmcgY29udGV4dHMuCisgICAgICAgIC8vIFJlY2FsbCB0aGF0IG9wYWNpdHkg
Y3JlYXRlcyBzdGFja2luZyBjb250ZXh0LgorICAgICAgICBpZiAoIWN1cnItPmlzU3RhY2tpbmdD
b250ZXh0KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIC8vIElm
IHdlIGZvdW5kIGEgY29tcG9zaXRpbmcgbGF5ZXIsIHdlIHdhbnQgdG8gY29tcHV0ZSBvcGFjaXR5
CisgICAgICAgIC8vIHJlbGF0aXZlIHRvIGl0LiBTbyB3ZSBjYW4gYnJlYWsgaGVyZS4KKyAgICAg
ICAgaWYgKGN1cnItPmlzQ29tcG9zaXRlZCgpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IAorICAgICAgICBmaW5hbE9wYWNpdHkgKj0gY3Vyci0+cmVuZGVyZXIoKS0+b3BhY2l0eSgpOwor
ICAgIH0KKworICAgIHJldHVybiBmaW5hbE9wYWNpdHk7Cit9CisKKy8vIEEgc2ltcGxlIGJhY2tn
cm91bmQgaXMgZWl0aGVyIG5vbmUgb3IgYSBzb2xpZCBjb2xvci4KK3N0YXRpYyBib29sIGhhc1Np
bXBsZUJhY2tncm91bmQoUmVuZGVyU3R5bGUqIGluU3R5bGUpCit7CisgICAgcmV0dXJuICFpblN0
eWxlLT5oYXNCYWNrZ3JvdW5kSW1hZ2UoKTsKK30KKworc3RhdGljIGJvb2wgaGFzQm9yZGVyT3V0
bGluZU9yU2hhZG93KFJlbmRlclN0eWxlKiBpblN0eWxlKQoreworICAgIHJldHVybiAoaW5TdHls
ZS0+aGFzQm9yZGVyKCkgfHwgaW5TdHlsZS0+aGFzQm9yZGVyUmFkaXVzKCkgfHwgaW5TdHlsZS0+
aGFzT3V0bGluZSgpIHx8IChpblN0eWxlLT5ib3hTaGFkb3coKSAhPSAwKSk7Cit9CisKK2Jvb2wg
UmVuZGVyTGF5ZXJCYWNraW5nOjpyZW5kZXJlckhhc0JhY2tncm91bmQoKSBjb25zdAoreworICAg
IC8vIEZJWE1FOiBzaGFyZSBtb3JlIGNvZGUgaGVyZQorICAgIGlmIChyZW5kZXJlcigpLT5ub2Rl
KCktPmlzRG9jdW1lbnROb2RlKCkpIHsKKyAgICAgICAgUmVuZGVyT2JqZWN0KiBodG1sT2JqZWN0
ID0gcmVuZGVyZXIoKS0+Zmlyc3RDaGlsZCgpOworICAgICAgICBpZiAoIWh0bWxPYmplY3QpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIAorICAgICAgICBSZW5kZXJTdHlsZSog
c3R5bGUgPSBodG1sT2JqZWN0LT5zdHlsZSgpOworICAgICAgICBpZiAoc3R5bGUtPmhhc0JhY2tn
cm91bmQoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgUmVu
ZGVyT2JqZWN0KiBib2R5T2JqZWN0ID0gaHRtbE9iamVjdC0+Zmlyc3RDaGlsZCgpOworICAgICAg
ICBpZiAoIWJvZHlPYmplY3QpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIAor
ICAgICAgICBzdHlsZSA9IGJvZHlPYmplY3QtPnN0eWxlKCk7CisgICAgICAgIHJldHVybiBzdHls
ZS0+aGFzQmFja2dyb3VuZCgpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVuZGVyZXIoKS0+
c3R5bGUoKS0+aGFzQmFja2dyb3VuZCgpOworfQorCitjb25zdCBDb2xvciYgUmVuZGVyTGF5ZXJC
YWNraW5nOjpyZW5kZXJlckJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6
IHNoYXJlIG1vcmUgY29kZSBoZXJlCisgICAgaWYgKHJlbmRlcmVyKCktPm5vZGUoKS0+aXNEb2N1
bWVudE5vZGUoKSkgeworICAgICAgICBSZW5kZXJPYmplY3QqIGh0bWxPYmplY3QgPSByZW5kZXJl
cigpLT5maXJzdENoaWxkKCk7CisgICAgICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IGh0bWxPYmpl
Y3QtPnN0eWxlKCk7CisgICAgICAgIGlmIChzdHlsZS0+aGFzQmFja2dyb3VuZCgpKQorICAgICAg
ICAgICAgcmV0dXJuIHN0eWxlLT5iYWNrZ3JvdW5kQ29sb3IoKTsKKworICAgICAgICBSZW5kZXJP
YmplY3QqIGJvZHlPYmplY3QgPSBodG1sT2JqZWN0LT5maXJzdENoaWxkKCk7CisgICAgICAgIHN0
eWxlID0gYm9keU9iamVjdC0+c3R5bGUoKTsKKyAgICAgICAgcmV0dXJuIHN0eWxlLT5iYWNrZ3Jv
dW5kQ29sb3IoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVuZGVyZXIoKS0+c3R5bGUoKS0+YmFj
a2dyb3VuZENvbG9yKCk7Cit9CisKK2Jvb2wgUmVuZGVyTGF5ZXJCYWNraW5nOjpjYW5CZVNpbXBs
ZUNvbnRhaW5lckNvbXBvc2l0aW5nTGF5ZXIoKSBjb25zdAoreworICAgIFJlbmRlck9iamVjdCog
cmVuZGVyT2JqZWN0ID0gcmVuZGVyZXIoKTsKKyAgICBpZiAocmVuZGVyT2JqZWN0LT5pc1JlcGxh
Y2VkKCkgfHwgICAgICAgLy8gcmVwbGFjZWQgb2JqZWN0cyBhcmUgbm90IGNvbnRhaW5lcnMKKyAg
ICAgICAgcmVuZGVyT2JqZWN0LT5oYXNNYXNrKCkpICAgICAgICAgICAgLy8gbWFza3MgcmVxdWly
ZSBzcGVjaWFsIHRyZWF0bWVudAorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBSZW5kZXJT
dHlsZSogc3R5bGUgPSByZW5kZXJPYmplY3QtPnN0eWxlKCk7CisKKyAgICAvLyBSZWplY3QgYW55
dGhpbmcgdGhhdCBoYXMgYSBib3JkZXIsIGEgYm9yZGVyLXJhZGl1cyBvciBvdXRsaW5lLAorICAg
IC8vIG9yIGFueSBiYWNrZ3JvdW5kIChjb2xvciBvciBpbWFnZSkuCisgICAgLy8gRklYTUU6IHdl
IGNvdWxkIG9wdGltaXplIGxheWVycyBmb3Igc2ltcGxlIGJhY2tncm91bmRzLgorICAgIGlmICho
YXNCb3JkZXJPdXRsaW5lT3JTaGFkb3coc3R5bGUpIHx8CisgICAgICAgIHN0eWxlLT5oYXNCYWNr
Z3JvdW5kKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIElmIHdlIGhhdmUgZ290
IHRoaXMgZmFyIGFuZCB0aGUgcmVuZGVyZXIgaGFzIG5vIGNoaWxkcmVuLCB0aGVuIHdlJ3JlIG9r
LgorICAgIGlmICghcmVuZGVyT2JqZWN0LT5maXJzdENoaWxkKCkpCisgICAgICAgIHJldHVybiB0
cnVlOworICAgIAorICAgIGlmIChyZW5kZXJPYmplY3QtPm5vZGUoKS0+aXNEb2N1bWVudE5vZGUo
KSkgeworICAgICAgICAvLyBMb29rIHRvIHNlZSBpZiB0aGUgcm9vdCBvYmplY3QgaGFzIGEgbm9u
LXNpbXBsZSBiYWNrZ291bmQKKyAgICAgICAgUmVuZGVyT2JqZWN0KiByb290T2JqZWN0ID0gcmVu
ZGVyT2JqZWN0LT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKS0+cmVuZGVyZXIoKTsKKyAg
ICAgICAgaWYgKCFyb290T2JqZWN0KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICAKKyAgICAgICAgc3R5bGUgPSByb290T2JqZWN0LT5zdHlsZSgpOworICAgICAgICAKKyAgICAg
ICAgLy8gUmVqZWN0IGFueXRoaW5nIHRoYXQgaGFzIGEgYm9yZGVyLCBhIGJvcmRlci1yYWRpdXMg
b3Igb3V0bGluZSwKKyAgICAgICAgLy8gb3IgaXMgbm90IGEgc2ltcGxlIGJhY2tncm91bmQgKG5v
IGJhY2tncm91bmQsIG9yIHNvbGlkIGNvbG9yKS4KKyAgICAgICAgaWYgKGhhc0JvcmRlck91dGxp
bmVPclNoYWRvdyhzdHlsZSkgfHwKKyAgICAgICAgICAgICFoYXNTaW1wbGVCYWNrZ3JvdW5kKHN0
eWxlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIC8vIE5v
dyBsb29rIGF0IHRoZSBib2R5J3MgcmVuZGVyZXIuCisgICAgICAgIEhUTUxFbGVtZW50KiBib2R5
ID0gcmVuZGVyT2JqZWN0LT5kb2N1bWVudCgpLT5ib2R5KCk7CisgICAgICAgIFJlbmRlck9iamVj
dCogYm9keU9iamVjdCA9IChib2R5ICYmIGJvZHktPmhhc0xvY2FsTmFtZShIVE1MTmFtZXM6OmJv
ZHlUYWcpKSA/IGJvZHktPnJlbmRlcmVyKCkgOiAwOworICAgICAgICBpZiAoIWJvZHlPYmplY3Qp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIAorICAgICAgICBzdHlsZSA9IGJv
ZHlPYmplY3QtPnN0eWxlKCk7CisgICAgICAgIAorICAgICAgICBpZiAoaGFzQm9yZGVyT3V0bGlu
ZU9yU2hhZG93KHN0eWxlKSB8fAorICAgICAgICAgICAgIWhhc1NpbXBsZUJhY2tncm91bmQoc3R5
bGUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIENlY2sgdG8gc2Vl
IGlmIGFsbCB0aGUgYm9keSdzIGNoaWxkcmVuIGFyZSBjb21wb3NpdGluZyBsYXllcnMuCisgICAg
ICAgIGlmIChoYXNOb25Db21wb3NpdGluZ0NvbnRlbnQoKSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIENo
ZWNrIHRvIHNlZSBpZiBhbGwgdGhlIHJlbmRlcmVyJ3MgY2hpbGRyZW4gYXJlIGNvbXBvc2l0aW5n
IGxheWVycy4KKyAgICBpZiAoaGFzTm9uQ29tcG9zaXRpbmdDb250ZW50KCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBSZW5kZXJMYXll
ckJhY2tpbmc6Omhhc05vbkNvbXBvc2l0aW5nQ29udGVudCgpIGNvbnN0Cit7CisgICAgLy8gQ29u
c2VydmF0aXZlIHRlc3QgZm9yIGhhdmluZyBubyByZW5kZXJlZCBjaGlsZHJlbi4KKyAgICAKKyAg
ICAvLyBTb21lIEhUTUwgY2FuIGNhdXNlIHdoaXRlc3BhY2UgdGV4dCBub2RlcyB0byBoYXZlIHJl
bmRlcmVycywgbGlrZToKKyAgICAvLyA8ZGl2PgorICAgIC8vIDxpbWcgc3JjPS4uLj4KKyAgICAv
LyA8L2Rpdj4KKyAgICAvLyBzbyB0ZXN0IGZvciAweDAgUmVuZGVyVGV4dHMgaGVyZQorICAgIGZv
ciAoUmVuZGVyT2JqZWN0KiBjaGlsZCA9IHJlbmRlcmVyKCktPmZpcnN0Q2hpbGQoKTsgY2hpbGQ7
IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgaWYgKCFjaGlsZC0+aGFz
TGF5ZXIoKSAmJiAoY2hpbGQtPndpZHRoKCkgPiAwIHx8IGNoaWxkLT5oZWlnaHQoKSA+IDApKQor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gRklYTUU6IHRlc3QgZm9y
IG92ZXJmbG93IGNvbnRyb2xzLgorICAgIGlmIChtX293bmluZ0xheWVyLT5pc1N0YWNraW5nQ29u
dGV4dCgpKSB7CisgICAgICAgIC8vIFVzZSB0aGUgbV9oYXNDb21wb3NpdGluZ0Rlc2NlbmRhbnQg
Yml0IHRvIG9wdGltaXplPworICAgICAgICBWZWN0b3I8UmVuZGVyTGF5ZXIqPiogbmVnWk9yZGVy
TGlzdCA9IG1fb3duaW5nTGF5ZXItPm5lZ1pPcmRlckxpc3QoKTsKKyAgICAgICAgaWYgKG5lZ1pP
cmRlckxpc3QgJiYgbmVnWk9yZGVyTGlzdC0+c2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9y
IChWZWN0b3I8UmVuZGVyTGF5ZXIqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBuZWdaT3JkZXJMaXN0
LT5iZWdpbigpOyBpdCAhPSBuZWdaT3JkZXJMaXN0LT5lbmQoKTsgKytpdCkgeworICAgICAgICAg
ICAgICAgIFJlbmRlckxheWVyKiBjdXJMYXllciA9ICgqaXQpOworICAgICAgICAgICAgICAgIGlm
ICghY3VyTGF5ZXItPmlzQ29tcG9zaXRlZCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFZlY3RvcjxSZW5kZXJM
YXllcio+KiBwb3NaT3JkZXJMaXN0ID0gbV9vd25pbmdMYXllci0+cG9zWk9yZGVyTGlzdCgpOwor
ICAgICAgICBpZiAocG9zWk9yZGVyTGlzdCAmJiBwb3NaT3JkZXJMaXN0LT5zaXplKCkgPiAwKQor
ICAgICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyTGF5ZXIqPjo6Y29uc3RfaXRlcmF0b3IgaXQg
PSBwb3NaT3JkZXJMaXN0LT5iZWdpbigpOyBpdCAhPSBwb3NaT3JkZXJMaXN0LT5lbmQoKTsgKytp
dCkgeworICAgICAgICAgICAgICAgIFJlbmRlckxheWVyKiBjdXJMYXllciA9ICgqaXQpOworICAg
ICAgICAgICAgICAgIGlmICghY3VyTGF5ZXItPmlzQ29tcG9zaXRlZCgpKQorICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBWZWN0b3I8
UmVuZGVyTGF5ZXIqPiogb3ZlcmZsb3dMaXN0ID0gbV9vd25pbmdMYXllci0+b3ZlcmZsb3dMaXN0
KCk7CisgICAgaWYgKG92ZXJmbG93TGlzdCAmJiBvdmVyZmxvd0xpc3QtPnNpemUoKSA+IDApCisg
ICAgICAgIGZvciAoVmVjdG9yPFJlbmRlckxheWVyKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gb3Zl
cmZsb3dMaXN0LT5iZWdpbigpOyBpdCAhPSBvdmVyZmxvd0xpc3QtPmVuZCgpOyArK2l0KSB7Cisg
ICAgICAgICAgICBSZW5kZXJMYXllciogY3VyTGF5ZXIgPSAoKml0KTsKKyAgICAgICAgICAgIGlm
ICghY3VyTGF5ZXItPmlzQ29tcG9zaXRlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEEgInNpbXBsZSBjb250
YWluZXIgbGF5ZXIiIGlzIGEgUmVuZGVyTGF5ZXIgd2hpY2ggaGFzIG5vIHZpc2libGUgY29udGVu
dCB0byByZW5kZXIuCisvLyBJdCBtYXkgaGF2ZSBubyBjaGlsZHJlbiwgb3IgYWxsIGl0cyBjaGls
ZHJlbiBtYXkgYmUgdGhlbXNlbHZlcyBjb21wb3NpdGVkLgorLy8gVGhpcyBpcyBhIHVzZWZ1bCBv
cHRpbWl6YXRpb24sIGJlY2F1c2UgaXQgYWxsb3dzIHVzIHRvIGF2b2lkIGFsbG9jYXRpbmcgYmFj
a2luZyBzdG9yZS4KK2Jvb2wgUmVuZGVyTGF5ZXJCYWNraW5nOjppc1NpbXBsZUNvbnRhaW5lckNv
bXBvc2l0aW5nTGF5ZXIoKQoreworICAgIGlmIChtX3NpbXBsZUNvbXBvc2l0aW5nTGF5ZXJTdGF0
dXNEaXJ0eSkgeworICAgICAgICBtX2lzU2ltcGxlQ29udGFpbmVyQ29tcG9zaXRpbmdMYXllciA9
IGNhbkJlU2ltcGxlQ29udGFpbmVyQ29tcG9zaXRpbmdMYXllcigpOworICAgICAgICBtX3NpbXBs
ZUNvbXBvc2l0aW5nTGF5ZXJTdGF0dXNEaXJ0eSA9IGZhbHNlOworICAgIH0KKworICAgIHJldHVy
biBtX2lzU2ltcGxlQ29udGFpbmVyQ29tcG9zaXRpbmdMYXllcjsKK30KKwordm9pZCBSZW5kZXJM
YXllckJhY2tpbmc6OmRldGVjdERyYXdpbmdPcHRpbWl6YXRpb25zKCkKK3sKKyAgICBib29sIGRy
YXdzQ29udGVudCA9IHRydWU7CisKKyAgICBpZiAoaXNTaW1wbGVDb250YWluZXJDb21wb3NpdGlu
Z0xheWVyKCkgfHwgcGFpbnRpbmdHb2VzVG9XaW5kb3coKSkKKyAgICAgICAgZHJhd3NDb250ZW50
ID0gZmFsc2U7CisKKyAgICBtX2dyYXBoaWNzTGF5ZXItPnNldERyYXdzQ29udGVudChkcmF3c0Nv
bnRlbnQpOworfQorCit2b2lkIFJlbmRlckxheWVyQmFja2luZzo6aW52YWxpZGF0ZURyYXdpbmdP
cHRpbWl6YXRpb25zKCkKK3sKKyAgICBtX3NpbXBsZUNvbXBvc2l0aW5nTGF5ZXJTdGF0dXNEaXJ0
eSA9IHRydWU7Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJCYWNraW5nOjpmb3JjZUNvbXBvc2l0aW5n
TGF5ZXIoYm9vbCBmb3JjZSkKK3sKKyAgICBtX2ZvcmNlQ29tcG9zaXRpbmdMYXllciA9IGZvcmNl
OworfQorCitGbG9hdFBvaW50IFJlbmRlckxheWVyQmFja2luZzo6Y29tcHV0ZVRyYW5zZm9ybU9y
aWdpbihjb25zdCBJbnRSZWN0JiBib3JkZXJCb3gpIGNvbnN0Cit7CisgICAgUmVuZGVyU3R5bGUq
IHN0eWxlID0gcmVuZGVyZXIoKS0+c3R5bGUoKTsKKworICAgIEZsb2F0UG9pbnQgb3JpZ2luOwor
ICAgIG9yaWdpbi5zZXRYKHN0eWxlLT50cmFuc2Zvcm1PcmlnaW5YKCkuY2FsY0Zsb2F0VmFsdWUo
Ym9yZGVyQm94LndpZHRoKCkpKTsKKyAgICBvcmlnaW4uc2V0WShzdHlsZS0+dHJhbnNmb3JtT3Jp
Z2luWSgpLmNhbGNGbG9hdFZhbHVlKGJvcmRlckJveC5oZWlnaHQoKSkpOworCisgICAgcmV0dXJu
IG9yaWdpbjsKK30KKworLy8gUmV0dXJuIHRoZSBvZmZzZXQgZnJvbSB0aGUgdG9wLWxlZnQgb2Yg
dGhpcyBjb21wb3NpdGluZyBsYXllciBhdCB3aGljaCB0aGUgcmVuZGVyZXIncyBjb250ZW50cyBh
cmUgcGFpbnRlZC4KK0ludFNpemUgUmVuZGVyTGF5ZXJCYWNraW5nOjpjb250ZW50T2Zmc2V0SW5D
b21wb3N0aW5nTGF5ZXIoKQoreworICAgIGlmICghbV9jb21wb3NpdGluZ0NvbnRlbnRPZmZzZXRE
aXJ0eSkKKyAgICAgICAgcmV0dXJuIG1fY29tcG9zaXRpbmdDb250ZW50T2Zmc2V0OworCisgICAg
SW50UmVjdCByZWxhdGl2ZUNvbXBvc2l0aW5nQm91bmRzID0gY29tcG9zaXRvcigpLT5jYWxjdWxh
dGVDb21wb3NpdGVkQm91bmRzKG1fb3duaW5nTGF5ZXIsIG1fb3duaW5nTGF5ZXIpOworICAgIG1f
Y29tcG9zaXRpbmdDb250ZW50T2Zmc2V0ID0gSW50U2l6ZSgtcmVsYXRpdmVDb21wb3NpdGluZ0Jv
dW5kcy54KCksIC1yZWxhdGl2ZUNvbXBvc2l0aW5nQm91bmRzLnkoKSk7CisgICAgbV9jb21wb3Np
dGluZ0NvbnRlbnRPZmZzZXREaXJ0eSA9IGZhbHNlOworCisgICAgcmV0dXJuIG1fY29tcG9zaXRp
bmdDb250ZW50T2Zmc2V0OworfQorCitJbnRSZWN0IFJlbmRlckxheWVyQmFja2luZzo6Y29udGVu
dHNCb3goY29uc3QgR3JhcGhpY3NMYXllciopCit7CisgICAgSW50UmVjdCBjb250ZW50c1JlY3Q7
CisgICAgY29udGVudHNSZWN0ID0gcmVuZGVyZXIoKS0+Y29udGVudEJveCgpOworCisgICAgSW50
U2l6ZSAgY29udGVudE9mZnNldCA9IGNvbnRlbnRPZmZzZXRJbkNvbXBvc3RpbmdMYXllcigpOwor
ICAgIGNvbnRlbnRzUmVjdC5tb3ZlKGNvbnRlbnRPZmZzZXQpOworICAgIHJldHVybiBjb250ZW50
c1JlY3Q7Cit9CisKKy8vIE1hcCB0aGUgZ2l2ZW4gcG9pbnQgZnJvbSBjb29yZGluYXRlcyBpbiB0
aGUgR3JhcGhpY3NMYXllciB0byBSZW5kZXJMYXllciBjb29yZGluYXRlcy4KK0Zsb2F0UG9pbnQg
UmVuZGVyTGF5ZXJCYWNraW5nOjpncmFwaGljc0xheWVyVG9Db250ZW50c0Nvb3JkaW5hdGVzKGNv
bnN0IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIEludFNpemUgY29udGVudE9mZnNldCA9IGNv
bnRlbnRPZmZzZXRJbkNvbXBvc3RpbmdMYXllcigpOworICAgIHJldHVybiBGbG9hdFBvaW50KHBv
aW50LngoKSAtIGNvbnRlbnRPZmZzZXQud2lkdGgoKSwgcG9pbnQueSgpIC0gY29udGVudE9mZnNl
dC5oZWlnaHQoKSk7Cit9CisKKy8vIE1hcCB0aGUgZ2l2ZW4gcG9pbnQgZnJvbSBjb29yZGluYXRl
cyBpbiB0aGUgUmVuZGVyTGF5ZXIgdG8gR3JhcGhpY3NMYXllciBjb29yZGluYXRlcy4KK0Zsb2F0
UG9pbnQgUmVuZGVyTGF5ZXJCYWNraW5nOjpjb250ZW50c1RvR3JhcGhpY3NMYXllckNvb3JkaW5h
dGVzKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIEludFNpemUgY29udGVudE9mZnNl
dCA9IGNvbnRlbnRPZmZzZXRJbkNvbXBvc3RpbmdMYXllcigpOworICAgIHJldHVybiBGbG9hdFBv
aW50KHBvaW50LngoKSArIGNvbnRlbnRPZmZzZXQud2lkdGgoKSwgcG9pbnQueSgpICsgY29udGVu
dE9mZnNldC5oZWlnaHQoKSk7Cit9CisKK2Jvb2wgUmVuZGVyTGF5ZXJCYWNraW5nOjpwYWludGlu
Z0dvZXNUb1dpbmRvdygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fb3duaW5nTGF5ZXItPmlzRG9j
dW1lbnRMYXllcigpCisjaWZuZGVmIE5ERUJVRworICAgICAgICAmJiAhR3JhcGhpY3NMYXllcjo6
c2hvd0xheWVySGllcmFyY2h5KCkKKyNlbmRpZgorICAgICAgICA7Cit9CisKK3ZvaWQgUmVuZGVy
TGF5ZXJCYWNraW5nOjpzZXRDb250ZW50c05lZWREaXNwbGF5KCkKK3sKKyAgICBpZiAobV9ncmFw
aGljc0xheWVyKQorICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPnNldE5lZWRzRGlzcGxheSgpOwor
ICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIG1fY29udGVudHNMYXllci0+c2V0TmVl
ZHNEaXNwbGF5KCk7Cit9CisKKy8vIHIgaXMgaW4gdGhlIGNvb3JkaW5hdGUgc3BhY2Ugb2YgdGhl
IGxheWVyJ3MgcmVuZGVyIG9iamVjdAordm9pZCBSZW5kZXJMYXllckJhY2tpbmc6OnNldENvbnRl
bnRzTmVlZERpc3BsYXlJblJlY3QoY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBpZiAobV9ncmFw
aGljc0xheWVyKSB7CisgICAgICAgIEZsb2F0UG9pbnQgZGlydHlPcmlnaW4gPSBjb250ZW50c1Rv
R3JhcGhpY3NMYXllckNvb3JkaW5hdGVzKEZsb2F0UG9pbnQoci54KCksIHIueSgpKSk7CisgICAg
ICAgIEZsb2F0UmVjdCBkaXJ0eVJlY3QoZGlydHlPcmlnaW4sIHIuc2l6ZSgpKTsKKyAgICAgICAg
RmxvYXRSZWN0IGJvdW5kcyhGbG9hdFBvaW50KCksIG1fZ3JhcGhpY3NMYXllci0+c2l6ZSgpKTsK
KyAgICAgICAgaWYgKGJvdW5kcy5pbnRlcnNlY3RzKGRpcnR5UmVjdCkpCisgICAgICAgICAgICBt
X2dyYXBoaWNzTGF5ZXItPnNldE5lZWRzRGlzcGxheUluUmVjdChkaXJ0eVJlY3QpOworICAgIH0K
KworICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpIHsKKyAgICAgICAgLy8gRklYTUU6IGRvIGluY3Jl
bWVudGFsIHJlcGFpbnQKKyAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXROZWVkc0Rpc3BsYXko
KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNldENsaXAoR3JhcGhpY3NDb250ZXh0KiBwLCBj
b25zdCBJbnRSZWN0JiBwYWludERpcnR5UmVjdCwgY29uc3QgSW50UmVjdCYgY2xpcFJlY3QpCit7
CisgICAgaWYgKHBhaW50RGlydHlSZWN0ID09IGNsaXBSZWN0KQorICAgICAgICByZXR1cm47Cisg
ICAgcC0+c2F2ZSgpOworICAgIHAtPmNsaXAoY2xpcFJlY3QpOworfQorCitzdGF0aWMgdm9pZCBy
ZXN0b3JlQ2xpcChHcmFwaGljc0NvbnRleHQqIHAsIGNvbnN0IEludFJlY3QmIHBhaW50RGlydHlS
ZWN0LCBjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCkKK3sKKyAgICBpZiAocGFpbnREaXJ0eVJlY3Qg
PT0gY2xpcFJlY3QpCisgICAgICAgIHJldHVybjsKKyAgICBwLT5yZXN0b3JlKCk7Cit9CisKKy8v
IFNoYXJlIHRoaXMgd2l0aCBSZW5kZXJMYXllcjo6cGFpbnRMYXllciwgd2hpY2ggd291bGQgaGF2
ZSB0byBiZSBlZHVjYXRlZCBhYm91dCBHcmFwaGljc0xheWVyUGFpbnRpbmdQaGFzZT8KK3ZvaWQg
UmVuZGVyTGF5ZXJCYWNraW5nOjpwYWludEludG9MYXllcihSZW5kZXJMYXllciogcm9vdExheWVy
LCBHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IElu
dFJlY3QmIHBhaW50RGlydHlSZWN0LCAgICAgIC8vIGluIHRoZSBjb29yZHMgb2Ygcm9vdExheWVy
CisgICAgICAgICAgICAgICAgICAgIGJvb2wgaGF2ZVRyYW5zcGFyZW5jeSwgUGFpbnRSZXN0cmlj
dGlvbiBwYWludFJlc3RyaWN0aW9uLCBHcmFwaGljc0xheWVyUGFpbnRpbmdQaGFzZSBwYWludGlu
Z1BoYXNlLAorICAgICAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIHBhaW50aW5nUm9vdCkK
K3sKKyAgICBpZiAocGFpbnRpbmdHb2VzVG9XaW5kb3coKSkgeworICAgICAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBpZiAobV9vd25p
bmdMYXllci0+aXNTdGFja2luZ0NvbnRleHQoKSAmJiAobV9vd25pbmdMYXllci0+bV96T3JkZXJM
aXN0c0RpcnR5IHx8IG1fb3duaW5nTGF5ZXItPm1fb3ZlcmZsb3dMaXN0RGlydHkpKQorICAgICAg
ICBjb21wb3NpdG9yKCktPnVwZGF0ZUNvbXBvc2l0aW5nTGF5ZXJzKG1fb3duaW5nTGF5ZXIpOwor
ICAgIAorICAgIC8vIENhbGN1bGF0ZSB0aGUgY2xpcCByZWN0cyB3ZSBzaG91bGQgdXNlLgorICAg
IEludFJlY3QgbGF5ZXJCb3VuZHMsIGRhbWFnZVJlY3QsIGNsaXBSZWN0VG9BcHBseSwgb3V0bGlu
ZVJlY3Q7CisgICAgbV9vd25pbmdMYXllci0+Y2FsY3VsYXRlUmVjdHMocm9vdExheWVyLCBwYWlu
dERpcnR5UmVjdCwgbGF5ZXJCb3VuZHMsIGRhbWFnZVJlY3QsIGNsaXBSZWN0VG9BcHBseSwgb3V0
bGluZVJlY3QpOworICAgIAorICAgIGludCB4ID0gbGF5ZXJCb3VuZHMueCgpOyAgICAgICAgLy8g
bGF5ZXJCb3VuZHMgaXMgY29tcHV0ZWQgcmVsYXRpdmUgdG8gcm9vdExheWVyCisgICAgaW50IHkg
PSBsYXllckJvdW5kcy55KCk7CisgICAgaW50IHR4ID0geCAtIHJlbmRlcmVyKCktPnhQb3MoKTsK
KyAgICBpbnQgdHkgPSB5IC0gcmVuZGVyZXIoKS0+eVBvcygpICsgcmVuZGVyZXIoKS0+Ym9yZGVy
VG9wRXh0cmEoKTsKKworICAgIC8vIElmIHRoaXMgbGF5ZXIncyByZW5kZXJlciBpcyBhIGNoaWxk
IG9mIHRoZSBwYWludGluZ1Jvb3QsIHdlIHJlbmRlciB1bmNvbmRpdGlvbmFsbHksIHdoaWNoCisg
ICAgLy8gaXMgZG9uZSBieSBwYXNzaW5nIGEgbmlsIHBhaW50aW5nUm9vdCBkb3duIHRvIG91ciBy
ZW5kZXJlciAoYXMgaWYgbm8gcGFpbnRpbmdSb290IHdhcyBldmVyIHNldCkuCisgICAgLy8gRWxz
ZSwgb3VyIHJlbmRlcmVyIHRyZWUgbWF5IG9yIG1heSBub3QgY29udGFpbiB0aGUgcGFpbnRpbmcg
cm9vdCwgc28gd2UgcGFzcyB0aGF0IHJvb3QgYWxvbmcKKyAgICAvLyBzbyBpdCB3aWxsIGJlIHRl
c3RlZCBhZ2FpbnN0IGFzIHdlIGRlY2VuZCB0aHJvdWdoIHRoZSByZW5kZXJlcnMuCisgICAgUmVu
ZGVyT2JqZWN0ICpwYWludGluZ1Jvb3RGb3JSZW5kZXJlciA9IDA7CisgICAgaWYgKHBhaW50aW5n
Um9vdCAmJiAhcmVuZGVyZXIoKS0+aXNEZXNjZW5kYW50T2YocGFpbnRpbmdSb290KSkKKyAgICAg
ICAgcGFpbnRpbmdSb290Rm9yUmVuZGVyZXIgPSBwYWludGluZ1Jvb3Q7CisKKyAgICBpZiAocGFp
bnRpbmdQaGFzZSAmIEdyYXBoaWNzTGF5ZXJQYWludEJhY2tncm91bmRNYXNrKSB7CisgICAgICAg
IC8vIElmIHRoaXMgaXMgdGhlIHJvb3QgdGhlbiB3ZSBuZWVkIHRvIHNlbmQgaW4gYSBiaWdnZXIg
Ym91bmRpbmcgYm94CisgICAgICAgIC8vIGJlY2F1c2Ugd2UnbGwgYmUgcGFpbnRpbmcgdGhlIGJh
Y2tncm91bmQgYXMgd2VsbCAoc2VlIFJlbmRlckJveDo6cGFpbnRSb290Qm94RGVjb3JhdGlvbnMo
KSkuCisgICAgICAgIEludFJlY3QgcGFpbnRCb3ggPSBjbGlwUmVjdFRvQXBwbHk7CisgICAgICAg
IAorICAgICAgICBpZiAocmVuZGVyZXIoKS0+bm9kZSgpLT5pc0RvY3VtZW50Tm9kZSgpICYmIHJl
bmRlcmVyKCktPmRvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkpIHsKKyAgICAgICAgICAgIGlu
dCB3ID0gcmVuZGVyZXIoKS0+d2lkdGgoKTsKKyAgICAgICAgICAgIGludCBoID0gcmVuZGVyZXIo
KS0+aGVpZ2h0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBydzsKKyAgICAgICAg
ICAgIGludCByaDsKKyAgICAgICAgICAgIGlmIChyZW5kZXJlcigpLT52aWV3KCktPmZyYW1lVmll
dygpKSB7CisgICAgICAgICAgICAgICAgcncgPSByZW5kZXJlcigpLT52aWV3KCktPmZyYW1lVmll
dygpLT5jb250ZW50c1dpZHRoKCk7CisgICAgICAgICAgICAgICAgcmggPSByZW5kZXJlcigpLT52
aWV3KCktPmZyYW1lVmlldygpLT5jb250ZW50c0hlaWdodCgpOworICAgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgICBydyA9IHJlbmRlcmVyKCktPnZpZXcoKS0+d2lkdGgoKTsKKyAg
ICAgICAgICAgICAgICByaCA9IHJlbmRlcmVyKCktPnZpZXcoKS0+aGVpZ2h0KCk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBieCA9IHR4IC0gcmVuZGVyZXIo
KS0+bWFyZ2luTGVmdCgpOworICAgICAgICAgICAgaW50IGJ5ID0gdHkgLSByZW5kZXJlcigpLT5t
YXJnaW5Ub3AoKTsKKyAgICAgICAgICAgIGludCBidyA9IG1heCh3ICsgcmVuZGVyZXIoKS0+bWFy
Z2luTGVmdCgpICsgcmVuZGVyZXIoKS0+bWFyZ2luUmlnaHQoKSArIHJlbmRlcmVyKCktPmJvcmRl
ckxlZnQoKSArIHJlbmRlcmVyKCktPmJvcmRlclJpZ2h0KCksIHJ3KTsKKyAgICAgICAgICAgIGlu
dCBiaCA9IG1heChoICsgcmVuZGVyZXIoKS0+bWFyZ2luVG9wKCkgKyByZW5kZXJlcigpLT5tYXJn
aW5Cb3R0b20oKSArIHJlbmRlcmVyKCktPmJvcmRlclRvcCgpICsgcmVuZGVyZXIoKS0+Ym9yZGVy
Qm90dG9tKCksIHJoKTsKKyAgICAgICAgICAgIHBhaW50Qm94ID0gSW50UmVjdChieCwgYnksIGJ3
LCBiaCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQYWludCBvdXIgYmFja2dyb3VuZCBmaXJz
dCwgYmVmb3JlIHBhaW50aW5nIGFueSBjaGlsZCBsYXllcnMuCisgICAgICAgIC8vIEVzdGFibGlz
aCB0aGUgY2xpcCB1c2VkIHRvIHBhaW50IG91ciBiYWNrZ3JvdW5kLgorICAgICAgICBzZXRDbGlw
KGNvbnRleHQsIHBhaW50RGlydHlSZWN0LCBkYW1hZ2VSZWN0KTsKKyAgICAgICAgCisgICAgICAg
IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvIGluZm8oY29udGV4dCwgcGFpbnRCb3gsIFBhaW50UGhh
c2VCbG9ja0JhY2tncm91bmQsIGZhbHNlLCBwYWludGluZ1Jvb3RGb3JSZW5kZXJlciwgMCk7Cisg
ICAgICAgIHJlbmRlcmVyKCktPnBhaW50KGluZm8sIHR4LCB0eSk7CisKKyAgICAgICAgLy8gT3Vy
IHNjcm9sbGJhciB3aWRnZXRzIHBhaW50IGV4YWN0bHkgd2hlbiB3ZSB0ZWxsIHRoZW0gdG8sIHNv
IHRoYXQgdGhleSB3b3JrIHByb3Blcmx5IHdpdGgKKyAgICAgICAgLy8gei1pbmRleC4gIFdlIHBh
aW50IGFmdGVyIHdlIHBhaW50ZWQgdGhlIGJhY2tncm91bmQvYm9yZGVyLCBzbyB0aGF0IHRoZSBz
Y3JvbGxiYXJzIHdpbGwKKyAgICAgICAgLy8gc2l0IGFib3ZlIHRoZSBiYWNrZ3JvdW5kL2JvcmRl
ci4KKyAgICAgICAgbV9vd25pbmdMYXllci0+cGFpbnRPdmVyZmxvd0NvbnRyb2xzKGNvbnRleHQs
IHgsIHksIGRhbWFnZVJlY3QpOworICAgICAgICAKKyAgICAgICAgLy8gUmVzdG9yZSB0aGUgY2xp
cC4KKyAgICAgICAgcmVzdG9yZUNsaXAoY29udGV4dCwgcGFpbnREaXJ0eVJlY3QsIGRhbWFnZVJl
Y3QpOworICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICBpZiAocGFpbnRpbmdQaGFzZSAmIEdy
YXBoaWNzTGF5ZXJQYWludEZvcmVncm91bmRNYXNrKSB7CisgICAgICAgIC8vIE5vdyB3YWxrIHRo
ZSBzb3J0ZWQgbGlzdCBvZiBjaGlsZHJlbiB3aXRoIG5lZ2F0aXZlIHotaW5kaWNlcy4gT25seSBS
ZW5kZXJMYXllcnMgd2l0aG91dCBjb21wb3NpdGluZyBsYXllcnMgd2lsbCBwYWludC4KKyAgICAg
ICAgLy8gRklYTUU6IHNob3VsZCB0aGVzZSBiZSBwYWludGVkIGFzIGJhY2tncm91bmQ/CisgICAg
ICAgIFZlY3RvcjxSZW5kZXJMYXllcio+KiBuZWdaT3JkZXJMaXN0ID0gbV9vd25pbmdMYXllci0+
bmVnWk9yZGVyTGlzdCgpOworICAgICAgICBpZiAobmVnWk9yZGVyTGlzdCkKKyAgICAgICAgICAg
IGZvciAoVmVjdG9yPFJlbmRlckxheWVyKj46Oml0ZXJhdG9yIGl0ID0gbmVnWk9yZGVyTGlzdC0+
YmVnaW4oKTsgaXQgIT0gbmVnWk9yZGVyTGlzdC0+ZW5kKCk7ICsraXQpCisgICAgICAgICAgICAg
ICAgaXRbMF0tPnBhaW50TGF5ZXIocm9vdExheWVyLCBjb250ZXh0LCBwYWludERpcnR5UmVjdCwg
aGF2ZVRyYW5zcGFyZW5jeSwgcGFpbnRSZXN0cmljdGlvbiwgcGFpbnRpbmdSb290KTsKKworICAg
ICAgICBib29sIGZvcmNlQmxhY2tUZXh0ID0gcGFpbnRSZXN0cmljdGlvbiA9PSBQYWludFJlc3Ry
aWN0aW9uU2VsZWN0aW9uT25seUJsYWNrVGV4dDsKKyAgICAgICAgYm9vbCBzZWxlY3Rpb25Pbmx5
ICA9IHBhaW50UmVzdHJpY3Rpb24gPT0gUGFpbnRSZXN0cmljdGlvblNlbGVjdGlvbk9ubHkgfHwg
cGFpbnRSZXN0cmljdGlvbiA9PSBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seUJsYWNrVGV4
dDsKKworICAgICAgICAvLyBTZXQgdXAgdGhlIGNsaXAgdXNlZCB3aGVuIHBhaW50aW5nIG91ciBj
aGlsZHJlbi4KKyAgICAgICAgc2V0Q2xpcChjb250ZXh0LCBwYWludERpcnR5UmVjdCwgY2xpcFJl
Y3RUb0FwcGx5KTsKKyAgICAgICAgUmVuZGVyT2JqZWN0OjpQYWludEluZm8gcGFpbnRJbmZvKGNv
bnRleHQsIGNsaXBSZWN0VG9BcHBseSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzZWxlY3Rpb25Pbmx5ID8gUGFpbnRQaGFzZVNlbGVjdGlvbiA6IFBhaW50UGhh
c2VDaGlsZEJsb2NrQmFja2dyb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBmb3JjZUJsYWNrVGV4dCwgcGFpbnRpbmdSb290Rm9yUmVuZGVyZXIsIDApOwor
ICAgICAgICByZW5kZXJlcigpLT5wYWludChwYWludEluZm8sIHR4LCB0eSk7CisKKyAgICAgICAg
aWYgKCFzZWxlY3Rpb25Pbmx5KSB7CisgICAgICAgICAgICBwYWludEluZm8ucGhhc2UgPSBQYWlu
dFBoYXNlRmxvYXQ7CisgICAgICAgICAgICByZW5kZXJlcigpLT5wYWludChwYWludEluZm8sIHR4
LCB0eSk7CisKKyAgICAgICAgICAgIHBhaW50SW5mby5waGFzZSA9IFBhaW50UGhhc2VGb3JlZ3Jv
dW5kOworICAgICAgICAgICAgcmVuZGVyZXIoKS0+cGFpbnQocGFpbnRJbmZvLCB0eCwgdHkpOwor
CisgICAgICAgICAgICBwYWludEluZm8ucGhhc2UgPSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lczsK
KyAgICAgICAgICAgIHJlbmRlcmVyKCktPnBhaW50KHBhaW50SW5mbywgdHgsIHR5KTsKKyAgICAg
ICAgfQorCisgICAgICAgIC8vIE5vdyByZXN0b3JlIG91ciBjbGlwLgorICAgICAgICByZXN0b3Jl
Q2xpcChjb250ZXh0LCBwYWludERpcnR5UmVjdCwgY2xpcFJlY3RUb0FwcGx5KTsKKworICAgICAg
ICBpZiAoIW91dGxpbmVSZWN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8gUGFpbnQgb3Vy
IG93biBvdXRsaW5lCisgICAgICAgICAgICBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyBwYWludElu
Zm8oY29udGV4dCwgb3V0bGluZVJlY3QsIFBhaW50UGhhc2VTZWxmT3V0bGluZSwgZmFsc2UsIHBh
aW50aW5nUm9vdEZvclJlbmRlcmVyLCAwKTsKKyAgICAgICAgICAgIHNldENsaXAoY29udGV4dCwg
cGFpbnREaXJ0eVJlY3QsIG91dGxpbmVSZWN0KTsKKyAgICAgICAgICAgIHJlbmRlcmVyKCktPnBh
aW50KHBhaW50SW5mbywgdHgsIHR5KTsKKyAgICAgICAgICAgIHJlc3RvcmVDbGlwKGNvbnRleHQs
IHBhaW50RGlydHlSZWN0LCBvdXRsaW5lUmVjdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQ
YWludCBhbnkgY2hpbGQgbGF5ZXJzIHRoYXQgaGF2ZSBvdmVyZmxvdy4KKyAgICAgICAgVmVjdG9y
PFJlbmRlckxheWVyKj4qIG92ZXJmbG93TGlzdCA9IG1fb3duaW5nTGF5ZXItPm92ZXJmbG93TGlz
dCgpOworICAgICAgICBpZiAob3ZlcmZsb3dMaXN0KQorICAgICAgICAgICAgZm9yIChWZWN0b3I8
UmVuZGVyTGF5ZXIqPjo6aXRlcmF0b3IgaXQgPSBvdmVyZmxvd0xpc3QtPmJlZ2luKCk7IGl0ICE9
IG92ZXJmbG93TGlzdC0+ZW5kKCk7ICsraXQpCisgICAgICAgICAgICAgICAgaXRbMF0tPnBhaW50
TGF5ZXIocm9vdExheWVyLCBjb250ZXh0LCBwYWludERpcnR5UmVjdCwgaGF2ZVRyYW5zcGFyZW5j
eSwgcGFpbnRSZXN0cmljdGlvbiwgcGFpbnRpbmdSb290KTsKKyAgICAgICAgCisgICAgICAgIC8v
IE5vdyB3YWxrIHRoZSBzb3J0ZWQgbGlzdCBvZiBjaGlsZHJlbiB3aXRoIHBvc2l0aXZlIHotaW5k
aWNlcy4KKyAgICAgICAgVmVjdG9yPFJlbmRlckxheWVyKj4qIHBvc1pPcmRlckxpc3QgPSBtX293
bmluZ0xheWVyLT5wb3NaT3JkZXJMaXN0KCk7CisgICAgICAgIGlmIChwb3NaT3JkZXJMaXN0KQor
ICAgICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyTGF5ZXIqPjo6aXRlcmF0b3IgaXQgPSBwb3Na
T3JkZXJMaXN0LT5iZWdpbigpOyBpdCAhPSBwb3NaT3JkZXJMaXN0LT5lbmQoKTsgKytpdCkKKyAg
ICAgICAgICAgICAgICBpdFswXS0+cGFpbnRMYXllcihyb290TGF5ZXIsIGNvbnRleHQsIHBhaW50
RGlydHlSZWN0LCBoYXZlVHJhbnNwYXJlbmN5LCBwYWludFJlc3RyaWN0aW9uLCBwYWludGluZ1Jv
b3QpOworCisgICAgICAgIGlmIChyZW5kZXJlcigpLT5oYXNNYXNrKCkgJiYgIXNlbGVjdGlvbk9u
bHkgJiYgIWRhbWFnZVJlY3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzZXRDbGlwKGNvbnRl
eHQsIHBhaW50RGlydHlSZWN0LCBkYW1hZ2VSZWN0KTsKKworICAgICAgICAgICAgLy8gUGFpbnQg
dGhlIG1hc2suCisgICAgICAgICAgICBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyBwYWludEluZm8o
Y29udGV4dCwgZGFtYWdlUmVjdCwgUGFpbnRQaGFzZU1hc2ssIGZhbHNlLCBwYWludGluZ1Jvb3RG
b3JSZW5kZXJlciwgMCk7CisgICAgICAgICAgICByZW5kZXJlcigpLT5wYWludChwYWludEluZm8s
IHR4LCB0eSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGNsaXAu
CisgICAgICAgICAgICByZXN0b3JlQ2xpcChjb250ZXh0LCBwYWludERpcnR5UmVjdCwgZGFtYWdl
UmVjdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBU1NFUlQoIW1fb3duaW5nTGF5ZXItPm1f
dXNlZFRyYW5zcGFyZW5jeSk7Cit9CisKKy8vIFVwLWNhbGwgZnJvbSBjb21wb3NpdGluZyBsYXll
ciBkcmF3aW5nIGNhbGxiYWNrLgordm9pZCBSZW5kZXJMYXllckJhY2tpbmc6OnBhaW50Q29udGVu
dHMoY29uc3QgR3JhcGhpY3NMYXllciosIEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCwgR3JhcGhp
Y3NMYXllclBhaW50aW5nUGhhc2UgZHJhd2luZ1BoYXNlLCBjb25zdCBJbnRSZWN0JiBjbGlwKQor
eworICAgIC8vIFdlIGhhdmUgdG8gdXNlIHRoZSBzYW1lIHJvb3QgYXMgZm9yIGhpdCB0ZXN0aW5n
LCBiZWNhdXNlIGJvdGggbWV0aG9kcworICAgIC8vIGNhbiBjb21wdXRlIGFuZCBjYWNoZSBjbGlw
UmVjdHMuCisgICAgSW50UmVjdCBlbmNsb3NpbmdCQm94ID0gY29tcG9zaXRvcigpLT5jYWxjdWxh
dGVDb21wb3NpdGVkQm91bmRzKG1fb3duaW5nTGF5ZXIsIG1fb3duaW5nTGF5ZXIpOworCisgICAg
SW50UmVjdCBjbGlwUmVjdChjbGlwKTsKKyAgICAKKyAgICAvLyBTZXQgdXAgdGhlIGNvb3JkaW5h
dGUgc3BhY2UgdG8gYmUgaW4gdGhlIGxheWVyJ3MgcmVuZGVyaW5nIGNvb3JkaW5hdGVzLgorICAg
IGNvbnRleHQudHJhbnNsYXRlKC1lbmNsb3NpbmdCQm94LngoKSwgLWVuY2xvc2luZ0JCb3gueSgp
KTsKKworICAgIC8vIE9mZnNldCB0aGUgY2xpcC4KKyAgICBjbGlwUmVjdC5tb3ZlKGVuY2xvc2lu
Z0JCb3gueCgpLCBlbmNsb3NpbmdCQm94LnkoKSk7CisgICAgCisgICAgLy8gVGhlIGRpcnR5UmVj
dCBpcyBpbiB0aGUgY29vcmRzIG9mIHRoZSBwYWludGluZyByb290LgorICAgIEludFJlY3QgZGly
dHlSZWN0ID0gZW5jbG9zaW5nQkJveDsKKyAgICBkaXJ0eVJlY3QuaW50ZXJzZWN0KGNsaXBSZWN0
KTsKKworICAgIHBhaW50SW50b0xheWVyKG1fb3duaW5nTGF5ZXIsICZjb250ZXh0LCBkaXJ0eVJl
Y3QsIGZhbHNlLCBQYWludFJlc3RyaWN0aW9uTm9uZSwgZHJhd2luZ1BoYXNlLCByZW5kZXJlcigp
KTsKK30KKworRmxvYXRQb2ludCBSZW5kZXJMYXllckJhY2tpbmc6OmNvbnZlcnRUb0NvbnRlbnRz
Q29vcmRpbmF0ZXMoY29uc3QgR3JhcGhpY3NMYXllciosIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50
KQoreworICAgIHJldHVybiBncmFwaGljc0xheWVyVG9Db250ZW50c0Nvb3JkaW5hdGVzKHBvaW50
KTsKK30KKworLy8gQ29tcG9zaXRpbmcgbGF5ZXIgaGl0IHRlc3Rpbmcgd29ya3MgbGlrZSB0aGlz
OgorLy8gICogaGl0VGVzdExheWVyKCkgaXMgY2FsbGVkIG9uIHRoZSByb290LgorLy8gICogaW4g
Y29tcG9zaXRpbmcgbW9kZSwgdGhhdCBjYWxscyBoaXRUZXN0Um9vdExheWVyKCkKKy8vICAqIGl0
IGNhbGxzIGZpbmRIaXRDb21wb3NpdGluZ0xheWVyKCkuCisvLyAgKiBmaW5kSGl0Q29tcG9zaXRp
bmdMYXllciBkb2VzIGhpdFRlc3RpbmcgdmlhIEdyYXBoaWNzTGF5ZXJzLCB3aGljaCBpbnZvbHZl
cworLy8gICAgICBjYWxsaW5nIGJhY2sgdmlhIGNvbnRlbnRzQ29udGFpblBvaW50KCkgdG8gZmlu
ZCBvdXQKKy8vICAgICAgaWYgdGhlIGdpdmVuIHBvaW50IHNob3VsZCBiZSBjb25zaWRlcmVkIHRv
IGJlICJpbnNpZGUiIHRoZSBsYXllciBiYXNlZCBvbgorLy8gICAgICBIVE1MIGhpdCB0ZXN0aW5n
IHJ1bGVzLgorLy8gICogT25jZSB3ZSd2ZSBmb3VuZCBhIGhpdCBjb21wb3NpdGluZyBsYXllciwg
aGl0VGVzdFJvb3RMYXllcigpIHRoZW4gZ29lcyBvbiB0bworLy8gICAgICBkbyBhIGZpbmFsIGhp
dFRlc3RMYXllcigpIGluIG9yZGVyIHRvIGZpbGwgaW4gcmVzdWx0LgorLy8KKy8vIEZJWE1FOiBt
b3ZlIHRvIFJlbmRlckxheWVyQ29tcG9zaXRvcj8KK1JlbmRlckxheWVyKiBSZW5kZXJMYXllckJh
Y2tpbmc6OmhpdFRlc3RSb290TGF5ZXIoUmVuZGVyTGF5ZXIqIHJvb3RMYXllciwgY29uc3QgSGl0
VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRSZWN0JiBoaXRUZXN0UmVj
dCwgY29uc3QgSW50UG9pbnQmIGhpdFRlc3RQb2ludCkKK3sKKyAgICBSZW5kZXJMYXllciogaGl0
Q29tcG9zaXRpbmdMYXllciA9IGZpbmRIaXRDb21wb3NpdGluZ0xheWVyKHJvb3RMYXllciwgcmVx
dWVzdCwgcmVzdWx0LCBoaXRUZXN0UmVjdCwgaGl0VGVzdFBvaW50KTsKKyAgICBpZiAoIWhpdENv
bXBvc2l0aW5nTGF5ZXIpIHsKKyAgICAgICAgLy8gV2UgZGlkbid0IGhpdCBhbnkgbGF5ZXIuIElm
IHdlIGFyZSB0aGUgcm9vdCBsYXllciBhbmQgdGhlIG1vdXNlIGlzIC0tIG9yIGp1c3Qgd2FzIC0t
IGRvd24sIAorICAgICAgICAvLyByZXR1cm4gb3Vyc2VsdmVzLiBXZSBkbyB0aGlzIHNvIG1vdXNl
IGV2ZW50cyBjb250aW51ZSBnZXR0aW5nIGRlbGl2ZXJlZCBhZnRlciBhIGRyYWcgaGFzIAorICAg
ICAgICAvLyBleGl0ZWQgdGhlIFdlYlZpZXcsIGFuZCBzbyBoaXQgdGVzdGluZyBvdmVyIGEgc2Ny
b2xsYmFyIGhpdHMgdGhlIGNvbnRlbnQgZG9jdW1lbnQuCisgICAgICAgIGlmICgocmVxdWVzdC5h
Y3RpdmUgfHwgcmVxdWVzdC5tb3VzZVVwKSAmJiByZW5kZXJlcigpLT5pc1JlbmRlclZpZXcoKSkg
eworICAgICAgICAgICAgbV9vd25pbmdMYXllci0+cmVuZGVyZXIoKS0+dXBkYXRlSGl0VGVzdFJl
c3VsdChyZXN1bHQsIGhpdFRlc3RQb2ludCk7CisgICAgICAgICAgICByZXR1cm4gbV9vd25pbmdM
YXllcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBpZiB3
ZSBoaXQgdGhlIHJvb3QgbGF5ZXIsIHdlJ3JlIGRvbmUKKyAgICBpZiAoaGl0Q29tcG9zaXRpbmdM
YXllciA9PSBtX293bmluZ0xheWVyKSB7CisgICAgICAgIG1fb3duaW5nTGF5ZXItPnJlbmRlcmVy
KCktPnVwZGF0ZUhpdFRlc3RSZXN1bHQocmVzdWx0LCBoaXRUZXN0UG9pbnQpOworICAgICAgICBy
ZXR1cm4gbV9vd25pbmdMYXllcjsKKyAgICB9CisKKyAgICAvLyBjb252ZXJ0IGhpdFRlc3RQb2lu
dCB0byBjb29yZHMgb2YgdGhlIGhpdCBsYXllcgorICAgIEZsb2F0UG9pbnQgaGl0UG9pbnQgPSBj
b252ZXJ0UG9pbnRUb0xheWVyKGhpdFRlc3RQb2ludCwgaGl0Q29tcG9zaXRpbmdMYXllcik7Cisg
ICAgSW50UG9pbnQgZGVzdEhpdFRlc3RQb2ludChyb3VuZGYoaGl0UG9pbnQueCgpKSwgcm91bmRm
KGhpdFBvaW50LnkoKSkpOworICAgIAorICAgIC8vIGNvbnZlcnQgaGl0VGVzdFJlY3QgdG8gdGhl
IGhpdCBsYXllciBieSBtYXBwaW5nIGEgcXVhZCwgdGhlbiBnZXR0aW5nIGl0cworICAgIC8vIGJv
dW5kaW5nIGJveAorICAgIEludFJlY3QgZGVzdEhpdFRlc3RSZWN0OworICAgIHsKKyAgICAgICAg
Ly8gRklYTUU6IG1vdmUgaW50byBhIGhlbHBlciBmdW5jdGlvbgorICAgICAgICBGbG9hdFF1YWQg
ICBoaXRUZXN0UXVhZChoaXRUZXN0UmVjdCk7CisgICAgICAgIEdyYXBoaWNzTGF5ZXIqIGRlc3RD
b21wb3NpdGluZ0xheWVyID0gaGl0Q29tcG9zaXRpbmdMYXllci0+YmFja2luZygpLT5ncmFwaGlj
c0xheWVyKCk7CisgICAgICAgIEludFNpemUgY29udGVudE9mZnNldCA9IGNvbnRlbnRPZmZzZXRJ
bkNvbXBvc3RpbmdMYXllcigpOworICAgICAgICBoaXRUZXN0UXVhZC5tb3ZlKGNvbnRlbnRPZmZz
ZXQud2lkdGgoKSwgY29udGVudE9mZnNldC5oZWlnaHQoKSk7CisKKyAgICAgICAgZ3JhcGhpY3NM
YXllcigpLT5jb252ZXJ0UXVhZFRvTGF5ZXIoaGl0VGVzdFF1YWQsIGRlc3RDb21wb3NpdGluZ0xh
eWVyKTsKKworICAgICAgICBJbnRTaXplIGRlc3RDb250ZW50T2Zmc2V0ID0gaGl0Q29tcG9zaXRp
bmdMYXllci0+YmFja2luZygpLT5jb250ZW50T2Zmc2V0SW5Db21wb3N0aW5nTGF5ZXIoKTsKKyAg
ICAgICAgaGl0VGVzdFF1YWQubW92ZSgtZGVzdENvbnRlbnRPZmZzZXQud2lkdGgoKSwgLWRlc3RD
b250ZW50T2Zmc2V0LmhlaWdodCgpKTsKKyAgICAgICAgZGVzdEhpdFRlc3RSZWN0ID0gZW5jbG9z
aW5nSW50UmVjdChoaXRUZXN0UXVhZC5ib3VuZGluZ0JveCgpKTsKKyAgICB9CisKKyAgICAvLyBj
bGVhciBvdXQgdGhlIHN0YXRlIGluIHJlc3VsdCB0aGF0IHdlIG1heSBoYXZlIHNldCBpbiBjb250
ZW50c0NvbnRhaW5Qb2ludCgpLAorICAgIC8vIGFuZCBydW4gaGl0IHRlc3Rpbmcgb24gdGhlIGhp
dCBjb21wb3NpdGluZyBsYXllcgorICAgIHJlc3VsdC5zZXRJbm5lck5vZGUoMCk7CisgICAgcmVz
dWx0LnNldElubmVyTm9uU2hhcmVkTm9kZSgwKTsKKyAgICByZXR1cm4gaGl0Q29tcG9zaXRpbmdM
YXllci0+aGl0VGVzdExheWVyKGhpdENvbXBvc2l0aW5nTGF5ZXIsIHJlcXVlc3QsIHJlc3VsdCwg
ZGVzdEhpdFRlc3RSZWN0LCBkZXN0SGl0VGVzdFBvaW50KTsKK30KKworLy8gaGl0VGVzdFBvaW50
IGFuZCBoaXRUZXN0UmVjdCBhcmUgaW4gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHJvb3RMYXll
cgorUmVuZGVyTGF5ZXIqIFJlbmRlckxheWVyQmFja2luZzo6ZmluZEhpdENvbXBvc2l0aW5nTGF5
ZXIoUmVuZGVyTGF5ZXIqIHJvb3RMYXllciwgY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3Qs
IEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgY29uc3QgSW50UmVjdCYgaGl0VGVzdFJlY3QsIGNvbnN0
IEludFBvaW50JiBoaXRUZXN0UG9pbnQpCit7CisgICAgTGF5ZXJIaXRUZXN0RGF0YSBoaXRUZXN0
RGF0YShyb290TGF5ZXIsIHJlcXVlc3QsIHJlc3VsdCwgaGl0VGVzdFJlY3QpOworCisgICAgLy8g
Q2FsY3VsYXRlIHRoZSBjbGlwIHJlY3RzIHdlIHNob3VsZCB1c2UuCisgICAgSW50UmVjdCBsYXll
ckJvdW5kczsKKyAgICBJbnRSZWN0IGJnUmVjdDsKKyAgICBJbnRSZWN0IGZnUmVjdDsKKyAgICBJ
bnRSZWN0IG91dGxpbmVSZWN0OworICAgIG1fb3duaW5nTGF5ZXItPmNhbGN1bGF0ZVJlY3RzKHJv
b3RMYXllciwgaGl0VGVzdFJlY3QsIGxheWVyQm91bmRzLCBiZ1JlY3QsIGZnUmVjdCwgb3V0bGlu
ZVJlY3QpOworCisgICAgLy8gQ2hlY2sgb3VyIGxpc3RzIGFyZSB1cC10by1kYXRlLgorICAgIEFT
U0VSVCghbV9vd25pbmdMYXllci0+aXNTdGFja2luZ0NvbnRleHQoKSB8fCAhbV9vd25pbmdMYXll
ci0+bV96T3JkZXJMaXN0c0RpcnR5KTsKKyAgICBBU1NFUlQoIW1fb3duaW5nTGF5ZXItPmlzU3Rh
Y2tpbmdDb250ZXh0KCkgfHwgIW1fb3duaW5nTGF5ZXItPm1fb3ZlcmZsb3dMaXN0RGlydHkpOwor
CisgICAgR3JhcGhpY3NMYXllciogcm9vdEdyYXBoaWNzTGF5ZXIgPSBjb21wb3NpdG9yKCktPnJv
b3RQbGF0Zm9ybUxheWVyKCk7CisKKyAgICAvLyBjb252ZXJ0IGhpdFRlc3RQb2ludCB0byB0aGUg
Y29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIGNvbXBvc2l0aW5nIGxheWVyCisgICAgRmxvYXRQb2lu
dCBoaXRQb2ludCA9IGNvbnRlbnRzVG9HcmFwaGljc0xheWVyQ29vcmRpbmF0ZXMoaGl0VGVzdFBv
aW50KTsKKworICAgIC8vIFdlIGFzc3VtZSBoZXJlIHRoYXQgdGhlIHJlc3VsdC5wb2ludCgpIGlz
IGluIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiBtX2dyYXBoaWNzTGF5ZXIsIHNvIHdlCisgICAg
Ly8gY29udmVydCB0byB0aGUgcm9vdCBsYXllciwgc2luY2Ugd2UgbmVlZCB0byBwYXNzIHN1cGVy
bGF5ZXItcmVsYXRpdmUgY29vcmRpbmF0ZXMgaW50bworICAgIC8vIHRoZSBoaXRUZXN0LgorICAg
IGhpdFBvaW50ID0gbV9ncmFwaGljc0xheWVyLT5jb252ZXJ0UG9pbnRUb0xheWVyKGhpdFBvaW50
LCByb290R3JhcGhpY3NMYXllcik7CisKKyAgICAvLyBhcyBoaXRUZXN0IGlzIGNhbGxlZCBvbiBM
Q0xheWVycywgY29udGVudHNDb250YWluUG9pbnQoKSBpcyBjYWxsZWQgZm9yIGVhY2ggY29tcG9z
aXRpbmcgbGF5ZXIKKyAgICBHcmFwaGljc0xheWVyKiBoaXRMYXllciA9IG1fZ3JhcGhpY3NMYXll
ci0+aGl0VGVzdChoaXRQb2ludCwgJmhpdFRlc3REYXRhKTsKKyAgICBpZiAoIWhpdExheWVyKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIG5vdGUgdGhhdCBoaXRMYXllciBtYXkgYmUgYSBt
X2NvbnRlbnRzTGF5ZXIsIGJ1dCB3ZSBzaG91bGQgbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgc3Bl
Y2lhbAorCisgICAgLy8gQ29udmVydCB0aGUgcG9pbnQgdG8gdGhlIGNvb3JkcyBvZiB0aGUgaGl0
IEdyYXBoaWNzTGF5ZXIsIHdoaWNoIHRha2VzCisgICAgLy8gbGF5ZXIgdHJhbnNmb3JtcyBpbnRv
IGFjY291bnQKKyAgICBoaXRQb2ludCA9IHJvb3RHcmFwaGljc0xheWVyLT5jb252ZXJ0UG9pbnRU
b0xheWVyKGhpdFBvaW50LCBoaXRMYXllcik7CisKKyAgICAvLyBUaGVuIGNvbnZlcnQgaXQgYmFj
ayB0byB0aGUgY29vcmRzIG9mIHRoZSByb290IGxheWVyLiBXZSBkbyBhbGwKKyAgICAvLyB0aGUg
aGl0IHRlc3RpbmcgaW4gcm9vdC1yZWxhdGl2ZSBjb29yZHMsIGJlY2F1c2UgYWxsIHRoZSBjbGlw
IHJlY3RzCisgICAgLy8gYXJlIHJvb3QtcmVsYXRpdmUgKGp1c3QgbGlrZSBwYWludGluZykuCisg
ICAgUmVuZGVyTGF5ZXJCYWNraW5nKiBoaXRMYXllckJhY2tpbmcgPSBzdGF0aWNfY2FzdDxSZW5k
ZXJMYXllckJhY2tpbmcqPihoaXRMYXllci0+Y2xpZW50KCkpOworICAgIFJlbmRlckxheWVyKiBo
aXRSZW5kZXJMYXllciA9IGhpdExheWVyQmFja2luZyA/IGhpdExheWVyQmFja2luZy0+b3duaW5n
TGF5ZXIoKSA6IDA7CisgICAgQVNTRVJUKGhpdFJlbmRlckxheWVyKTsKKyAgICByZXR1cm4gaGl0
UmVuZGVyTGF5ZXI7Cit9CisKKy8vIHVwLWNhbGwgZnJvbSBjb21wb3NpdGluZyBsYXllciBoaXQg
dGVzdGluZyBtYWNoaW5lcnkuIGluUG9pbnQgaXMgaW4gdGhpcyBsYXllciBjb29yZGluYXRlcy4K
K2Jvb2wgUmVuZGVyTGF5ZXJCYWNraW5nOjpjb250ZW50c0NvbnRhaW5Qb2ludChjb25zdCBHcmFw
aGljc0xheWVyKiwgY29uc3QgSW50UG9pbnQmIHBvaW50LCBHcmFwaGljc0xheWVyUGFpbnRpbmdQ
aGFzZSBjb21wb3NpdGVQaGFzZSwgc3RydWN0IExheWVySGl0VGVzdERhdGEqIGhpdFRlc3REYXRh
KQoreworICAgIFJlbmRlckxheWVyKiByb290TGF5ZXIgPSBoaXRUZXN0RGF0YS0+bV9yb290TGF5
ZXI7CisgICAgY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QgPSBoaXRUZXN0RGF0YS0+bV9y
ZXF1ZXN0OworICAgIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCA9IGhpdFRlc3REYXRhLT5tX3Jlc3Vs
dDsKKyAgICBJbnRSZWN0IGhpdFRlc3RSZWN0ID0gaGl0VGVzdERhdGEtPm1faGl0VGVzdFJlY3Q7
CisKKyAgICAvLyBtYXAgaGl0VGVzdFJlY3QgdG8gdGhpcyBsYXllcgorICAgIEZsb2F0UXVhZCBo
aXRUZXN0UXVhZChoaXRUZXN0UmVjdCk7CisKKyAgICBHcmFwaGljc0xheWVyKiByb290Q29tcG9z
aXRpbmdMYXllciA9IHJvb3RMYXllci0+YmFja2luZygpLT5ncmFwaGljc0xheWVyKCk7CisgICAg
SW50U2l6ZSByb290Q29udGVudE9mZnNldCA9IHJvb3RMYXllci0+YmFja2luZygpLT5jb250ZW50
T2Zmc2V0SW5Db21wb3N0aW5nTGF5ZXIoKTsKKyAgICBoaXRUZXN0UXVhZC5tb3ZlKHJvb3RDb250
ZW50T2Zmc2V0LndpZHRoKCksIHJvb3RDb250ZW50T2Zmc2V0LmhlaWdodCgpKTsKKworICAgIHJv
b3RDb21wb3NpdGluZ0xheWVyLT5jb252ZXJ0UXVhZFRvTGF5ZXIoaGl0VGVzdFF1YWQsIGdyYXBo
aWNzTGF5ZXIoKSk7CisKKyAgICBJbnRTaXplIGNvbnRlbnRPZmZzZXQgPSBjb250ZW50T2Zmc2V0
SW5Db21wb3N0aW5nTGF5ZXIoKTsKKyAgICBoaXRUZXN0UXVhZC5tb3ZlKC1jb250ZW50T2Zmc2V0
LndpZHRoKCksIC1jb250ZW50T2Zmc2V0LmhlaWdodCgpKTsKKworICAgIEludFJlY3QgZGVzdEhp
dFRlc3RSZWN0ID0gZW5jbG9zaW5nSW50UmVjdChoaXRUZXN0UXVhZC5ib3VuZGluZ0JveCgpKTsK
KyAgICBoaXRUZXN0UmVjdCA9IGRlc3RIaXRUZXN0UmVjdDsKKworICAgIC8vIHVzZSB0aGlzIGxh
eWVyIGFzIHRoZSBoaXQgdGVzdGluZyByb290CisgICAgcm9vdExheWVyID0gbV9vd25pbmdMYXll
cjsKKworICAgIC8vIGluUG9pbnQgaXMgYWxyZWFkeSBpbiB0aGUgY29vcmRzIG9mIHRoaXMgbGF5
ZXIKKyAgICBJbnRQb2ludCBoaXRUZXN0UG9pbnQgPSBwb2ludDsKKworICAgIC8vIENhbGN1bGF0
ZSB0aGUgY2xpcCByZWN0cyB3ZSBzaG91bGQgdXNlLgorICAgIEludFJlY3QgbGF5ZXJCb3VuZHM7
CisgICAgSW50UmVjdCBiZ1JlY3Q7CisgICAgSW50UmVjdCBmZ1JlY3Q7CisgICAgSW50UmVjdCBv
dXRsaW5lUmVjdDsKKyAgICBtX293bmluZ0xheWVyLT5jYWxjdWxhdGVSZWN0cyhyb290TGF5ZXIs
IGhpdFRlc3RSZWN0LCBsYXllckJvdW5kcywgYmdSZWN0LCBmZ1JlY3QsIG91dGxpbmVSZWN0KTsK
KworICAgIFJlbmRlckxheWVyKiBpbnNpZGVMYXllciA9IDA7CisKKyAgICBBU1NFUlQobV9vd25p
bmdMYXllci0+aXNTdGFja2luZ0NvbnRleHQoKSB8fCAoIW1fb3duaW5nTGF5ZXItPm1fcG9zWk9y
ZGVyTGlzdCB8fCBtX293bmluZ0xheWVyLT5tX3Bvc1pPcmRlckxpc3QtPnNpemUoKSA9PSAwKSk7
CisgICAgCisgICAgLy8gRklYTUU6IHNoYXJlIHRoaXMgY29kZSB3aXRoIGhpdFRlc3RMYXllciBh
Ym92ZQorICAgIGlmIChjb21wb3NpdGVQaGFzZSAmIEdyYXBoaWNzTGF5ZXJQYWludEZvcmVncm91
bmRNYXNrKSB7CisgICAgICAgIC8vIEJlZ2luIGJ5IHdhbGtpbmcgb3VyIGxpc3Qgb2YgcG9zaXRp
dmUgbGF5ZXJzIGZyb20gaGlnaGVzdCB6LWluZGV4IGRvd24gdG8gdGhlIGxvd2VzdAorICAgICAg
ICAvLyB6LWluZGV4LiBPbmx5IHRlc3Qgbm9uLWNvbXBvc2l0aW5nIGxheWVycywgc2luY2UgdGhl
IGZpcnN0IGhpdFRlc3RMYXllciB3aWxsIGhhdmUgZm91bmQKKyAgICAgICAgLy8gYW55IGhpdCBj
b21wb3NpdGluZyBsYXllcnMuCisgICAgICAgIFZlY3RvcjxSZW5kZXJMYXllcio+KiBwb3NaT3Jk
ZXJMaXN0ID0gbV9vd25pbmdMYXllci0+cG9zWk9yZGVyTGlzdCgpOworICAgICAgICBpZiAocG9z
Wk9yZGVyTGlzdCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBvc1pPcmRlckxpc3QtPnNp
emUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICAgICAgUmVuZGVyTGF5ZXIqIGN1
ckxheWVyID0gcG9zWk9yZGVyTGlzdC0+YXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKCFjdXJM
YXllci0+aXNDb21wb3NpdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zaWRlTGF5ZXIg
PSBjdXJMYXllci0+aGl0VGVzdExheWVyKHJvb3RMYXllciwgcmVxdWVzdCwgcmVzdWx0LCBoaXRU
ZXN0UmVjdCwgaGl0VGVzdFBvaW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc2lkZUxh
eWVyKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IGNoZWNrIG91
ciBvdmVyZmxvdyBvYmplY3RzLgorICAgICAgICBWZWN0b3I8UmVuZGVyTGF5ZXIqPiogb3ZlcmZs
b3dMaXN0ID0gbV9vd25pbmdMYXllci0+b3ZlcmZsb3dMaXN0KCk7CisgICAgICAgIGlmIChvdmVy
Zmxvd0xpc3QpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBvdmVyZmxvd0xpc3QtPnNpemUo
KSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICAgICAgUmVuZGVyTGF5ZXIqIGN1ckxh
eWVyID0gb3ZlcmZsb3dMaXN0LT5hdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWN1ckxheWVy
LT5pc0NvbXBvc2l0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnNpZGVMYXllciA9IGN1
ckxheWVyLT5oaXRUZXN0TGF5ZXIocm9vdExheWVyLCByZXF1ZXN0LCByZXN1bHQsIGhpdFRlc3RS
ZWN0LCBoaXRUZXN0UG9pbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zaWRlTGF5ZXIp
CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOZXh0IHdlIHdhbnQgdG8g
c2VlIGlmIHRoZSBtb3VzZSBwb3MgaXMgaW5zaWRlIHRoZSBjaGlsZCBSZW5kZXJPYmplY3RzIG9m
IHRoZSBsYXllci4KKyAgICAgICAgaWYgKGZnUmVjdC5jb250YWlucyhoaXRUZXN0UG9pbnQpICYm
IAorICAgICAgICAgICAgcmVuZGVyZXIoKS0+aGl0VGVzdChyZXF1ZXN0LCByZXN1bHQsIGhpdFRl
c3RQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJCb3VuZHMueCgp
IC0gcmVuZGVyZXIoKS0+eFBvcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBs
YXllckJvdW5kcy55KCkgLSByZW5kZXJlcigpLT55UG9zKCkgKyByZW5kZXJlcigpLT5ib3JkZXJU
b3BFeHRyYSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGl0VGVzdERlc2Nl
bmRhbnRzKSkgeworICAgICAgICAgICAgLy8gRm9yIHBvc2l0aW9uZWQgZ2VuZXJhdGVkIGNvbnRl
bnQsIHdlIG1pZ2h0IHN0aWxsIG5vdCBoYXZlIGEKKyAgICAgICAgICAgIC8vIG5vZGUgYnkgdGhl
IHRpbWUgd2UgZ2V0IHRvIHRoZSBsYXllciBsZXZlbCwgc2luY2Ugbm9uZSBvZgorICAgICAgICAg
ICAgLy8gdGhlIGNvbnRlbnQgaW4gdGhlIGxheWVyIGhhcyBhbiBlbGVtZW50LiBTbyBqdXN0IHdh
bGsgdXAKKyAgICAgICAgICAgIC8vIHRoZSB0cmVlLgorICAgICAgICAgICAgaWYgKCFyZXN1bHQu
aW5uZXJOb2RlKCkgfHwgIXJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKSkgeworICAgICAgICAg
ICAgICAgIE5vZGUqIGUgPSBtX293bmluZ0xheWVyLT5lbmNsb3NpbmdFbGVtZW50KCk7CisgICAg
ICAgICAgICAgICAgaWYgKCFyZXN1bHQuaW5uZXJOb2RlKCkpCisgICAgICAgICAgICAgICAgICAg
IHJlc3VsdC5zZXRJbm5lck5vZGUoZSk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuaW5u
ZXJOb25TaGFyZWROb2RlKCkpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRJbm5lck5v
blNoYXJlZE5vZGUoZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdyBjaGVjayBvdXIgbmVnYXRpdmUgei1pbmRleCBj
aGlsZHJlbi4KKyAgICAgICAgVmVjdG9yPFJlbmRlckxheWVyKj4qIG5lZ1pPcmRlckxpc3QgPSBt
X293bmluZ0xheWVyLT5uZWdaT3JkZXJMaXN0KCk7CisgICAgICAgIGlmIChuZWdaT3JkZXJMaXN0
KSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbmVnWk9yZGVyTGlzdC0+c2l6ZSgpIC0gMTsg
aSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICBSZW5kZXJMYXllciogY3VyTGF5ZXIgPSBu
ZWdaT3JkZXJMaXN0LT5hdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWN1ckxheWVyLT5pc0Nv
bXBvc2l0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnNpZGVMYXllciA9IG5lZ1pPcmRl
ckxpc3QtPmF0KGkpLT5oaXRUZXN0TGF5ZXIocm9vdExheWVyLCByZXF1ZXN0LCByZXN1bHQsIGhp
dFRlc3RSZWN0LCBoaXRUZXN0UG9pbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zaWRl
TGF5ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29tcG9z
aXRlUGhhc2UgJiBHcmFwaGljc0xheWVyUGFpbnRCYWNrZ3JvdW5kTWFzaykgeworICAgICAgICBp
ZiAoYmdSZWN0LmNvbnRhaW5zKGhpdFRlc3RQb2ludCkgJiYKKyAgICAgICAgICAgIHJlbmRlcmVy
KCktPmhpdFRlc3QocmVxdWVzdCwgcmVzdWx0LCBoaXRUZXN0UG9pbnQsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGxheWVyQm91bmRzLngoKSAtIHJlbmRlcmVyKCktPnhQb3MoKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJCb3VuZHMueSgpIC0gcmVuZGVy
ZXIoKS0+eVBvcygpICsgcmVuZGVyZXIoKS0+Ym9yZGVyVG9wRXh0cmEoKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgSGl0VGVzdFNlbGYpKSB7CisgICAgICAgICAgICBpZiAoIXJl
c3VsdC5pbm5lck5vZGUoKSB8fCAhcmVzdWx0LmlubmVyTm9uU2hhcmVkTm9kZSgpKSB7CisgICAg
ICAgICAgICAgICAgTm9kZSogZSA9IG1fb3duaW5nTGF5ZXItPmVuY2xvc2luZ0VsZW1lbnQoKTsK
KyAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5pbm5lck5vZGUoKSkKKyAgICAgICAgICAgICAg
ICAgICAgcmVzdWx0LnNldElubmVyTm9kZShlKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJlc3Vs
dC5pbm5lck5vblNoYXJlZE5vZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldElu
bmVyTm9uU2hhcmVkTm9kZShlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJl
bmRlckxheWVyQmFja2luZzo6c3RhcnRBbmltYXRpb24oZG91YmxlIGJlZ2luVGltZSwgY29uc3Qg
QW5pbWF0aW9uKiBhbmltLCBjb25zdCBLZXlmcmFtZUxpc3QmIGtleWZyYW1lcykKK3sKKyAgICBi
b29sIGhhc09wYWNpdHkgPSBrZXlmcmFtZXMuY29udGFpbnNQcm9wZXJ0eShDU1NQcm9wZXJ0eU9w
YWNpdHkpOworICAgIGJvb2wgaGFzVHJhbnNmb3JtID0ga2V5ZnJhbWVzLmNvbnRhaW5zUHJvcGVy
dHkoQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm0pOworICAgIAorICAgIGlmICghaGFzT3BhY2l0
eSAmJiAhaGFzVHJhbnNmb3JtKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgR3Jh
cGhpY3NMYXllcjo6VHJhbnNmb3JtVmFsdWVMaXN0IHRyYW5zZm9ybVZlY3RvcjsKKyAgICBHcmFw
aGljc0xheWVyOjpGbG9hdFZhbHVlTGlzdCBvcGFjaXR5VmVjdG9yOworCisgICAgZm9yIChWZWN0
b3I8S2V5ZnJhbWVWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0ga2V5ZnJhbWVzLmJlZ2luS2V5
ZnJhbWVzKCk7IGl0ICE9IGtleWZyYW1lcy5lbmRLZXlmcmFtZXMoKTsgKytpdCkgeworICAgICAg
ICBjb25zdCBSZW5kZXJTdHlsZSoga2V5ZnJhbWVTdHlsZSA9IGl0LT5zdHlsZSgpOworICAgICAg
ICBmbG9hdCBrZXkgPSBpdC0+a2V5KCk7CisKKyAgICAgICAgaWYgKCFrZXlmcmFtZVN0eWxlKQor
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAKKyAgICAgICAgLy8gZ2V0IHRpbWlu
ZyBmdW5jdGlvbgorICAgICAgICBjb25zdCBUaW1pbmdGdW5jdGlvbiogdGYgPSBrZXlmcmFtZVN0
eWxlLT5oYXNBbmltYXRpb25zKCkgPyAmKCgqa2V5ZnJhbWVTdHlsZS0+YW5pbWF0aW9ucygpKS5h
bmltYXRpb24oMCktPnRpbWluZ0Z1bmN0aW9uKCkpIDogMDsKKyAgICAgICAgCisgICAgICAgIGlm
IChoYXNUcmFuc2Zvcm0pCisgICAgICAgICAgICB0cmFuc2Zvcm1WZWN0b3IuaW5zZXJ0KGtleSwg
JihrZXlmcmFtZVN0eWxlLT50cmFuc2Zvcm0oKSksIHRmKTsKKworICAgICAgICBpZiAoaGFzT3Bh
Y2l0eSkKKyAgICAgICAgICAgIG9wYWNpdHlWZWN0b3IuaW5zZXJ0KGtleSwga2V5ZnJhbWVTdHls
ZS0+b3BhY2l0eSgpLCB0Zik7CisgICAgfQorCisgICAgYm9vbCBkaWRBbmltYXRlVHJhbnNmb3Jt
ID0gIWhhc1RyYW5zZm9ybTsKKyAgICBib29sIGRpZEFuaW1hdGVPcGFjaXR5ID0gIWhhc09wYWNp
dHk7CisgICAgCisgICAgaWYgKGhhc1RyYW5zZm9ybSAmJiBtX2dyYXBoaWNzTGF5ZXItPmFuaW1h
dGVUcmFuc2Zvcm0odHJhbnNmb3JtVmVjdG9yLCByZW5kZXJlcigpLT5ib3JkZXJCb3goKS5zaXpl
KCksIGFuaW0sIGJlZ2luVGltZSwgZmFsc2UpKQorICAgICAgICBkaWRBbmltYXRlVHJhbnNmb3Jt
ID0gdHJ1ZTsKKworICAgIGlmIChoYXNPcGFjaXR5ICYmIG1fZ3JhcGhpY3NMYXllci0+YW5pbWF0
ZUZsb2F0KEFuaW1hdGVkUHJvcGVydHlPcGFjaXR5LCBvcGFjaXR5VmVjdG9yLCBhbmltLCBiZWdp
blRpbWUpKQorICAgICAgICBkaWRBbmltYXRlT3BhY2l0eSA9IHRydWU7CisgICAgCisgICAgcmV0
dXJuIGRpZEFuaW1hdGVUcmFuc2Zvcm0gJiYgZGlkQW5pbWF0ZU9wYWNpdHk7Cit9CisKK2Jvb2wg
UmVuZGVyTGF5ZXJCYWNraW5nOjpzdGFydFRyYW5zaXRpb24oZG91YmxlIGJlZ2luVGltZSwgaW50
IHByb3BlcnR5LCBjb25zdCBSZW5kZXJTdHlsZSogZnJvbVN0eWxlLCBjb25zdCBSZW5kZXJTdHls
ZSogdG9TdHlsZSkKK3sKKyAgICBib29sIGRpZEFuaW1hdGUgPSBmYWxzZTsKKyAgICAKKyAgICBp
ZiAocHJvcGVydHkgPT0gY0FuaW1hdGVBbGwgfHwgcHJvcGVydHkgPT0gKGludClDU1NQcm9wZXJ0
eU9wYWNpdHkpIHsKKyAgICAgICAgY29uc3QgQW5pbWF0aW9uKiBvcGFjaXR5QW5pbSA9IHRvU3R5
bGUtPnRyYW5zaXRpb25Gb3JQcm9wZXJ0eShDU1NQcm9wZXJ0eU9wYWNpdHkpOworICAgICAgICBp
ZiAob3BhY2l0eUFuaW0gJiYgIW9wYWNpdHlBbmltLT5pc0VtcHR5T3JaZXJvRHVyYXRpb24oKSkg
eworICAgICAgICAgICAgLy8gSWYgYmVnaW5UaW1lIGlzIG5vdCAwLCB3ZSBhcmUgcmVzdGFydGlu
ZyB0aGlzIHRyYW5zaXRpb24sIHNvIGZpcnN0IHNldCB0aGUgZnJvbSB2YWx1ZQorICAgICAgICAg
ICAgLy8gaW4gY2FzZSBpdCB3YXMgc21hc2hlZCBieSBhIHByZXZpb3VzIGFuaW1hdGlvbi4KKyAg
ICAgICAgICAgIGlmIChiZWdpblRpbWUgPiAwKQorICAgICAgICAgICAgICAgIG1fZ3JhcGhpY3NM
YXllci0+c2V0T3BhY2l0eShjb21wb3NpdGluZ09wYWNpdHkoZnJvbVN0eWxlLT5vcGFjaXR5KCkp
LCAwLCAwKTsKKworICAgICAgICAgICAgaWYgKG1fZ3JhcGhpY3NMYXllci0+c2V0T3BhY2l0eShj
b21wb3NpdGluZ09wYWNpdHkodG9TdHlsZS0+b3BhY2l0eSgpKSwgb3BhY2l0eUFuaW0sIGJlZ2lu
VGltZSkpCisgICAgICAgICAgICAgICAgZGlkQW5pbWF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAg
ICB9CisgICAgaWYgKHByb3BlcnR5ID09IGNBbmltYXRlQWxsIHx8IHByb3BlcnR5ID09IChpbnQp
Q1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm0pIHsKKyAgICAgICAgLy8gV2UgZ2V0IGEgVHJhbnNm
b3JtT3BlcmF0aW9uLCB3aGljaCBpcyBhIGxpbmtlZCBsaXN0IG9mIHByaW1pdGl2ZSBvcGVyYXRp
b25zIGFuZCB0aGVpciBhcmd1bWVudHMuCisgICAgICAgIC8vIEFyZ3VtZW50cyBjYW4gYmUgZmxv
YXRzIG9yIExlbmd0aCB2YWx1ZXMsIHdoaWNoIG5lZWQgdG8gYmUgY29udmVydGVkIHRvIG51bWJl
cnMgdXNpbmcKKyAgICAgICAgLy8gdmFsLmNhbGNGbG9hdFZhbHVlKHJlbmRlcmVyKCktPndpZHRo
KCkpIChvciBoZWlnaHQoKSkuCisgICAgICAgIGNvbnN0IEFuaW1hdGlvbiogdHJhbnNmb3JtQW5p
bSA9IHRvU3R5bGUtPnRyYW5zaXRpb25Gb3JQcm9wZXJ0eShDU1NQcm9wZXJ0eVdlYmtpdFRyYW5z
Zm9ybSk7CisgICAgICAgIGlmICh0cmFuc2Zvcm1BbmltICYmICF0cmFuc2Zvcm1BbmltLT5pc0Vt
cHR5T3JaZXJvRHVyYXRpb24oKSkgeworICAgICAgICAgICAgR3JhcGhpY3NMYXllcjo6VHJhbnNm
b3JtVmFsdWVMaXN0IHRyYW5zZm9ybVZlY3RvcjsKKyAgICAgICAgICAgIHRyYW5zZm9ybVZlY3Rv
ci5pbnNlcnQoMCwgJmZyb21TdHlsZS0+dHJhbnNmb3JtKCksIDApOyAgICAgICAgCisgICAgICAg
ICAgICB0cmFuc2Zvcm1WZWN0b3IuaW5zZXJ0KDEsICZ0b1N0eWxlLT50cmFuc2Zvcm0oKSwgMCk7
ICAgICAgICAKKyAgICAgICAgICAgIGlmIChtX2dyYXBoaWNzTGF5ZXItPmFuaW1hdGVUcmFuc2Zv
cm0odHJhbnNmb3JtVmVjdG9yLCByZW5kZXJlcigpLT5ib3JkZXJCb3goKS5zaXplKCksIHRyYW5z
Zm9ybUFuaW0sIGJlZ2luVGltZSwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgZGlkQW5pbWF0ZSA9
IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIGRpZEFuaW1hdGU7Cit9
CisKK3ZvaWQgUmVuZGVyTGF5ZXJCYWNraW5nOjpub3RpZnlUcmFuc2l0aW9uU3RhcnRlZChjb25z
dCBHcmFwaGljc0xheWVyKiwgQW5pbWF0ZWRQcm9wZXJ0eUlEIHByb3BlcnR5LCBkb3VibGUgdGlt
ZSkKK3sKKyAgICBpbnQgY3NzUHJvcGVydHkgPSBDU1NQcm9wZXJ0eUludmFsaWQ7CisgICAgc3dp
dGNoIChwcm9wZXJ0eSkgeworICAgICAgICBjYXNlIEFuaW1hdGVkUHJvcGVydHlJbnZhbGlkOgor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eVdlYmtpdFRy
YW5zZm9ybToKKyAgICAgICAgICAgIGNzc1Byb3BlcnR5ID0gQ1NTUHJvcGVydHlXZWJraXRUcmFu
c2Zvcm07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBbmltYXRlZFByb3BlcnR5
T3BhY2l0eToKKyAgICAgICAgICAgIGNzc1Byb3BlcnR5ID0gQ1NTUHJvcGVydHlPcGFjaXR5Owor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eUJhY2tncm91
bmRDb2xvcjoKKyAgICAgICAgICAgIGNzc1Byb3BlcnR5ID0gQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
Q29sb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgcmVuZGVyZXIoKS0+
bm90aWZ5VHJhbnNpdGlvblN0YXJ0ZWQoY3NzUHJvcGVydHksIHRpbWUpOworfQorCit2b2lkIFJl
bmRlckxheWVyQmFja2luZzo6bm90aWZ5QW5pbWF0aW9uU3RhcnRlZChjb25zdCBHcmFwaGljc0xh
eWVyKiwgZG91YmxlIHRpbWUpCit7CisgICAgcmVuZGVyZXIoKS0+bm90aWZ5QW5pbWF0aW9uU3Rh
cnRlZCh0aW1lKTsKK30KKwordm9pZCBSZW5kZXJMYXllckJhY2tpbmc6OmFuaW1hdGlvbkZpbmlz
aGVkKGNvbnN0IFN0cmluZyYgbmFtZSwgaW50IGluZGV4LCBib29sIHJlc2V0KQoreworICAgIG1f
Z3JhcGhpY3NMYXllci0+cmVtb3ZlRmluaXNoZWRBbmltYXRpb25zKG5hbWUsIGluZGV4LCByZXNl
dCk7Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJCYWNraW5nOjp0cmFuc2l0aW9uRmluaXNoZWQoaW50
IHByb3BlcnR5KQoreworICAgIG1fZ3JhcGhpY3NMYXllci0+cmVtb3ZlRmluaXNoZWRUcmFuc2l0
aW9ucyhwcm9wZXJ0eSk7Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJCYWNraW5nOjpzdXNwZW5kQW5p
bWF0aW9ucygpCit7CisgICAgbV9ncmFwaGljc0xheWVyLT5zdXNwZW5kQW5pbWF0aW9ucygpOwor
fQorCit2b2lkIFJlbmRlckxheWVyQmFja2luZzo6cmVzdW1lQW5pbWF0aW9ucygpCit7CisgICAg
bV9ncmFwaGljc0xheWVyLT5yZXN1bWVBbmltYXRpb25zKCk7Cit9CisKK0Zsb2F0UG9pbnQgUmVu
ZGVyTGF5ZXJCYWNraW5nOjpjb252ZXJ0UG9pbnRUb0xheWVyKGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50LCBSZW5kZXJMYXllciogdGFyZ2V0TGF5ZXIpCit7CisgICAgUmVuZGVyTGF5ZXIqIHNyY0Nv
bXBMYXllciA9IGNvbXBvc2l0b3IoKS0+ZW5jbG9zaW5nQ29tcG9zaXRpbmdMYXllcihtX293bmlu
Z0xheWVyKTsKKyAgICBSZW5kZXJMYXllciogZGVzdENvbXBMYXllciA9IGNvbXBvc2l0b3IoKS0+
ZW5jbG9zaW5nQ29tcG9zaXRpbmdMYXllcih0YXJnZXRMYXllcik7CisKKyAgICBGbG9hdFBvaW50
IHNyY1BvaW50KHBvaW50KTsKKworICAgIC8vIEVuY2xvc2luZ0NvbXBvc2l0aW5nTGF5ZXIgZG9l
c24ndCBndWFyYW50ZWUgdGhhdCBhIGNvbXBvc2l0aW5nIGxheWVyIGhhcyBiZWVuIGNyZWF0ZWQg
eWV0CisgICAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgIGlmICghc3Jj
Q29tcExheWVyLT5pc0NvbXBvc2l0ZWQoKSB8fCAhZGVzdENvbXBMYXllci0+aXNDb21wb3NpdGVk
KCkpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY29udmVydFBv
aW50VG9MYXllciBiYWlsaW5nIGJlY2F1c2Ugc291cmNlIG9yIHRhcmdldCBkb2Vzbid0IGhhdmUg
Y29tcG9zaXRpbmcgbGF5ZXIiKTsKKyNlbmRpZgorICAgICAgICAvLyBGSVhNRTogc3Vja3kgYWJz
b2x1dGUgbG9naWMKKyAgICAgICAgRmxvYXRQb2ludCBzcmNQb3MgPSByZW5kZXJlcigpLT5sb2Nh
bFRvQWJzb2x1dGUoKTsKKyAgICAgICAgRmxvYXRQb2ludCBkc3RQb3MgPSB0YXJnZXRMYXllci0+
cmVuZGVyZXIoKS0+bG9jYWxUb0Fic29sdXRlKCk7CisKKyAgICAgICAgc3JjUG9pbnQgKz0gKGRz
dFBvcyAtIHNyY1Bvcyk7CisgICAgICAgIHJldHVybiBzcmNQb2ludDsKKyAgICB9CisKKyAgICBp
ZiAoc3JjQ29tcExheWVyICE9IG1fb3duaW5nTGF5ZXIpIHsKKyAgICAgICAgaW50IHggPSAwLCB5
ID0gMDsKKyAgICAgICAgbV9vd25pbmdMYXllci0+Y29udmVydFRvTGF5ZXJDb29yZHMoc3JjQ29t
cExheWVyLCB4LCB5KTsKKyAgICAgICAgc3JjUG9pbnQubW92ZSh4LCB5KTsKKyAgICB9CisgICAg
CisgICAgLy8gY29udmVydCBmcm9tIFJlbmRlckxheWVyIHRvIEdyYXBoaWNzTGF5ZXIgY29vcmRz
CisgICAgc3JjUG9pbnQgPSBjb250ZW50c1RvR3JhcGhpY3NMYXllckNvb3JkaW5hdGVzKHNyY1Bv
aW50KTsKKyAgICAvLyBtYXAgdG8gdGhlIGRlc3QgbGF5ZXIKKyAgICBHcmFwaGljc0xheWVyKiBz
cmNQbGF0Zm9ybUxheWVyID0gc3JjQ29tcExheWVyLT5iYWNraW5nKCktPmdyYXBoaWNzTGF5ZXIo
KTsKKyAgICBHcmFwaGljc0xheWVyKiBkc3RQbGF0Zm9ybUxheWVyID0gZGVzdENvbXBMYXllci0+
YmFja2luZygpLT5ncmFwaGljc0xheWVyKCk7CisgICAgRmxvYXRQb2ludCBkZXN0UG9pbnQgPSBz
cmNQbGF0Zm9ybUxheWVyLT5jb252ZXJ0UG9pbnRUb0xheWVyKHNyY1BvaW50LCBkc3RQbGF0Zm9y
bUxheWVyKTsKKyAgICAvLyBjb252ZXJ0IGJhY2sgZnJvbSBHcmFwaGljc0xheWVyIHRvIFJlbmRl
ckxheWVyIGNvb3JkcworICAgIGRlc3RQb2ludCA9IGRlc3RDb21wTGF5ZXItPmJhY2tpbmcoKS0+
Z3JhcGhpY3NMYXllclRvQ29udGVudHNDb29yZGluYXRlcyhkZXN0UG9pbnQpOworCisgICAgaWYg
KGRlc3RDb21wTGF5ZXIgIT0gdGFyZ2V0TGF5ZXIpIHsKKyAgICAgICAgaW50IHggPSAwLCB5ID0g
MDsKKyAgICAgICAgdGFyZ2V0TGF5ZXItPmNvbnZlcnRUb0xheWVyQ29vcmRzKGRlc3RDb21wTGF5
ZXIsIHgsIHkpOworICAgICAgICBkZXN0UG9pbnQubW92ZSgteCwgLXkpOworICAgIH0KKworICAg
IHJldHVybiBkZXN0UG9pbnQ7Cit9CisKKy8vIGluUG9pbnQgaXMgcmVsYXRpdmUgdG8gb3VyIHJl
bmRlcmVyKCkKK0Zsb2F0UG9pbnQgUmVuZGVyTGF5ZXJCYWNraW5nOjpjb252ZXJ0VG9QYWdlVXNp
bmdDb21wb3NpdGluZ0xheWVyKGNvbnN0IEZsb2F0UG9pbnQmIGluUG9pbnQpCit7CisgICAgUmVu
ZGVyTGF5ZXIqIGRvY0xheWVyID0gbV9vd25pbmdMYXllci0+ZW5jbG9zaW5nRG9jdW1lbnRMYXll
cigpOworICAgIHJldHVybiBjb252ZXJ0UG9pbnRUb0xheWVyKGluUG9pbnQsIGRvY0xheWVyKTsK
K30KKworLy8gaW5Qb2ludCBpcyByZWxhdGl2ZSB0byB0aGUgZG9jdW1lbnQKK0Zsb2F0UG9pbnQg
UmVuZGVyTGF5ZXJCYWNraW5nOjpjb252ZXJ0RnJvbVBhZ2VVc2luZ0NvbXBvc2l0aW5nTGF5ZXIo
Y29uc3QgRmxvYXRQb2ludCYgaW5Qb2ludCkKK3sKKyAgICBSZW5kZXJMYXllciogZG9jTGF5ZXIg
PSBtX293bmluZ0xheWVyLT5lbmNsb3NpbmdEb2N1bWVudExheWVyKCk7CisgICAgcmV0dXJuIGRv
Y0xheWVyLT5iYWNraW5nKCktPmNvbnZlcnRQb2ludFRvTGF5ZXIoaW5Qb2ludCwgbV9vd25pbmdM
YXllcik7Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJCYWNraW5nOjpjb252ZXJ0UXVhZFRvUGFnZVVz
aW5nQ29tcG9zaXRpbmdMYXllcihGbG9hdFF1YWQmIHF1YWQpCit7CisgICAgUmVuZGVyTGF5ZXIq
IGRvY0xheWVyID0gbV9vd25pbmdMYXllci0+ZW5jbG9zaW5nRG9jdW1lbnRMYXllcigpOworICAg
IEdyYXBoaWNzTGF5ZXIqIGRvY0NvbXBMYXllciA9IGRvY0xheWVyID8gZG9jTGF5ZXItPmJhY2tp
bmcoKS0+Z3JhcGhpY3NMYXllcigpIDogMDsKKyAgICBBU1NFUlQoZG9jQ29tcExheWVyKTsKKyAg
ICBpZiAoIWRvY0NvbXBMYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gZG8gdGhlIG1h
dGggdGhhdCBjb250ZW50c1RvR3JhcGhpY3NMYXllckNvb3JkaW5hdGVzIGRvZXMKKyAgICBJbnRT
aXplIGNvbnRlbnRPZmZzZXQgPSBjb250ZW50T2Zmc2V0SW5Db21wb3N0aW5nTGF5ZXIoKTsKKyAg
ICBxdWFkLm1vdmUoY29udGVudE9mZnNldC53aWR0aCgpLCBjb250ZW50T2Zmc2V0LmhlaWdodCgp
KTsKKworICAgIG1fZ3JhcGhpY3NMYXllci0+Y29udmVydFF1YWRUb0xheWVyKHF1YWQsIGRvY0Nv
bXBMYXllcik7CisKKyAgICBJbnRTaXplIGRvY0NvbnRlbnRPZmZzZXQgPSBkb2NMYXllci0+YmFj
a2luZygpLT5jb250ZW50T2Zmc2V0SW5Db21wb3N0aW5nTGF5ZXIoKTsKKyAgICBxdWFkLm1vdmUo
LWRvY0NvbnRlbnRPZmZzZXQud2lkdGgoKSwgLWRvY0NvbnRlbnRPZmZzZXQuaGVpZ2h0KCkpOwor
fQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllckJh
Y2tpbmcuaCBiL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMGMwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllckJhY2tpbmcuaApAQCAtMCwwICsxLDE4OCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4g
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIElu
Yy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1h
eSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAg
ZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMg
Q09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRT
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAq
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVm
IFJlbmRlckxheWVyQmFja2luZ19oCisjZGVmaW5lIFJlbmRlckxheWVyQmFja2luZ19oCisKKyNp
ZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJGbG9hdFBvaW50Lmgi
CisjaW5jbHVkZSAiRmxvYXRQb2ludDNELmgiCisjaW5jbHVkZSAiR3JhcGhpY3NMYXllci5oIjsK
KyNpbmNsdWRlICJHcmFwaGljc0xheWVyQ2xpZW50LmgiOworI2luY2x1ZGUgIlJlbmRlckxheWVy
LmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitjbGFzcyBSZW5kZXJMYXllckNvbXBvc2l0b3I7CisKKy8vIFJlbmRlckxheWVyQmFj
a2luZyBjb250cm9scyB0aGUgY29tcG9zaXRpbmcgYmVoYXZpb3IgZm9yIGEgc2luZ2xlIFJlbmRl
ckxheWVyLgorLy8gSXQgaG9sZHMgdGhlIHZhcmlvdXMgR3JhcGhpY3NMYXllcnMsIGFuZCBtYWtl
cyBkZWNpc2lvbnMgYWJvdXQgaW50cmEtbGF5ZXIgcmVuZGVyaW5nCisvLyBvcHRpbWl6YXRpb25z
LgorLy8gCisvLyBUaGVyZSBpcyBvbmUgUmVuZGVyTGF5ZXJCYWNraW5nIGZvciBlYWNoIFJlbmRl
ckxheWVyIHRoYXQgaXMgY29tcG9zaXRlZC4KKworY2xhc3MgUmVuZGVyTGF5ZXJCYWNraW5nIDog
cHVibGljIEdyYXBoaWNzTGF5ZXJDbGllbnQgeworcHVibGljOgorICAgIFJlbmRlckxheWVyQmFj
a2luZyhSZW5kZXJMYXllciopOworICAgIH5SZW5kZXJMYXllckJhY2tpbmcoKTsKKworICAgIFJl
bmRlckxheWVyKiBvd25pbmdMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fb3duaW5nTGF5ZXI7IH0K
KworICAgIHZvaWQgdXBkYXRlQWZ0ZXJMYXlvdXQoKTsKKyAgICAKKyAgICAvLyBSZXR1cm5zIHRy
dWUgaWYgbGF5ZXIgY29uZmlndXJhdGlvbiBjaGFuZ2VkLgorICAgIGJvb2wgdXBkYXRlR3JhcGhp
Y3NMYXllcnMoYm9vbCBuZWVkc0NvbnRlbnRzTGF5ZXIsIGJvb2wgbmVlZHNVcHBlckNsaXBwaW5n
TGF5ZXIsIGJvb2wgbmVlZHNMb3dlckNsaXBwaW5nTGF5ZXIsIGJvb2wgbmVlZHNSZXBhaW50KTsK
KyAgICB2b2lkIHVwZGF0ZUdyYXBoaWNzTGF5ZXJHZW9tZXRyeSgpOworICAgIHZvaWQgdXBkYXRl
SW50ZXJuYWxIaWVyYXJjaHkoKTsKKyAgICAKKyAgICBHcmFwaGljc0xheWVyKiBncmFwaGljc0xh
eWVyKCkgY29uc3QgeyByZXR1cm4gbV9ncmFwaGljc0xheWVyOyB9CisKKyAgICAvLyBMYXllciB0
byBjbGlwIGNoaWxkcmVuCisgICAgYm9vbCBoYXNDbGlwcGluZ0xheWVyKCkgY29uc3QgICB7IHJl
dHVybiBtX2NsaXBwaW5nTGF5ZXIgIT0gMDsgfQorICAgIEdyYXBoaWNzTGF5ZXIqIGNsaXBwaW5n
TGF5ZXIoKSBjb25zdCAgeyByZXR1cm4gbV9jbGlwcGluZ0xheWVyOyB9CisKKyAgICAvLyBMYXll
ciB0byBnZXQgY2xpcHBlZCBieSBhbmNlc3RvcgorICAgIGJvb2wgaGFzQW5jZXN0b3JDbGlwcGlu
Z0xheWVyKCkgY29uc3QgICB7IHJldHVybiBtX2FuY2VzdG9yQ2xpcHBpbmdMYXllciAhPSAwOyB9
CisgICAgR3JhcGhpY3NMYXllciogYW5jZXN0b3JDbGlwcGluZ0xheWVyKCkgY29uc3QgIHsgcmV0
dXJuIG1fYW5jZXN0b3JDbGlwcGluZ0xheWVyOyB9CisKKyAgICBib29sIGhhc0NvbnRlbnRzTGF5
ZXIoKSBjb25zdCAgIHsgcmV0dXJuIG1fY29udGVudHNMYXllciAhPSAwOyB9CisgICAgR3JhcGhp
Y3NMYXllciogY29udGVudHNMYXllcigpIGNvbnN0ICAgeyByZXR1cm4gbV9jb250ZW50c0xheWVy
OyB9CisgICAgCisgICAgR3JhcGhpY3NMYXllciogcGFyZW50Rm9yU3VibGF5ZXJzKCkgY29uc3Qg
eyByZXR1cm4gbV9jbGlwcGluZ0xheWVyID8gbV9jbGlwcGluZ0xheWVyIDogbV9ncmFwaGljc0xh
eWVyOyB9CisgICAgR3JhcGhpY3NMYXllciogY2hpbGRGb3JTdXBlcmxheWVycygpIGNvbnN0IHsg
cmV0dXJuIG1fYW5jZXN0b3JDbGlwcGluZ0xheWVyID8gbV9hbmNlc3RvckNsaXBwaW5nTGF5ZXIg
OiBtX2dyYXBoaWNzTGF5ZXI7IH0KKworICAgIC8vIFJlbmRlckxheWVycyB3aXRoIGJhY2tpbmcg
bm9ybWFsbHkgc2hvcnQtY2lyY3VpdCBwYWludExheWVyKCkgYmVjYXVzZQorICAgIC8vIHRoZWly
IGNvbnRlbnQgaXMgcmVuZGVyZWQgdmlhIGNhbGxiYWNrcyBmcm9tIEdyYXBoaWNzTGF5ZXIuIEhv
d2V2ZXIsIHRoZSBkb2N1bWVudAorICAgIC8vIGxheWVyIGlzIHNwZWNpYWwsIGJlY2F1c2UgaXQg
aGFzIGEgR3JhcGhpY3NMYXllciB0byBhY3QgYXMgYSBjb250YWluZXIgZm9yIHRoZSBHcmFwaGlj
c0xheWVycworICAgIC8vIGZvciBkZXNjZW5kYW50cywgYnV0IGl0cyBjb250ZW50cyB1c3VhbGx5
IHJlbmRlciBpbnRvIHRoZSB3aW5kb3cgKGluIHdoaWNoIGNhc2UgdGhpcyByZXR1cm5zIHRydWUp
LgorICAgIC8vIFRoaXMgcmV0dXJucyBmYWxzZSBmb3Igb3RoZXIgbGF5ZXJzLCBhbmQgd2hlbiB0
aGUgZG9jdW1lbnQgbGF5ZXIgYWN0dWFsbHkgbmVlZHMgdG8gcGFpbnQgaW50byBpdHMgYmFja2lu
ZyBzdG9yZQorICAgIC8vIGZvciBzb21lIHJlYXNvbi4KKyAgICBib29sIHBhaW50aW5nR29lc1Rv
V2luZG93KCkgY29uc3Q7CisKKyAgICB2b2lkIHNldENvbnRlbnRzTmVlZERpc3BsYXkoKTsKKyAg
ICAvLyByIGlzIGluIHRoZSBjb29yZGluYXRlIHNwYWNlIG9mIHRoZSBsYXllcidzIHJlbmRlciBv
YmplY3QKKyAgICB2b2lkIHNldENvbnRlbnRzTmVlZERpc3BsYXlJblJlY3QoY29uc3QgSW50UmVj
dCYgcik7CisKKyAgICAvLyBJbnRlcmZhY2UgdG8gc3RhcnQsIGZpbmlzaCwgc3VzcGVuZCBhbmQg
cmVzdW1lIGFuaW1hdGlvbnMgYW5kIHRyYW5zaXRpb25zCisgICAgYm9vbCBzdGFydEFuaW1hdGlv
bihkb3VibGUgYmVnaW5UaW1lLCBjb25zdCBBbmltYXRpb24qIGFuaW0sIGNvbnN0IEtleWZyYW1l
TGlzdCYga2V5ZnJhbWVzKTsKKyAgICBib29sIHN0YXJ0VHJhbnNpdGlvbihkb3VibGUgYmVnaW5U
aW1lLCBpbnQgcHJvcGVydHksIGNvbnN0IFJlbmRlclN0eWxlKiBmcm9tU3R5bGUsIGNvbnN0IFJl
bmRlclN0eWxlKiB0b1N0eWxlKTsKKyAgICB2b2lkIGFuaW1hdGlvbkZpbmlzaGVkKGNvbnN0IFN0
cmluZyYgbmFtZSwgaW50IGluZGV4LCBib29sIHJlc2V0KTsKKyAgICB2b2lkIHRyYW5zaXRpb25G
aW5pc2hlZChpbnQgcHJvcGVydHkpOworCisgICAgdm9pZCBzdXNwZW5kQW5pbWF0aW9ucygpOwor
ICAgIHZvaWQgcmVzdW1lQW5pbWF0aW9ucygpOworCisgICAgRmxvYXRQb2ludCBncmFwaGljc0xh
eWVyVG9Db250ZW50c0Nvb3JkaW5hdGVzKGNvbnN0IEZsb2F0UG9pbnQmKTsKKyAgICBGbG9hdFBv
aW50IGNvbnRlbnRzVG9HcmFwaGljc0xheWVyQ29vcmRpbmF0ZXMoY29uc3QgRmxvYXRQb2ludCYp
OworCisgICAgLy8gY29udmVydCBwb2ludHMsIHRha2luZyB0cmFuc2Zvcm1zIGludG8gYWNjb3Vu
dAorICAgIEZsb2F0UG9pbnQgY29udmVydFBvaW50VG9MYXllcihjb25zdCBGbG9hdFBvaW50Jiwg
UmVuZGVyTGF5ZXIqIHRhcmdldExheWVyKTsKKworICAgIEZsb2F0UG9pbnQgY29udmVydFRvUGFn
ZVVzaW5nQ29tcG9zaXRpbmdMYXllcihjb25zdCBGbG9hdFBvaW50Jik7CisgICAgRmxvYXRQb2lu
dCBjb252ZXJ0RnJvbVBhZ2VVc2luZ0NvbXBvc2l0aW5nTGF5ZXIoY29uc3QgRmxvYXRQb2ludCYp
OworCisgICAgdm9pZCBjb252ZXJ0UXVhZFRvUGFnZVVzaW5nQ29tcG9zaXRpbmdMYXllcihGbG9h
dFF1YWQmKTsKKworICAgIHZvaWQgZm9yY2VDb21wb3NpdGluZ0xheWVyKGJvb2wgZm9yY2UgPSB0
cnVlKTsKKyAgICBib29sIGZvcmNlZENvbXBvc2l0aW5nTGF5ZXIoKSBjb25zdCB7IHJldHVybiBt
X2ZvcmNlQ29tcG9zaXRpbmdMYXllcjsgfQorCisgICAgdm9pZCBkZXRlY3REcmF3aW5nT3B0aW1p
emF0aW9ucygpOworICAgIHZvaWQgaW52YWxpZGF0ZURyYXdpbmdPcHRpbWl6YXRpb25zKCk7CisK
KyAgICAvLyBVcC1jYWxscyBmcm9tIEdyYXBoaWNzTGF5ZXIKKyAgICBSZW5kZXJMYXllciogaGl0
VGVzdFJvb3RMYXllcihSZW5kZXJMYXllciogcm9vdExheWVyLCBjb25zdCBIaXRUZXN0UmVxdWVz
dCYsIEhpdFRlc3RSZXN1bHQmLCBjb25zdCBJbnRSZWN0JiBoaXRUZXN0UmVjdCwgY29uc3QgSW50
UG9pbnQmIGhpdFRlc3RQb2ludCk7CisKKyAgICAvLyBHcmFwaGljc0xheWVyQ2xpZW50IGludGVy
ZmFjZQorICAgIHZpcnR1YWwgdm9pZCBub3RpZnlUcmFuc2l0aW9uU3RhcnRlZChjb25zdCBHcmFw
aGljc0xheWVyKiwgQW5pbWF0ZWRQcm9wZXJ0eUlELCBkb3VibGUgc3RhcnRUaW1lKTsKKyAgICB2
aXJ0dWFsIHZvaWQgbm90aWZ5QW5pbWF0aW9uU3RhcnRlZChjb25zdCBHcmFwaGljc0xheWVyKiwg
ZG91YmxlIHN0YXJ0VGltZSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnRDb250ZW50cyhjb25z
dCBHcmFwaGljc0xheWVyKiwgR3JhcGhpY3NDb250ZXh0JiwgR3JhcGhpY3NMYXllclBhaW50aW5n
UGhhc2UsIGNvbnN0IEludFJlY3QmIGNsaXApOworICAgIHZpcnR1YWwgYm9vbCBjb250ZW50c0Nv
bnRhaW5Qb2ludChjb25zdCBHcmFwaGljc0xheWVyKiwgY29uc3QgSW50UG9pbnQmIHBvaW50LCBH
cmFwaGljc0xheWVyUGFpbnRpbmdQaGFzZSAsIHN0cnVjdCBMYXllckhpdFRlc3REYXRhKik7CisK
KyAgICB2aXJ0dWFsIEZsb2F0UG9pbnQgY29udmVydFRvQ29udGVudHNDb29yZGluYXRlcyhjb25z
dCBHcmFwaGljc0xheWVyKiwgY29uc3QgRmxvYXRQb2ludCYpOworICAgIHZpcnR1YWwgSW50UmVj
dCBjb250ZW50c0JveChjb25zdCBHcmFwaGljc0xheWVyKik7CisgICAgCitwcml2YXRlOgorICAg
IHZvaWQgY3JlYXRlR3JhcGhpY3NMYXllcigpOworICAgIHZvaWQgZGVzdHJveUdyYXBoaWNzTGF5
ZXIoKTsKKworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIoKSBjb25zdCB7IHJldHVybiBtX293
bmluZ0xheWVyLT5yZW5kZXJlcigpOyB9CisgICAgUmVuZGVyTGF5ZXJDb21wb3NpdG9yKiBjb21w
b3NpdG9yKCkgY29uc3QgeyByZXR1cm4gbV9vd25pbmdMYXllci0+Y29tcG9zaXRvcigpOyB9CisK
KyAgICBib29sIHVwZGF0ZUNsaXBwaW5nTGF5ZXJzKGJvb2wgbmVlZHNBbmNlc3RvckNsaXAsIGJv
b2wgbmVlZHNEZXNjZW5kYW50Q2xpcCk7CisgICAgYm9vbCB1cGRhdGVDb250ZW50c0xheWVyKGJv
b2wgbmVlZHNDb250ZW50c0xheWVyKTsKKworICAgIEludFNpemUgY29udGVudE9mZnNldEluQ29t
cG9zdGluZ0xheWVyKCk7CisgICAgLy8gUmVzdWx0IGlzIHRyYW5zZm9ybSBvcmlnaW4gaW4gcGl4
ZWxzLgorICAgIEZsb2F0UG9pbnQgY29tcHV0ZVRyYW5zZm9ybU9yaWdpbihjb25zdCBJbnRSZWN0
JiBib3JkZXJCb3gpIGNvbnN0OworCisgICAgdm9pZCB1cGRhdGVMYXllck9wYWNpdHkoKTsKKyAg
ICB2b2lkIHVwZGF0ZUxheWVyVHJhbnNmb3JtKCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIG9wYWNp
dHkgdmFsdWUgdGhhdCB0aGlzIGxheWVyIHNob3VsZCB1c2UgZm9yIGNvbXBvc2l0aW5nLgorICAg
IGZsb2F0IGNvbXBvc2l0aW5nT3BhY2l0eShmbG9hdCByZW5kZXJlck9wYWNpdHkpIGNvbnN0Owor
ICAgIAorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIFJlbmRlckxheWVyIG9ubHkgaGFzIGNv
bnRlbnQgdGhhdCBjYW4gYmUgcmVuZGVyZWQgZGlyZWN0bHkKKyAgICAvLyBieSB0aGUgY29tcG9z
aXRpbmcgbGF5ZXIsIHdpdGhvdXQgZHJhd2luZyAoZS5nLiBzb2xpZCBiYWNrZ3JvdW5kIGNvbG9y
KS4KKyAgICBib29sIGlzU2ltcGxlQ29udGFpbmVyQ29tcG9zaXRpbmdMYXllcigpOworCisgICAg
Ym9vbCByZW5kZXJlckhhc0JhY2tncm91bmQoKSBjb25zdDsKKyAgICBjb25zdCBDb2xvciYgcmVu
ZGVyZXJCYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKKworICAgIGJvb2wgY2FuQmVTaW1wbGVDb250
YWluZXJDb21wb3NpdGluZ0xheWVyKCkgY29uc3Q7CisgICAgYm9vbCBoYXNOb25Db21wb3NpdGlu
Z0NvbnRlbnQoKSBjb25zdDsKKyAgICAKKyAgICB2b2lkIHBhaW50SW50b0xheWVyKFJlbmRlckxh
eWVyKiByb290TGF5ZXIsIEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmIHBhaW50RGly
dHlSZWN0LAorICAgICAgICAgICAgICAgICAgICBib29sIGhhdmVUcmFuc3BhcmVuY3ksIFBhaW50
UmVzdHJpY3Rpb24gcGFpbnRSZXN0cmljdGlvbiwgR3JhcGhpY3NMYXllclBhaW50aW5nUGhhc2Us
IFJlbmRlck9iamVjdCogcGFpbnRpbmdSb290KTsKKworICAgIFJlbmRlckxheWVyKiBmaW5kSGl0
Q29tcG9zaXRpbmdMYXllcihSZW5kZXJMYXllciogcm9vdExheWVyLCBjb25zdCBIaXRUZXN0UmVx
dWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBjb25zdCBJbnRSZWN0JiBoaXRUZXN0UmVjdCwgY29uc3Qg
SW50UG9pbnQmIGhpdFRlc3RQb2ludCk7CisKK3ByaXZhdGU6CisgICAgUmVuZGVyTGF5ZXIqIG1f
b3duaW5nTGF5ZXI7CisKKyAgICBHcmFwaGljc0xheWVyKiBtX2FuY2VzdG9yQ2xpcHBpbmdMYXll
cjsgLy8gb25seSB1c2VkIGlmIHdlIGFyZSBjbGlwcGVkIGJ5IGFuIGFuY2VzdG9yIHdoaWNoIGlz
IG5vdCBhIHN0YWNraW5nIGNvbnRleHQKKyAgICBHcmFwaGljc0xheWVyKiBtX2dyYXBoaWNzTGF5
ZXI7CisgICAgR3JhcGhpY3NMYXllciogbV9jb250ZW50c0xheWVyOyAgICAgICAgIC8vIG9ubHkg
dXNlZCBpbiBjYXNlcyB3aGVyZSB3ZSBuZWVkIHRvIGRyYXcgdGhlIGZvcmVncm91bmQgc2VwYXJh
dGVseQorICAgIEdyYXBoaWNzTGF5ZXIqIG1fY2xpcHBpbmdMYXllcjsgICAgICAgICAvLyBvbmx5
IHVzZWQgaWYgd2UgaGF2ZSBjbGlwcGluZyBvbiBhIHN0YWNraW5nIGNvbnRleHQsIHdpdGggY29t
cG9zaXRpbmcgY2hpbGRyZW4KKworICAgIEludFNpemUgbV9jb21wb3NpdGluZ0NvbnRlbnRPZmZz
ZXQ7CisKKyAgICBib29sIG1fZm9yY2VDb21wb3NpdGluZ0xheWVyIDogMTsgICAvLyBzZXQgaWYg
d2UgbmVlZCBhIGNvbXBvc2l0aW5nIGxheWVyIGJlY2F1c2Ugb2Ygc29tZSBleHRlcm5hbCByZXF1
aXJlbWVudAorICAgIGJvb2wgbV9pc1NpbXBsZUNvbnRhaW5lckNvbXBvc2l0aW5nTGF5ZXIgOiAx
OyAgLy8gaXMgdGhpcyBjb21wb3NpdGluZyBsYXllciBhYmxlIHRvIGJlIHNpbXBsaWZpZWQKKyAg
ICBib29sIG1fc2ltcGxlQ29tcG9zaXRpbmdMYXllclN0YXR1c0RpcnR5IDogMTsgLy8gc2V0IGlm
IHRoZSB0ZXN0IGZvciBzaW1wbGUgbGF5ZXJzIG5lZWRzIHRvIGJlIHJlZG9uZQorCisgICAgYm9v
bCBtX2NvbXBvc2l0aW5nQ29udGVudE9mZnNldERpcnR5OiAxOworfTsKKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisj
ZW5kaWYgLy8gUmVuZGVyTGF5ZXJCYWNraW5nX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlckxheWVyQ29tcG9zaXRvci5jcHAgYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJM
YXllckNvbXBvc2l0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdi
ZGJmZGQKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllckNv
bXBvc2l0b3IuY3BwCkBAIC0wLDAgKzEsNzU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICog
Mi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICog
My4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1l
cyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICog
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJM
RSgzRF9UUkFOU0ZPUk1TKQorLy8gVGhpcyBzeW1ib2wgaXMgdXNlZCB0byBkZXRlcm1pbmUgZnJv
bSBhIHNjcmlwdCB3aGV0aGVyIDNEIHRyYW5zZm9ybXMgYXJlIGVuYWJsZWQgKHZpYSAnbm0nKS4K
K2Jvb2wgV2ViQ29yZUhhczNEVHJhbnNmb3JtcyA9IHRydWU7CisjZW5kaWYKKworI2lmIFVTRShB
Q0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2luY2x1ZGUgIlJlbmRlckxheWVyQ29tcG9zaXRv
ci5oIgorCisjaW5jbHVkZSAiQW5pbWF0aW9uQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkNocm9t
ZUNsaWVudC5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzTGF5
ZXIuaCIKKyNpbmNsdWRlICJIaXRUZXN0UmVxdWVzdC5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXN1
bHQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUmVuZGVyTGF5ZXJCYWNraW5nLmgi
CisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlN5c3RlbVRpbWUuaCIKKworI2lm
bmRlZiBOREVCVUcKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiUmVuZGVyVHJlZUFz
VGV4dC5oIgorI2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RydWN0IENvbXBvc2l0
aW5nU3RhdGUgeworICAgIENvbXBvc2l0aW5nU3RhdGUoUmVuZGVyTGF5ZXIqIGluQ29tcEFuY2Vz
dG9yKQorICAgIDogbV9zdWJ0cmVlSXNDb21wb3NpdGluZyhmYWxzZSkKKyAgICAsIG1fY29tcG9z
aXRpbmdBbmNlc3RvcihpbkNvbXBBbmNlc3RvcikKKyAgICAsIG1fZGVwdGgoMCkKKyAgICB7Cisg
ICAgfQorICAgIAorICAgIGJvb2wgbV9zdWJ0cmVlSXNDb21wb3NpdGluZzsKKyAgICBSZW5kZXJM
YXllciogbV9jb21wb3NpdGluZ0FuY2VzdG9yOworICAgIGludCBtX2RlcHRoOyAgICAgICAgLy8g
anVzdCB1c2VkIGZvciBkZWJ1Z2dpbmcKK307CisKK3N0YXRpYyBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCBmbGlwVHJhbnNmb3JtKCkKK3sKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBmbGlwcGVyOwor
ICAgIGZsaXBwZXIuZmxpcFkoKTsKKyAgICByZXR1cm4gZmxpcHBlcjsKK30KKworUmVuZGVyTGF5
ZXJDb21wb3NpdG9yOjpSZW5kZXJMYXllckNvbXBvc2l0b3IoUmVuZGVyVmlldyogcmVuZGVyVmll
dykKKyAgICA6IG1fcmVuZGVyVmlldyhyZW5kZXJWaWV3KQorICAgICwgbV9yb290UGxhdGZvcm1M
YXllcigwKQorICAgICwgbV9jb21wb3NpdGluZyhmYWxzZSkKKyAgICAsIG1fcm9vdExheWVyQXR0
YWNoZWQoZmFsc2UpCisgICAgLCBtX2NvbXBvc2l0aW5nTGF5ZXJzTmVlZFVwZGF0ZShmYWxzZSkK
KyNpZiBQUk9GSUxFX0xBWUVSX1JFQlVJTEQKKyAgICAsIG1fcm9vdExheWVyVXBkYXRlQ291bnQo
MCkKKyNlbmRpZiAvLyBQUk9GSUxFX0xBWUVSX1JFQlVJTEQKK3sKK30KKworUmVuZGVyTGF5ZXJD
b21wb3NpdG9yOjp+UmVuZGVyTGF5ZXJDb21wb3NpdG9yKCkKK3sKKyAgICBBU1NFUlQoIW1fcm9v
dExheWVyQXR0YWNoZWQpOworICAgIGRlbGV0ZSBtX3Jvb3RQbGF0Zm9ybUxheWVyOworfQorCit2
b2lkIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6ZW5hYmxlQ29tcG9zaXRpbmdNb2RlKGJvb2wgZW5h
YmxlIC8qID0gdHJ1ZSAqLykKK3sKKyAgICBpZiAoZW5hYmxlICE9IG1fY29tcG9zaXRpbmcpIHsK
KyAgICAgICAgbV9jb21wb3NpdGluZyA9IGVuYWJsZTsKKyAgICAgICAgCisgICAgICAgIC8vIFdl
IG5ldmVyIGdvIG91dCBvZiBjb21wb3NpdGluZyBtb2RlIGZvciBhIGdpdmVuIHBhZ2UsCisgICAg
ICAgIC8vIGJ1dCBpZiBhbGwgdGhlIGxheWVycyBkaXNhcHBlYXIsIHdlJ2xsIGp1c3QgYmUgbGVm
dCB3aXRoCisgICAgICAgIC8vIHRoZSBlbXB0eSByb290IGxheWVyLCB3aGljaCBoYXMgbWluaW1h
bCBvdmVyaGVhZC4KKyAgICAgICAgaWYgKG1fY29tcG9zaXRpbmcpCisgICAgICAgICAgICBlbnN1
cmVSb290UGxhdGZvcm1MYXllcigpOworICAgIH0KK30KKwordm9pZCBSZW5kZXJMYXllckNvbXBv
c2l0b3I6OnNldENvbXBvc2l0aW5nTGF5ZXJzTmVlZFVwZGF0ZShib29sIG5lZWRVcGRhdGUpCit7
CisgICAgaWYgKGluQ29tcG9zaXRpbmdNb2RlKCkpCisgICAgICAgIG1fY29tcG9zaXRpbmdMYXll
cnNOZWVkVXBkYXRlID0gbmVlZFVwZGF0ZTsKK30KKwordm9pZCBSZW5kZXJMYXllckNvbXBvc2l0
b3I6OnVwZGF0ZUNvbXBvc2l0aW5nTGF5ZXJzKFJlbmRlckxheWVyKiB1cGRhdGVSb290KQorewor
ICAgIGlmICghbV9jb21wb3NpdGluZ0xheWVyc05lZWRVcGRhdGUpCisgICAgICAgIHJldHVybjsK
KworICAgIG1fY29tcG9zaXRpbmdMYXllcnNOZWVkVXBkYXRlID0gZmFsc2U7CisKKyAgICBBU1NF
UlQoaW5Db21wb3NpdGluZ01vZGUoKSk7CisKKyAgICBpZiAoIXVwZGF0ZVJvb3QpCisgICAgICAg
IHVwZGF0ZVJvb3QgPSByb290UmVuZGVyTGF5ZXIoKTsKKworI2lmIFBST0ZJTEVfTEFZRVJfUkVC
VUlMRAorICAgICsrbV9yb290TGF5ZXJVcGRhdGVDb3VudDsKKyAgICAKKyAgICBkb3VibGUgc3Rh
cnRUaW1lID0gY3VycmVudFRpbWUoKTsKKyNlbmRpZiAgICAgICAgCisKKyAgICAvLyBHbyB0aHJv
dWdoIHRoZSBsYXllcnMgaW4gcHJlc2VudGF0aW9uIG9yZGVyLCBzbyB0aGF0IHdlIGNhbiBjb21w
dXRlIHdoaWNoCisgICAgLy8gUkxzIG5lZWQgY29tcG9zaXRpbmcgbGF5ZXJzLgorICAgIC8vIEZJ
WE1FOiB3ZSBjb3VsZCBtYXliZSBkbyB0aGlzIGluIG9uZSBwYXNzLCBidXQgdGhlIHBhcmVudGlu
ZyBsb2dpYyB3b3VsZCBiZSBtb3JlCisgICAgLy8gY29tcGxleC4KKyAgICB7CisgICAgICAgIENv
bXBvc2l0aW5nU3RhdGUgY29tcFN0YXRlKHVwZGF0ZVJvb3QpOworICAgICAgICBjb21wdXRlQ29t
cG9zaXRpbmdSZXF1aXJlbWVudHModXBkYXRlUm9vdCwgY29tcFN0YXRlKTsKKyAgICB9CisKKyAg
ICAvLyBOb3cgY3JlYXRlIGFuZCBwYXJlbnQgdGhlIGNvbXBvc2l0aW5nIGxheWVycy4KKyAgICB7
CisgICAgICAgIENvbXBvc2l0aW5nU3RhdGUgY29tcFN0YXRlKHVwZGF0ZVJvb3QpOworICAgICAg
ICByZWJ1aWxkQ29tcG9zaXRpbmdMYXllclRyZWUodXBkYXRlUm9vdCwgY29tcFN0YXRlKTsKKyAg
ICB9CisgICAgCisgICAgeworICAgICAgICAvLyBJZiB5b3UgdW5jb21tZW50IHRoaXMsIGJlIHN1
cmUgdG8gY29tbWVudCB0aGUgbGF5b3V0KCkgYW5kIHVwZGF0ZUNvbXBvc2l0aW5nTGF5ZXJzKCkg
bGluZXMgaW4KKyAgICAgICAgLy8gUmVuZGVyVHJlZUFzVGV4dC5jcHAsIGV4dGVybmFsUmVwcmVz
ZW50YXRpb24oKSwgdG8gYXZvaWQgcmVjdXJzaW9uLgorICAgICAgICAvL1N0cmluZyBkdW1wID0g
ZXh0ZXJuYWxSZXByZXNlbnRhdGlvbihtX3JlbmRlclZpZXcpOworICAgICAgICAvL2ZwcmludGYo
c3RkZXJyLCAiJXMiLCBkdW1wLnV0ZjgoKS5kYXRhKCkpOworICAgIH0KKworI2lmIFBST0ZJTEVf
TEFZRVJfUkVCVUlMRAorICAgIGRvdWJsZSBlbmRUaW1lID0gY3VycmVudFRpbWUoKTsKKyAgICBp
ZiAoIXVwZGF0ZVJvb3QpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXBkYXRlICVkOiBjb21w
dXRlQ29tcG9zaXRpbmdSZXF1aXJlbWVudHMgZm9yIHRoZSB3b3JsZCB0b29rICVmbXNcbiIKKyAg
ICAgICAgICAgICAgICAgICAgbV9yb290TGF5ZXJVcGRhdGVDb3VudCwgMTAwMC4wICogKGVuZFRp
bWUgLSBzdGFydFRpbWUpKTsKKyNlbmRpZgorICAgIEFTU0VSVCghbV9jb21wb3NpdGluZ0xheWVy
c05lZWRVcGRhdGUpOworfQorCitib29sIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6dXBkYXRlTGF5
ZXJDb21wb3NpdGluZ1N0YXRlKFJlbmRlckxheWVyKiBsYXllciwgUmVuZGVyU3R5bGU6OkRpZmYg
ZGlmZikKK3sKKyAgICBib29sIG5lZWRzTGF5ZXIgPSBuZWVkc1RvQmVDb21wb3NpdGVkKGxheWVy
KTsKKyAgICBib29sIGxheWVyQ2hhbmdlZCA9IGZhbHNlOworICAgIGlmIChuZWVkc0xheWVyKSB7
CisgICAgICAgIGVuYWJsZUNvbXBvc2l0aW5nTW9kZSgpOworICAgICAgICBpZiAoIWxheWVyLT5i
YWNraW5nKCkpIHsKKyAgICAgICAgICAgIGxheWVyLT5lbnN1cmVCYWNraW5nKCk7CisgICAgICAg
ICAgICBsYXllckNoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgaWYgKGxheWVyLT5iYWNraW5nKCkpIHsKKyAgICAgICAgICAgIGxheWVyLT5jbGVhckJhY2tp
bmcoKTsKKyAgICAgICAgICAgIGxheWVyQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9
CisgICAgCisgICAgaWYgKGxheWVyQ2hhbmdlZCkgeworICAgICAgICAvLyBpbnZhbGlkYXRlIHRo
ZSBwYXJlbnQgaW4gdGhpcyByZWdpb24KKyAgICAgICAgUmVuZGVyTGF5ZXIqIGNvbXBMYXllciA9
IGVuY2xvc2luZ0NvbXBvc2l0aW5nTGF5ZXIobGF5ZXIsIGZhbHNlKTsKKyAgICAgICAgaWYgKGNv
bXBMYXllcikgeworICAgICAgICAgICAgLy8gV2UgY2FuJ3QgcmVsaWFibHkgY29tcHV0ZSBhIGRp
cnR5IHJlY3QsIGJlY2F1c2Ugc3R5bGUgbWF5IGhhdmUgY2hhbmdlZCBhbHJlYWR5LCAKKyAgICAg
ICAgICAgIC8vIHNvIGp1c3QgZGlydHkgdGhlIHdob2xlIHBhcmVudCBsYXllcgorICAgICAgICAg
ICAgY29tcExheWVyLT5zZXROZWVkc1JlcGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGxh
eWVyLT5yZW5kZXJlcigpLT5jb21wb3NpdGluZ1N0YXRlQ2hhbmdlZCgpOworICAgIH0KKworICAg
IGlmICghbmVlZHNMYXllcikKKyAgICAgICAgcmV0dXJuIGxheWVyQ2hhbmdlZDsKKworICAgIGlm
IChsYXllci0+YmFja2luZygpLT51cGRhdGVHcmFwaGljc0xheWVycyhuZWVkc0NvbnRlbnRzQ29t
cG9zaXRpbmdMYXllcihsYXllciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNsaXBwZWRCeUFuY2VzdG9yKGxheWVyKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcHNDb21wb3NpdGluZ0Rlc2NlbmRhbnRz
KGxheWVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZGlmZiA+PSBSZW5kZXJTdHlsZTo6UmVwYWludCkpCisgICAgICAgIGxheWVyQ2hhbmdlZCA9IHRy
dWU7CisKKyAgICByZXR1cm4gbGF5ZXJDaGFuZ2VkOworfQorCisvLyBUaGUgYm91bmRzIG9mIHRo
ZSBHcmFwaGljc0xheWVyIGNyZWF0ZWQgZm9yIGEgY29tcG9zaXRpbmcgbGF5ZXIgaXMgdGhlIHVu
aW9uIG9mIHRoZSBib3VuZHMgb2YgYWxsIHRoZSBkZXNjZW5kYW50CisvLyBSZW5kZXJMYXllcnMg
dGhhdCBhcmUgcmVuZGVyZWQgYnkgdGhlIGNvbXBvc2l0ZWQgUmVuZGVyTGF5ZXIuCitJbnRSZWN0
IFJlbmRlckxheWVyQ29tcG9zaXRvcjo6Y2FsY3VsYXRlQ29tcG9zaXRlZEJvdW5kcyhjb25zdCBS
ZW5kZXJMYXllciogbGF5ZXIsIGNvbnN0IFJlbmRlckxheWVyKiBhbmNlc3RvckxheWVyLCBJbnRS
ZWN0KiBsYXllckJvdW5kaW5nQm94KQoreworICAgIEludFJlY3QgYm91bmRpbmdCb3hSZWN0LCB1
bmlvbkJvdW5kczsKKyAgICBib3VuZGluZ0JveFJlY3QgPSB1bmlvbkJvdW5kcyA9IGxheWVyLT5i
b3VuZGluZ0JveChsYXllcik7CisgICAgCisgICAgQVNTRVJUKGxheWVyLT5pc1N0YWNraW5nQ29u
dGV4dCgpIHx8ICghbGF5ZXItPm1fcG9zWk9yZGVyTGlzdCB8fCBsYXllci0+bV9wb3NaT3JkZXJM
aXN0LT5zaXplKCkgPT0gMCkpOworCisgICAgVmVjdG9yPFJlbmRlckxheWVyKj4qIG5lZ1pPcmRl
ckxpc3QgPSBsYXllci0+bmVnWk9yZGVyTGlzdCgpOworICAgIGlmIChuZWdaT3JkZXJMaXN0KQor
ICAgICAgICBmb3IgKFZlY3RvcjxSZW5kZXJMYXllcio+OjppdGVyYXRvciBpdCA9IG5lZ1pPcmRl
ckxpc3QtPmJlZ2luKCk7IGl0ICE9IG5lZ1pPcmRlckxpc3QtPmVuZCgpOyArK2l0KSB7CisgICAg
ICAgICAgICBSZW5kZXJMYXllciogY3VyTGF5ZXIgPSAoKml0KTsKKyAgICAgICAgICAgIGlmICgh
Y3VyTGF5ZXItPmlzQ29tcG9zaXRlZCgpKSB7CisgICAgICAgICAgICAgICAgSW50UmVjdCBjaGls
ZFVuaW9uQm91bmRzID0gY2FsY3VsYXRlQ29tcG9zaXRlZEJvdW5kcyhjdXJMYXllciwgbGF5ZXIp
OworICAgICAgICAgICAgICAgIHVuaW9uQm91bmRzLnVuaXRlKGNoaWxkVW5pb25Cb3VuZHMpOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBWZWN0b3I8UmVuZGVyTGF5ZXIqPiogcG9z
Wk9yZGVyTGlzdCA9IGxheWVyLT5wb3NaT3JkZXJMaXN0KCk7CisgICAgaWYgKHBvc1pPcmRlckxp
c3QpCisgICAgICAgIGZvciAoVmVjdG9yPFJlbmRlckxheWVyKj46Oml0ZXJhdG9yIGl0ID0gcG9z
Wk9yZGVyTGlzdC0+YmVnaW4oKTsgaXQgIT0gcG9zWk9yZGVyTGlzdC0+ZW5kKCk7ICsraXQpIHsK
KyAgICAgICAgICAgIFJlbmRlckxheWVyKiBjdXJMYXllciA9ICgqaXQpOworICAgICAgICAgICAg
aWYgKCFjdXJMYXllci0+aXNDb21wb3NpdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBJbnRSZWN0
IGNoaWxkVW5pb25Cb3VuZHMgPSBjYWxjdWxhdGVDb21wb3NpdGVkQm91bmRzKGN1ckxheWVyLCBs
YXllcik7CisgICAgICAgICAgICAgICAgdW5pb25Cb3VuZHMudW5pdGUoY2hpbGRVbmlvbkJvdW5k
cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIFZlY3RvcjxSZW5kZXJMYXllcio+
KiBvdmVyZmxvd0xpc3QgPSBsYXllci0+b3ZlcmZsb3dMaXN0KCk7CisgICAgaWYgKG92ZXJmbG93
TGlzdCkKKyAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyTGF5ZXIqPjo6aXRlcmF0b3IgaXQgPSBv
dmVyZmxvd0xpc3QtPmJlZ2luKCk7IGl0ICE9IG92ZXJmbG93TGlzdC0+ZW5kKCk7ICsraXQpIHsK
KyAgICAgICAgICAgIFJlbmRlckxheWVyKiBjdXJMYXllciA9ICgqaXQpOworICAgICAgICAgICAg
aWYgKCFjdXJMYXllci0+aXNDb21wb3NpdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBJbnRSZWN0
IGN1ckFic0JvdW5kcyA9IGNhbGN1bGF0ZUNvbXBvc2l0ZWRCb3VuZHMoY3VyTGF5ZXIsIGxheWVy
KTsKKyAgICAgICAgICAgICAgICB1bmlvbkJvdW5kcy51bml0ZShjdXJBYnNCb3VuZHMpOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBpZiAoIWxheWVyLT5pc0NvbXBvc2l0ZWQoKSAm
JiBsYXllci0+dHJhbnNmb3JtKCkpIHsKKyAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXgqIGFm
ZmluZVRyYW5zID0gbGF5ZXItPnRyYW5zZm9ybSgpOworICAgICAgICBib3VuZGluZ0JveFJlY3Qg
PSBhZmZpbmVUcmFucy0+bWFwUmVjdChib3VuZGluZ0JveFJlY3QpOworICAgICAgICB1bmlvbkJv
dW5kcyA9IGFmZmluZVRyYW5zLT5tYXBSZWN0KHVuaW9uQm91bmRzKTsKKyAgICB9CisKKyAgICBp
bnQgYW5jZXN0b3JSZWxYID0gMCwgYW5jZXN0b3JSZWxZID0gMDsKKyAgICBsYXllci0+Y29udmVy
dFRvTGF5ZXJDb29yZHMoYW5jZXN0b3JMYXllciwgYW5jZXN0b3JSZWxYLCBhbmNlc3RvclJlbFkp
OworICAgIHVuaW9uQm91bmRzLm1vdmUoYW5jZXN0b3JSZWxYLCBhbmNlc3RvclJlbFkpOworCisg
ICAgaWYgKGxheWVyQm91bmRpbmdCb3gpIHsKKyAgICAgICAgYm91bmRpbmdCb3hSZWN0Lm1vdmUo
YW5jZXN0b3JSZWxYLCBhbmNlc3RvclJlbFkpOworICAgICAgICAqbGF5ZXJCb3VuZGluZ0JveCA9
IGJvdW5kaW5nQm94UmVjdDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHVuaW9uQm91bmRzOwor
fQorCit2b2lkIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6bGF5ZXJXYXNBZGRlZChSZW5kZXJMYXll
ciogLypwYXJlbnQqLywgUmVuZGVyTGF5ZXIqIC8qY2hpbGQqLykKK3sKKyAgICBzZXRDb21wb3Np
dGluZ0xheWVyc05lZWRVcGRhdGUoKTsKK30KKwordm9pZCBSZW5kZXJMYXllckNvbXBvc2l0b3I6
OmxheWVyV2lsbEJlUmVtb3ZlZChSZW5kZXJMYXllciogcGFyZW50LCBSZW5kZXJMYXllciogY2hp
bGQpCit7CisgICAgaWYgKGNoaWxkLT5pc0NvbXBvc2l0ZWQoKSkKKyAgICAgICAgc2V0Q29tcG9z
aXRpbmdQYXJlbnQoY2hpbGQsIDApOworICAgIAorICAgIFJlbmRlckxheWVyKiBjb21wTGF5ZXIg
PSBlbmNsb3NpbmdDb21wb3NpdGluZ0xheWVyKHBhcmVudCwgZmFsc2UpOworICAgIGlmIChjb21w
TGF5ZXIpIHsKKyAgICAgICAgSW50UmVjdCBhbmNlc3RvclJlY3QgPSBjYWxjdWxhdGVDb21wb3Np
dGVkQm91bmRzKGNoaWxkLCBjb21wTGF5ZXIpOworICAgICAgICBjb21wTGF5ZXItPnNldE5lZWRz
UmVwYWludEluUmVjdChhbmNlc3RvclJlY3QpOworICAgIH0KKworICAgIHNldENvbXBvc2l0aW5n
TGF5ZXJzTmVlZFVwZGF0ZSgpOworfQorCitSZW5kZXJMYXllciogUmVuZGVyTGF5ZXJDb21wb3Np
dG9yOjplbmNsb3NpbmdDb21wb3NpdGluZ0xheWVyKFJlbmRlckxheWVyKiBsYXllciwgYm9vbCBp
bmNsdWRlU2VsZikgY29uc3QKK3sKKyAgICBpZiAoaW5jbHVkZVNlbGYgJiYgbGF5ZXItPmlzQ29t
cG9zaXRlZCgpKQorICAgICAgICByZXR1cm4gbGF5ZXI7CisKKyAgICBib29sIGNoaWxkT3ZlcmZs
b3dPbmx5ID0gbGF5ZXItPmlzT3ZlcmZsb3dPbmx5KCk7CisgICAgUmVuZGVyTGF5ZXIqIGN1cnIg
PSBsYXllci0+cGFyZW50KCk7CisgICAgCisgICAgZm9yICggOyBjdXJyICE9IDA7IGN1cnIgPSBj
dXJyLT5wYXJlbnQoKSkgeworICAgICAgICAvLyBDb21wb3NpdGluZyBsYXllcnMgYXJlIHBhcmVu
dGVkIGFjY29yZGluZyB0byBzdGFja2luZyBvcmRlciBhbmQgb3ZlcmZsb3cgbGlzdCwKKyAgICAg
ICAgLy8gc28gd2UgaGF2ZSB0byBjaGVjayB3aGV0aGVyIHRoZSBwYXJlbnQgaXMgYSBzdGFja2lu
ZyBjb250ZXh0LCBvciB3aGV0aGVyIAorICAgICAgICAvLyB0aGUgY2hpbGQgaXMgb3ZlcmZsb3ct
b25seS4KKyAgICAgICAgaWYgKGN1cnItPmlzQ29tcG9zaXRlZCgpICYmIChjaGlsZE92ZXJmbG93
T25seSB8fCBjdXJyLT5pc1N0YWNraW5nQ29udGV4dCgpKSkKKyAgICAgICAgICAgIHJldHVybiBj
dXJyOworICAgICAgICAKKyAgICAgICAgY2hpbGRPdmVyZmxvd09ubHkgPSBjdXJyLT5pc092ZXJm
bG93T25seSgpOworICAgIH0KKyAgICAgICAgIAorICAgIHJldHVybiAwOworfQorCitSZW5kZXJM
YXllciogUmVuZGVyTGF5ZXJDb21wb3NpdG9yOjplbmNsb3NpbmdOb25TdGFja2luZ0NsaXBwaW5n
TGF5ZXIoY29uc3QgUmVuZGVyTGF5ZXIqIGxheWVyKSBjb25zdAoreworICAgIFJlbmRlckxheWVy
KiBjdXJyID0gbGF5ZXItPnBhcmVudCgpOworICAgIGZvciAoIDsgY3VyciAhPSAwOyBjdXJyID0g
Y3Vyci0+cGFyZW50KCkpIHsKKyAgICAgICAgaWYgKGN1cnItPmlzU3RhY2tpbmdDb250ZXh0KCkp
CisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoY3Vyci0+cmVuZGVyZXIoKS0+
aGFzT3ZlcmZsb3dDbGlwKCkpCisgICAgICAgICAgICByZXR1cm4gY3VycjsKKyAgICB9CisgICAg
cmV0dXJuIDA7Cit9CisKKy8vICBSZWN1cnNlIHRocm91Z2ggdGhlIGxheWVycyBpbiB6LWluZGV4
IGFuZCBvdmVyZmxvdyBvcmRlciAod2hpY2ggaXMgZXF1aXZhbGVudCB0byBwYWludGluZyBvcmRl
cikKKy8vICBGb3IgdGhlIHotb3JkZXIgY2hpbGRyZW4gb2YgYSBjb21wb3NpdGluZyBsYXllcjoK
Ky8vICAgICAgSWYgYSBjaGlsZCBsYXllcnMgaGFzIGEgY29tcG9zaXRpbmcgbGF5ZXIsIHRoZW4g
YWxsIHN1YnNlcXVlbnQgbGF5ZXJzIG11c3QKKy8vICAgICAgYmUgY29tcG9zaXRpbmcgaW4gb3Jk
ZXIgdG8gcmVuZGVyIGFib3ZlIHRoYXQgbGF5ZXIuCisvLworLy8gICAgICBJZiBhIGNoaWxkIGlu
IHRoZSBuZWdhdGl2ZSB6LW9yZGVyIGxpc3QgaXMgY29tcG9zaXRpbmcsIHRoZW4gdGhlIGxheWVy
IGl0c2VsZgorLy8gICAgICBtdXN0IGJlIGNvbXBvc2l0aW5nIHNvIHRoYXQgaXRzIGNvbnRlbnRz
IHJlbmRlciBvdmVyIHRoYXQgY2hpbGQuCisvLyAgICAgIFRoaXMgaW1wbGllcyB0aGF0IGl0cyBw
b3NpdGl2ZSB6LWluZGV4IGNoaWxkcmVuIG11c3QgYWxzbyBiZSBjb21wb3NpdGluZy4KKy8vCit2
b2lkIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6Y29tcHV0ZUNvbXBvc2l0aW5nUmVxdWlyZW1lbnRz
KFJlbmRlckxheWVyKiBsYXllciwgc3RydWN0IENvbXBvc2l0aW5nU3RhdGUmIGlvQ29tcFN0YXRl
KQoreworICAgIC8vIE1ha2Ugc3VyZSB0aGlzIGxheWVyJ3Mgei1vcmRlciBhbmQgb3ZlcmZsb3cg
bGlzdHMgYXJlIHVwIHRvIGRhdGUKKyAgICBsYXllci0+dXBkYXRlVGhpc0xheWVyKCk7CisgICAg
CisgICAgLy8gQ2xlYXIgdGhlIGZsYWcKKyAgICBsYXllci0+c2V0SGFzQ29tcG9zaXRpbmdEZXNj
ZW5kYW50KGZhbHNlKTsKKworICAgIHNldEZvcmNlZENvbXBvc2l0aW5nTGF5ZXIobGF5ZXIsIGlv
Q29tcFN0YXRlLm1fc3VidHJlZUlzQ29tcG9zaXRpbmcpOworICAgIAorICAgIGNvbnN0IGJvb2wg
aXNDb21wb3NpdGluZ0xheWVyID0gbmVlZHNUb0JlQ29tcG9zaXRlZChsYXllcik7CisgICAgaW9D
b21wU3RhdGUubV9zdWJ0cmVlSXNDb21wb3NpdGluZyA9IGlzQ29tcG9zaXRpbmdMYXllcjsKKwor
ICAgIENvbXBvc2l0aW5nU3RhdGUgY2hpbGRTdGF0ZSA9IGlvQ29tcFN0YXRlOworICAgIGlmIChp
c0NvbXBvc2l0aW5nTGF5ZXIpCisgICAgICAgIGNoaWxkU3RhdGUubV9jb21wb3NpdGluZ0FuY2Vz
dG9yID0gbGF5ZXI7CisKKyAgICAvLyBUaGUgY2hpbGRyZW4gb2YgdGhpcyBzdGFja2luZyBjb250
ZXh0IGRvbid0IG5lZWQgdG8gY29tcG9zaXRlLCB1bmxlc3MgdGhlcmUgaXMKKyAgICAvLyBhIGNv
bXBvc2l0aW5nIGxheWVyIGFtb25nIHRoZW0sIHNvIHN0YXJ0IGJ5IGFzc3VtaW5nIGZhbHNlLgor
ICAgIGNoaWxkU3RhdGUubV9zdWJ0cmVlSXNDb21wb3NpdGluZyA9IGZhbHNlOworCisgICAgKytj
aGlsZFN0YXRlLm1fZGVwdGg7CisKKyAgICBpZiAobGF5ZXItPmlzU3RhY2tpbmdDb250ZXh0KCkp
IHsKKyAgICAgICAgQVNTRVJUKCFsYXllci0+bV96T3JkZXJMaXN0c0RpcnR5KTsKKyAgICAgICAg
VmVjdG9yPFJlbmRlckxheWVyKj4qIG5lZ1pPcmRlckxpc3QgPSBsYXllci0+bmVnWk9yZGVyTGlz
dCgpOworICAgICAgICBpZiAobmVnWk9yZGVyTGlzdCAmJiBuZWdaT3JkZXJMaXN0LT5zaXplKCkg
PiAwKSB7CisgICAgICAgICAgICBmb3IgKFZlY3RvcjxSZW5kZXJMYXllcio+Ojpjb25zdF9pdGVy
YXRvciBpdCA9IG5lZ1pPcmRlckxpc3QtPmJlZ2luKCk7IGl0ICE9IG5lZ1pPcmRlckxpc3QtPmVu
ZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgUmVuZGVyTGF5ZXIqIGN1ckxheWVyID0gKCpp
dCk7CisgICAgICAgICAgICAgICAgY29tcHV0ZUNvbXBvc2l0aW5nUmVxdWlyZW1lbnRzKGN1ckxh
eWVyLCBjaGlsZFN0YXRlKTsKKworICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgdG8gbWFr
ZSBhIGxheWVyIGZvciB0aGlzIGNoaWxkLCBtYWtlIG9uZSBub3cgc28gd2UgY2FuIGhhdmUgYSBj
b250ZW50cyBsYXllcgorICAgICAgICAgICAgICAgIC8vIChzaW5jZSB3ZSBuZWVkIHRvIGVuc3Vy
ZSB0aGF0IHRoZSAtdmUgei1vcmRlciBjaGlsZCByZW5kZXJzIHVuZGVybmVhdGggb3VyIGNvbnRl
bnRzKQorICAgICAgICAgICAgICAgIGlmIChjaGlsZFN0YXRlLm1fc3VidHJlZUlzQ29tcG9zaXRp
bmcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSB8dGhpc3wgY29tcG9zaXRpbmcKKyAg
ICAgICAgICAgICAgICAgICAgc2V0Rm9yY2VkQ29tcG9zaXRpbmdMYXllcihsYXllciwgdHJ1ZSk7
CisgICAgICAgICAgICAgICAgICAgIGNoaWxkU3RhdGUubV9jb21wb3NpdGluZ0FuY2VzdG9yID0g
bGF5ZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
fQorICAgIAorICAgIEFTU0VSVCghbGF5ZXItPm1fb3ZlcmZsb3dMaXN0RGlydHkpOworICAgIFZl
Y3RvcjxSZW5kZXJMYXllcio+KiBvdmVyZmxvd0xpc3QgPSBsYXllci0+b3ZlcmZsb3dMaXN0KCk7
CisgICAgaWYgKG92ZXJmbG93TGlzdCAmJiBvdmVyZmxvd0xpc3QtPnNpemUoKSA+IDApCisgICAg
ICAgIGZvciAoVmVjdG9yPFJlbmRlckxheWVyKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gb3ZlcmZs
b3dMaXN0LT5iZWdpbigpOyBpdCAhPSBvdmVyZmxvd0xpc3QtPmVuZCgpOyArK2l0KSB7CisgICAg
ICAgICAgICBSZW5kZXJMYXllciogY3VyTGF5ZXIgPSAoKml0KTsKKyAgICAgICAgICAgIGNvbXB1
dGVDb21wb3NpdGluZ1JlcXVpcmVtZW50cyhjdXJMYXllciwgY2hpbGRTdGF0ZSk7CisgICAgICAg
IH0KKworICAgIGlmIChsYXllci0+aXNTdGFja2luZ0NvbnRleHQoKSkgeworICAgICAgICBWZWN0
b3I8UmVuZGVyTGF5ZXIqPiogcG9zWk9yZGVyTGlzdCA9IGxheWVyLT5wb3NaT3JkZXJMaXN0KCk7
CisgICAgICAgIGlmIChwb3NaT3JkZXJMaXN0ICYmIHBvc1pPcmRlckxpc3QtPnNpemUoKSA+IDAp
CisgICAgICAgICAgICBmb3IgKFZlY3RvcjxSZW5kZXJMYXllcio+Ojpjb25zdF9pdGVyYXRvciBp
dCA9IHBvc1pPcmRlckxpc3QtPmJlZ2luKCk7IGl0ICE9IHBvc1pPcmRlckxpc3QtPmVuZCgpOyAr
K2l0KSB7CisgICAgICAgICAgICAgICAgUmVuZGVyTGF5ZXIqIGN1ckxheWVyID0gKCppdCk7Cisg
ICAgICAgICAgICAgICAgY29tcHV0ZUNvbXBvc2l0aW5nUmVxdWlyZW1lbnRzKGN1ckxheWVyLCBj
aGlsZFN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB3ZSBoYXZlIGEg
c29mdHdhcmUgdHJhbnNmb3JtLCBhbmQgd2UgaGF2ZSBsYXllcnMgdW5kZXIgdXMsIHdlIG5lZWQg
dG8gYWxzbworICAgIC8vIGJlIGNvbXBvc2l0ZWQuIEFsc28sIGlmIHdlIGhhdmUgb3BhY2l0eSA8
IDEsIHRoZW4gd2UgbmVlZCB0byBiZSBhIGxheWVyIHNvIHRoYXQKKyAgICAvLyB0aGUgY2hpbGQg
bGF5ZXJzIGFyZSBvcGFxdWUsIHRoZW4gcmVuZGVyZWQgd2l0aCBvcGFjaXR5IG9uIHRoaXMgbGF5
ZXIuCisgICAgaWYgKGNoaWxkU3RhdGUubV9zdWJ0cmVlSXNDb21wb3NpdGluZyAmJgorICAgICAg
ICAobGF5ZXItPnJlbmRlcmVyKCktPnN0eWxlKCktPmhhc1RyYW5zZm9ybSgpIHx8IGxheWVyLT5y
ZW5kZXJlcigpLT5zdHlsZSgpLT5vcGFjaXR5KCkgPCAxKSkKKyAgICAgICAgc2V0Rm9yY2VkQ29t
cG9zaXRpbmdMYXllcihsYXllciwgdHJ1ZSk7CisKKyAgICAvLyBTdWJzZXF1ZW50IGxheWVycyBp
biB0aGUgcGFyZW50IHN0YWNraW5nIGNvbnRleHQgYWxzbyBuZWVkIHRvIGNvbXBvc2l0ZS4KKyAg
ICBpZiAoY2hpbGRTdGF0ZS5tX3N1YnRyZWVJc0NvbXBvc2l0aW5nKQorICAgICAgICBpb0NvbXBT
dGF0ZS5tX3N1YnRyZWVJc0NvbXBvc2l0aW5nID0gdHJ1ZTsKKworICAgIC8vIFNldCB0aGUgZmxh
ZyB0byBzYXkgdGhhdCB0aGlzIFNDIGhhcyBjb21wb3NpdGluZyBjaGlsZHJlbi4KKyAgICAvLyB0
aGlzIGNhbiBhZmZlY3QgdGhlIGFuc3dlciB0byBuZWVkc1RvQmVDb21wb3NpdGVkKCkgd2hlbiBj
bGlwcGluZywKKyAgICAvLyBidXQgdGhhdCdzIG9rIGhlcmUuCisgICAgbGF5ZXItPnNldEhhc0Nv
bXBvc2l0aW5nRGVzY2VuZGFudChjaGlsZFN0YXRlLm1fc3VidHJlZUlzQ29tcG9zaXRpbmcpOwor
fQorCit2b2lkIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6c2V0Rm9yY2VkQ29tcG9zaXRpbmdMYXll
cihSZW5kZXJMYXllciogbGF5ZXIsIGJvb2wgZm9yY2UpCit7CisgICAgaWYgKGZvcmNlKSB7Cisg
ICAgICAgIGxheWVyLT5lbnN1cmVCYWNraW5nKCk7CisgICAgICAgIGxheWVyLT5iYWNraW5nKCkt
PmZvcmNlQ29tcG9zaXRpbmdMYXllcigpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChsYXll
ci0+YmFja2luZygpKQorICAgICAgICAgICAgbGF5ZXItPmJhY2tpbmcoKS0+Zm9yY2VDb21wb3Np
dGluZ0xheWVyKGZhbHNlKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJDb21wb3NpdG9y
OjpzZXRDb21wb3NpdGluZ1BhcmVudChSZW5kZXJMYXllciogY2hpbGRMYXllciwgUmVuZGVyTGF5
ZXIqIHBhcmVudExheWVyKQoreworICAgIEFTU0VSVChjaGlsZExheWVyLT5pc0NvbXBvc2l0ZWQo
KSk7CisgICAgQVNTRVJUKCFwYXJlbnRMYXllciB8fCBwYXJlbnRMYXllci0+aXNDb21wb3NpdGVk
KCkpOworICAgIAorICAgIGlmIChwYXJlbnRMYXllcikgeworICAgICAgICBHcmFwaGljc0xheWVy
KiBob3N0aW5nTGF5ZXIgPSBwYXJlbnRMYXllci0+YmFja2luZygpLT5wYXJlbnRGb3JTdWJsYXll
cnMoKTsKKyAgICAgICAgR3JhcGhpY3NMYXllciogaG9zdGVkTGF5ZXIgPSBjaGlsZExheWVyLT5i
YWNraW5nKCktPmNoaWxkRm9yU3VwZXJsYXllcnMoKTsKKyAgICAgICAgCisgICAgICAgIGhvc3Rp
bmdMYXllci0+YWRkQ2hpbGQoaG9zdGVkTGF5ZXIpOworICAgIH0gZWxzZQorICAgICAgICBjaGls
ZExheWVyLT5iYWNraW5nKCktPmNoaWxkRm9yU3VwZXJsYXllcnMoKS0+cmVtb3ZlRnJvbVBhcmVu
dCgpOworICAgIAorICAgIC8vIEZJWE1FOiBzZXRDb21wb3NpdGluZ1BhcmVudCgpIGlzIG9ubHkg
Y2FsbGVkIGF0IHByZXNlbnQgYnkgcmVidWlsZENvbXBvc2l0aW5nTGF5ZXJUcmVlKCksCisgICAg
Ly8gd2hpY2ggY2FsbHMgdXBkYXRlR3JhcGhpY3NMYXllckdlb21ldHJ5IHZpYSB1cGRhdGVMYXll
ckNvbXBvc2l0aW5nU3RhdGUoKSwgc28gdGhpcyBzaG91bGQKKyAgICAvLyBiZSBvcHRpbWl6ZWQu
CisgICAgaWYgKHBhcmVudExheWVyKQorICAgICAgICBjaGlsZExheWVyLT5iYWNraW5nKCktPnVw
ZGF0ZUdyYXBoaWNzTGF5ZXJHZW9tZXRyeSgpOworfQorCit2b2lkIFJlbmRlckxheWVyQ29tcG9z
aXRvcjo6cmVtb3ZlQ29tcG9zaXRlZENoaWxkcmVuKFJlbmRlckxheWVyKiBsYXllcikKK3sKKyAg
ICBBU1NFUlQobGF5ZXItPmlzQ29tcG9zaXRlZCgpKTsKKworICAgIEdyYXBoaWNzTGF5ZXIqIGhv
c3RpbmdMYXllciA9IGxheWVyLT5iYWNraW5nKCktPnBhcmVudEZvclN1YmxheWVycygpOworICAg
IGhvc3RpbmdMYXllci0+cmVtb3ZlQWxsQ2hpbGRyZW4oKTsKK30KKwordm9pZCBSZW5kZXJMYXll
ckNvbXBvc2l0b3I6OnBhcmVudEluUm9vdExheWVyKFJlbmRlckxheWVyKiBsYXllcikKK3sKKyAg
ICBBU1NFUlQobGF5ZXItPmlzQ29tcG9zaXRlZCgpKTsKKworICAgIEdyYXBoaWNzTGF5ZXIqIGxh
eWVyQW5jaG9yID0gbGF5ZXItPmJhY2tpbmcoKS0+Y2hpbGRGb3JTdXBlcmxheWVycygpOworCisg
ICAgaWYgKGxheWVyQW5jaG9yLT5wYXJlbnQoKSAhPSBtX3Jvb3RQbGF0Zm9ybUxheWVyKSB7Cisg
ICAgICAgIGxheWVyQW5jaG9yLT5yZW1vdmVGcm9tUGFyZW50KCk7CisgICAgICAgIGlmIChtX3Jv
b3RQbGF0Zm9ybUxheWVyKQorICAgICAgICAgICAgbV9yb290UGxhdGZvcm1MYXllci0+YWRkQ2hp
bGQobGF5ZXJBbmNob3IpOworICAgIH0KK30KKwordm9pZCBSZW5kZXJMYXllckNvbXBvc2l0b3I6
OnJlYnVpbGRDb21wb3NpdGluZ0xheWVyVHJlZShSZW5kZXJMYXllciogbGF5ZXIsIHN0cnVjdCBD
b21wb3NpdGluZ1N0YXRlJiBpb0NvbXBTdGF0ZSkKK3sKKyNpZiAwCisgICAgYm9vbCBpbnRlcm5h
bE5lZWRUb0NvbXBvc2l0ZSA9IHJlcXVpcmVzQ29tcG9zaXRpbmdMYXllcihsYXllcik7CisKKyAg
ICBmb3IgKGludCBpID0gMDsgaSA8IGlvQ29tcFN0YXRlLm1fZGVwdGg7ICsraSkKKyAgICAgICAg
ZnByaW50ZihzdGRlcnIsICIgICIpOworCisgICAgZnByaW50ZihzdGRlcnIsICJyZWJ1aWxkQ29t
cG9zaXRpbmdMYXllclRyZWUgJXA6IGhhcyBsYXllciAlZCwgcmVxdWlyZXMgbGF5ZXIgJWQsIGZv
cmNlIGxheWVyICVkLCBzdGFja2luZyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGhpcywg
bGF5ZXItPmlzQ29tcG9zaXRlZCgpLCBpbnRlcm5hbE5lZWRUb0NvbXBvc2l0ZSwgaW9Db21wU3Rh
dGUubV9zdWJ0cmVlSXNDb21wb3NpdGluZywgbGF5ZXItPmlzU3RhY2tpbmdDb250ZXh0KCkpOwor
CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpb0NvbXBTdGF0ZS5tX2RlcHRoOyArK2kpCisgICAg
ICAgIGZwcmludGYoc3RkZXJyLCAiICAiKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImZvcmNlQ29t
cG9zaXRpbmdMYXllciglZCkgJXBcbiIsIGlvQ29tcFN0YXRlLm1fc3VidHJlZUlzQ29tcG9zaXRp
bmcsIHRoaXMpOworI2VuZGlmCisKKyAgICB1cGRhdGVMYXllckNvbXBvc2l0aW5nU3RhdGUobGF5
ZXIsIFJlbmRlclN0eWxlOjpFcXVhbCk7CisKKyAgICAvLyBob3N0IHRoZSBkb2N1bWVudCBsYXll
ciBpbiB0aGUgUmVuZGVyVmlldydzIHJvb3QgbGF5ZXIKKyAgICBpZiAobGF5ZXItPmlzRG9jdW1l
bnRMYXllcigpKQorICAgICAgICBwYXJlbnRJblJvb3RMYXllcihsYXllcik7CisKKyAgICBDb21w
b3NpdGluZ1N0YXRlIGNoaWxkU3RhdGUgPSBpb0NvbXBTdGF0ZTsKKyAgICBpZiAobGF5ZXItPmlz
Q29tcG9zaXRlZCgpKQorICAgICAgICBjaGlsZFN0YXRlLm1fY29tcG9zaXRpbmdBbmNlc3RvciA9
IGxheWVyOworCisgICAgKytjaGlsZFN0YXRlLm1fZGVwdGg7CisKKyAgICBSZW5kZXJMYXllckJh
Y2tpbmcqIGxheWVyQmFja2luZyA9IGxheWVyLT5iYWNraW5nKCk7CisgICAgCisgICAgLy8gRklY
TUU6IG1ha2UgdGhpcyBtb3JlIGluY3JlbWVudGFsCisgICAgaWYgKGxheWVyLT5pc0NvbXBvc2l0
ZWQoKSkgeworICAgICAgICBsYXllckJhY2tpbmctPnBhcmVudEZvclN1YmxheWVycygpLT5yZW1v
dmVBbGxDaGlsZHJlbigpOworICAgICAgICBsYXllckJhY2tpbmctPnVwZGF0ZUludGVybmFsSGll
cmFyY2h5KCk7CisgICAgfQorICAgIAorICAgIC8vIFRoZSBjaGlsZHJlbiBvZiB0aGlzIHN0YWNr
aW5nIGNvbnRleHQgZG9uJ3QgbmVlZCB0byBjb21wb3NpdGUsIHVubGVzcyB0aGVyZSBpcworICAg
IC8vIGEgY29tcG9zaXRpbmcgbGF5ZXIgYW1vbmcgdGhlbSwgc28gc3RhcnQgYnkgYXNzdW1pbmcg
ZmFsc2UuCisgICAgY2hpbGRTdGF0ZS5tX3N1YnRyZWVJc0NvbXBvc2l0aW5nID0gZmFsc2U7CisK
KyAgICBpZiAobGF5ZXItPmlzU3RhY2tpbmdDb250ZXh0KCkpIHsKKyAgICAgICAgQVNTRVJUKCFs
YXllci0+bV96T3JkZXJMaXN0c0RpcnR5KTsKKworICAgICAgICBWZWN0b3I8UmVuZGVyTGF5ZXIq
PiogbmVnWk9yZGVyTGlzdCA9IGxheWVyLT5uZWdaT3JkZXJMaXN0KCk7CisgICAgICAgIGlmIChu
ZWdaT3JkZXJMaXN0ICYmIG5lZ1pPcmRlckxpc3QtPnNpemUoKSA+IDApIHsKKyAgICAgICAgICAg
IGZvciAoVmVjdG9yPFJlbmRlckxheWVyKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbmVnWk9yZGVy
TGlzdC0+YmVnaW4oKTsgaXQgIT0gbmVnWk9yZGVyTGlzdC0+ZW5kKCk7ICsraXQpIHsKKyAgICAg
ICAgICAgICAgICBSZW5kZXJMYXllciogY3VyTGF5ZXIgPSAoKml0KTsKKyAgICAgICAgICAgICAg
ICByZWJ1aWxkQ29tcG9zaXRpbmdMYXllclRyZWUoY3VyTGF5ZXIsIGNoaWxkU3RhdGUpOworICAg
ICAgICAgICAgICAgIGlmIChjdXJMYXllci0+aXNDb21wb3NpdGVkKCkpCisgICAgICAgICAgICAg
ICAgICAgIHNldENvbXBvc2l0aW5nUGFyZW50KGN1ckxheWVyLCBjaGlsZFN0YXRlLm1fY29tcG9z
aXRpbmdBbmNlc3Rvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAo
bGF5ZXJCYWNraW5nICYmIGxheWVyQmFja2luZy0+Y29udGVudHNMYXllcigpKSB7CisgICAgICAg
ICAgICAvLyB3ZSBvbmx5IGhhdmUgYSBjb250ZW50cyBsYXllciBpZiB3ZSBoYXZlIGFuIG1fbGF5
ZXIKKyAgICAgICAgICAgIGxheWVyQmFja2luZy0+Y29udGVudHNMYXllcigpLT5yZW1vdmVGcm9t
UGFyZW50KCk7CisKKyAgICAgICAgICAgIEdyYXBoaWNzTGF5ZXIqIGhvc3RpbmdMYXllciA9IGxh
eWVyQmFja2luZy0+Y2xpcHBpbmdMYXllcigpID8gbGF5ZXJCYWNraW5nLT5jbGlwcGluZ0xheWVy
KCkgOiBsYXllckJhY2tpbmctPmdyYXBoaWNzTGF5ZXIoKTsKKyAgICAgICAgICAgIGhvc3RpbmdM
YXllci0+YWRkQ2hpbGQobGF5ZXJCYWNraW5nLT5jb250ZW50c0xheWVyKCkpOworICAgICAgICB9
CisgICAgfQorCisgICAgQVNTRVJUKCFsYXllci0+bV9vdmVyZmxvd0xpc3REaXJ0eSk7CisgICAg
VmVjdG9yPFJlbmRlckxheWVyKj4qIG92ZXJmbG93TGlzdCA9IGxheWVyLT5vdmVyZmxvd0xpc3Qo
KTsKKyAgICBpZiAob3ZlcmZsb3dMaXN0ICYmIG92ZXJmbG93TGlzdC0+c2l6ZSgpID4gMCkKKyAg
ICAgICAgZm9yIChWZWN0b3I8UmVuZGVyTGF5ZXIqPjo6aXRlcmF0b3IgaXQgPSBvdmVyZmxvd0xp
c3QtPmJlZ2luKCk7IGl0ICE9IG92ZXJmbG93TGlzdC0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAg
ICAgIFJlbmRlckxheWVyKiBjdXJMYXllciA9ICgqaXQpOworICAgICAgICAgICAgcmVidWlsZENv
bXBvc2l0aW5nTGF5ZXJUcmVlKGN1ckxheWVyLCBjaGlsZFN0YXRlKTsKKyAgICAgICAgICAgIGlm
IChjdXJMYXllci0+aXNDb21wb3NpdGVkKCkpCisgICAgICAgICAgICAgICAgc2V0Q29tcG9zaXRp
bmdQYXJlbnQoY3VyTGF5ZXIsIGNoaWxkU3RhdGUubV9jb21wb3NpdGluZ0FuY2VzdG9yKTsKKyAg
ICAgICAgfQorICAgIAorICAgIGlmIChsYXllci0+aXNTdGFja2luZ0NvbnRleHQoKSkgeworICAg
ICAgICBWZWN0b3I8UmVuZGVyTGF5ZXIqPiogcG9zWk9yZGVyTGlzdCA9IGxheWVyLT5wb3NaT3Jk
ZXJMaXN0KCk7CisgICAgICAgIGlmIChwb3NaT3JkZXJMaXN0ICYmIHBvc1pPcmRlckxpc3QtPnNp
emUoKSA+IDApCisgICAgICAgICAgICBmb3IgKFZlY3RvcjxSZW5kZXJMYXllcio+Ojpjb25zdF9p
dGVyYXRvciBpdCA9IHBvc1pPcmRlckxpc3QtPmJlZ2luKCk7IGl0ICE9IHBvc1pPcmRlckxpc3Qt
PmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgUmVuZGVyTGF5ZXIqIGN1ckxheWVyID0g
KCppdCk7CisgICAgICAgICAgICAgICAgcmVidWlsZENvbXBvc2l0aW5nTGF5ZXJUcmVlKGN1ckxh
eWVyLCBjaGlsZFN0YXRlKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VyTGF5ZXItPmlzQ29tcG9z
aXRlZCgpKQorICAgICAgICAgICAgICAgICAgICBzZXRDb21wb3NpdGluZ1BhcmVudChjdXJMYXll
ciwgY2hpbGRTdGF0ZS5tX2NvbXBvc2l0aW5nQW5jZXN0b3IpOworICAgICAgICAgICAgfQorICAg
IH0KK30KKworLy8gcmVwYWludCB0aGUgZ2l2ZW4gcmVjdCBpbiB0aGlzIGxheWVyLCBhbmQgb3B0
aW9uYWxseSB0aGUgcmVjdCBpbiBhbGwgY2hpbGQgbGF5ZXJzCit2b2lkIFJlbmRlckxheWVyQ29t
cG9zaXRvcjo6cmVwYWludENvbXBvc2l0aW5nTGF5ZXJSZWN0KFJlbmRlckxheWVyKiBsYXllciwg
Y29uc3QgSW50UmVjdCYgaW5SZWN0LCBib29sIGluY2x1ZGVEZXNjZW5kYW50cykKK3sKKyAgICBp
ZiAobGF5ZXItPmlzQ29tcG9zaXRlZCgpKQorICAgICAgICBsYXllci0+YmFja2luZygpLT5zZXRD
b250ZW50c05lZWREaXNwbGF5SW5SZWN0KGluUmVjdCk7CisKKyAgICBpZiAobGF5ZXItPmhhc0Nv
bXBvc2l0aW5nRGVzY2VuZGFudCgpICYmIGluY2x1ZGVEZXNjZW5kYW50cykgeworICAgICAgICBB
U1NFUlQobGF5ZXItPmlzU3RhY2tpbmdDb250ZXh0KCkgfHwgKCFsYXllci0+bV9wb3NaT3JkZXJM
aXN0IHx8IGxheWVyLT5tX3Bvc1pPcmRlckxpc3QtPnNpemUoKSA9PSAwKSk7CisKKyAgICAgICAg
VmVjdG9yPFJlbmRlckxheWVyKj4qIG5lZ1pPcmRlckxpc3QgPSBsYXllci0+bmVnWk9yZGVyTGlz
dCgpOworICAgICAgICBpZiAobmVnWk9yZGVyTGlzdCkKKyAgICAgICAgICAgIGZvciAoVmVjdG9y
PFJlbmRlckxheWVyKj46Oml0ZXJhdG9yIGl0ID0gbmVnWk9yZGVyTGlzdC0+YmVnaW4oKTsgaXQg
IT0gbmVnWk9yZGVyTGlzdC0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBSZW5kZXJM
YXllciogY3VyTGF5ZXIgPSAoKml0KTsKKyAgICAgICAgICAgICAgICBpbnQgeCA9IDAsIHkgPSAw
OworICAgICAgICAgICAgICAgIGN1ckxheWVyLT5jb252ZXJ0VG9MYXllckNvb3JkcyhsYXllciwg
eCwgeSk7CisgICAgICAgICAgICAgICAgSW50UmVjdCBjaGlsZFJlY3QoaW5SZWN0KTsKKyAgICAg
ICAgICAgICAgICBjaGlsZFJlY3QubW92ZSgteCwgLXkpOworICAgICAgICAgICAgICAgIHJlcGFp
bnRDb21wb3NpdGluZ0xheWVyUmVjdChjdXJMYXllciwgY2hpbGRSZWN0LCB0cnVlKTsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICBWZWN0b3I8UmVuZGVyTGF5ZXIqPiogcG9zWk9yZGVyTGlzdCA9
IGxheWVyLT5wb3NaT3JkZXJMaXN0KCk7CisgICAgICAgIGlmIChwb3NaT3JkZXJMaXN0KQorICAg
ICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyTGF5ZXIqPjo6aXRlcmF0b3IgaXQgPSBwb3NaT3Jk
ZXJMaXN0LT5iZWdpbigpOyBpdCAhPSBwb3NaT3JkZXJMaXN0LT5lbmQoKTsgKytpdCkgeworICAg
ICAgICAgICAgICAgIFJlbmRlckxheWVyKiBjdXJMYXllciA9ICgqaXQpOworICAgICAgICAgICAg
ICAgIGludCB4ID0gMCwgeSA9IDA7CisgICAgICAgICAgICAgICAgY3VyTGF5ZXItPmNvbnZlcnRU
b0xheWVyQ29vcmRzKGxheWVyLCB4LCB5KTsKKyAgICAgICAgICAgICAgICBJbnRSZWN0IGNoaWxk
UmVjdChpblJlY3QpOworICAgICAgICAgICAgICAgIGNoaWxkUmVjdC5tb3ZlKC14LCAteSk7Cisg
ICAgICAgICAgICAgICAgcmVwYWludENvbXBvc2l0aW5nTGF5ZXJSZWN0KGN1ckxheWVyLCBjaGls
ZFJlY3QsIHRydWUpOworICAgICAgICAgICAgfQorCisgICAgICAgIFZlY3RvcjxSZW5kZXJMYXll
cio+KiBvdmVyZmxvd0xpc3QgPSBsYXllci0+b3ZlcmZsb3dMaXN0KCk7CisgICAgICAgIGlmIChv
dmVyZmxvd0xpc3QpCisgICAgICAgICAgICBmb3IgKFZlY3RvcjxSZW5kZXJMYXllcio+OjppdGVy
YXRvciBpdCA9IG92ZXJmbG93TGlzdC0+YmVnaW4oKTsgaXQgIT0gb3ZlcmZsb3dMaXN0LT5lbmQo
KTsgKytpdCkgeworICAgICAgICAgICAgICAgIFJlbmRlckxheWVyKiBjdXJMYXllciA9ICgqaXQp
OworICAgICAgICAgICAgICAgIGludCB4ID0gMCwgeSA9IDA7CisgICAgICAgICAgICAgICAgY3Vy
TGF5ZXItPmNvbnZlcnRUb0xheWVyQ29vcmRzKGxheWVyLCB4LCB5KTsKKyAgICAgICAgICAgICAg
ICBJbnRSZWN0IGNoaWxkUmVjdChpblJlY3QpOworICAgICAgICAgICAgICAgIGNoaWxkUmVjdC5t
b3ZlKC14LCAteSk7CisgICAgICAgICAgICAgICAgcmVwYWludENvbXBvc2l0aW5nTGF5ZXJSZWN0
KGN1ckxheWVyLCBjaGlsZFJlY3QsIHRydWUpOworICAgICAgICAgICAgfQorICAgIH0KK30KKwor
UmVuZGVyTGF5ZXIqIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6cm9vdFJlbmRlckxheWVyKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gbV9yZW5kZXJWaWV3LT5sYXllcigpOworfQorCitHcmFwaGljc0xh
eWVyKiBSZW5kZXJMYXllckNvbXBvc2l0b3I6OnJvb3RQbGF0Zm9ybUxheWVyKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9yb290UGxhdGZvcm1MYXllcjsKK30KKwordm9pZCBSZW5kZXJMYXllckNv
bXBvc2l0b3I6OndpbGxCZURldGFjaGVkKCkKK3sKKyAgICBpZiAobV9yb290UGxhdGZvcm1MYXll
ciAmJiBtX3Jvb3RMYXllckF0dGFjaGVkKSB7CisgICAgICAgIEZyYW1lKiBmcmFtZSA9IG1fcmVu
ZGVyVmlldy0+ZnJhbWVWaWV3KCktPmZyYW1lKCk7CisgICAgICAgIGlmICghZnJhbWUpCisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIFBhZ2UqIHBhZ2UgPSBmcmFtZS0+cGFnZSgpOworICAg
ICAgICBpZiAoIXBhZ2UpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHBhZ2UtPmNocm9t
ZSgpLT5jbGllbnQoKS0+YXR0YWNoUm9vdEdyYXBoaWNzTGF5ZXIoZnJhbWUsIDApOworICAgICAg
ICBtX3Jvb3RMYXllckF0dGFjaGVkID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIFJlbmRlckxh
eWVyQ29tcG9zaXRvcjo6d2FzQXR0YWNoZWQoKQoreworICAgIGlmIChtX3Jvb3RQbGF0Zm9ybUxh
eWVyKSB7CisgICAgICAgIEZyYW1lKiBmcmFtZSA9IG1fcmVuZGVyVmlldy0+ZnJhbWVWaWV3KCkt
PmZyYW1lKCk7CisgICAgICAgIGlmICghZnJhbWUpCisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIFBhZ2UqIHBhZ2UgPSBmcmFtZS0+cGFnZSgpOworICAgICAgICBpZiAoIXBhZ2UpCisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIHBhZ2UtPmNocm9tZSgpLT5jbGllbnQoKS0+YXR0YWNo
Um9vdEdyYXBoaWNzTGF5ZXIoZnJhbWUsIG1fcm9vdFBsYXRmb3JtTGF5ZXIpOworICAgICAgICBt
X3Jvb3RMYXllckF0dGFjaGVkID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJD
b21wb3NpdG9yOjp1cGRhdGVSb290TGF5ZXJQb3NpdGlvbigpCit7CisgICAgaWYgKG1fcm9vdFBs
YXRmb3JtTGF5ZXIpCisgICAgICAgIG1fcm9vdFBsYXRmb3JtTGF5ZXItPnNldFNpemUoRmxvYXRT
aXplKG1fcmVuZGVyVmlldy0+ZG9jV2lkdGgoKSwgbV9yZW5kZXJWaWV3LT5kb2NIZWlnaHQoKSkp
OworfQorCitib29sIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6bmVlZHNUb0JlQ29tcG9zaXRlZChj
b25zdCBSZW5kZXJMYXllciogbGF5ZXIpIGNvbnN0Cit7CisgICAgcmV0dXJuIHJlcXVpcmVzQ29t
cG9zaXRpbmdMYXllcihsYXllcikgfHwgKGxheWVyLT5iYWNraW5nKCkgJiYgbGF5ZXItPmJhY2tp
bmcoKS0+Zm9yY2VkQ29tcG9zaXRpbmdMYXllcigpKTsKK30KKworc3RhdGljIGJvb2wgcmVxdWly
ZXNDb21wb3NpdGluZ0xheWVyRm9yVHJhbnNmb3JtKGNvbnN0IFJlbmRlclN0eWxlKikKK3sKKyAg
ICByZXR1cm4gZmFsc2U7Cit9CisKKyNkZWZpbmUgVkVSQk9TRV9DT01QT1NJVElOR0xBWUVSICAg
IDAKKworLy8gTm90ZTogdGhpcyBzcGVjaWZpZXMgd2hldGhlciB0aGUgUkwgbmVlZHMgYSBjb21w
b3NpdGluZyBsYXllciBmb3IgaW50cmluc2ljIHJlYXNvbnMuCisvLyBVc2UgbmVlZHNUb0JlQ29t
cG9zaXRlZCgpIHRvIGRldGVybWluZSBpZiBhIFJMIGFjdHVhbGx5IG5lZWRzIGEgY29tcG9zaXRp
bmcgbGF5ZXIuCisvLyBzdGF0aWMKK2Jvb2wgUmVuZGVyTGF5ZXJDb21wb3NpdG9yOjpyZXF1aXJl
c0NvbXBvc2l0aW5nTGF5ZXIoY29uc3QgUmVuZGVyTGF5ZXIqIGxheWVyKSBjb25zdAoreworICAg
IC8vIFRPRE86IGNhY2hlIHRoZSByZXN1bHQgb2YgdGhlc2UgdGVzdHM/CisgICAgY29uc3QgUmVu
ZGVyU3R5bGUqIHJlbmRlclN0eWxlID0gbGF5ZXItPnJlbmRlcmVyKCktPnN0eWxlKCk7CisKKyNp
ZiBWRVJCT1NFX0NPTVBPU0lUSU5HTEFZRVIKKyAgICBib29sIGdvdFJlYXNvbiA9IGZhbHNlOwor
CisgICAgaWYgKCFnb3RSZWFzb24gJiYgaW5Db21wb3NpdGluZ01vZGUoKSAmJiBsYXllci0+aXNE
b2N1bWVudExheWVyKCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJSZW5kZXJMYXllciAl
cCByZXF1aXJlcyBjb21wb3NpdGluZyBsYXllciBiZWNhdXNlOiBpdCdzIHRoZSBkb2N1bWVudCBy
b290XG4iLCBsYXllcik7CisgICAgICAgIGdvdFJlYXNvbiA9IHRydWU7CisgICAgfQorICAgIAor
ICAgIGlmICghZ290UmVhc29uICYmIHJlcXVpcmVzQ29tcG9zaXRpbmdMYXllckZvclRyYW5zZm9y
bShyZW5kZXJTdHlsZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJSZW5kZXJMYXllciAl
cCByZXF1aXJlcyBjb21wb3NpdGluZyBsYXllciBiZWNhdXNlOiBpdCBoYXMgM2QgdHJhbnNmb3Jt
LCBwZXJzcGVjdGl2ZSwgYmFja2ZhY2UsIG9yIGFuaW1hdGluZyB0cmFuc2Zvcm1cbiIsIGxheWVy
KTsKKyAgICAgICAgZ290UmVhc29uID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIWdvdFJlYXNv
biAmJiBjbGlwc0NvbXBvc2l0aW5nRGVzY2VuZGFudHMobGF5ZXIpKSB7CisgICAgICAgIGZwcmlu
dGYoc3RkZXJyLCAiUmVuZGVyTGF5ZXIgJXAgcmVxdWlyZXMgY29tcG9zaXRpbmcgbGF5ZXIgYmVj
YXVzZTogaXQgaGFzIG92ZXJmbG93IGNsaXBcbiIsIGxheWVyKTsKKyAgICAgICAgZ290UmVhc29u
ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIWdvdFJlYXNvbiAmJiByZXF1aXJlc0NvbXBvc2l0
aW5nRm9yQW5pbWF0aW9uKGxheWVyKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJlbmRl
ckxheWVyICVwIHJlcXVpcmVzIGNvbXBvc2l0aW5nIGxheWVyIGJlY2F1c2U6IGl0IGhhcyBhIHJ1
bm5pbmcgdHJhbnNpdGlvbiBmb3Igb3BhY2l0eSBvciB0cmFuc2Zvcm1cbiIsIGxheWVyKTsKKyAg
ICAgICAgZ290UmVhc29uID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgaWYgKCFnb3RSZWFzb24p
CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVuZGVyTGF5ZXIgJXAgZG9lcyBub3QgcmVxdWly
ZSBjb21wb3NpdGluZyBsYXllclxuIiwgbGF5ZXIpOworI2VuZGlmCisKKyAgICAvLyB0aGUgcm9v
dCBsYXllciBhbHdheXMgaGFzIGEgY29tcG9zaXRpbmcgbGF5ZXIgKGZvciBub3cpLgorICAgIHJl
dHVybiAoaW5Db21wb3NpdGluZ01vZGUoKSAmJiBsYXllci0+aXNEb2N1bWVudExheWVyKCkpIHx8
CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAgIChHcmFwaGljc0xheWVyOjpzaG93TGF5ZXJI
aWVyYXJjaHkoKSAmJiBsYXllci0+aXNEb2N1bWVudExheWVyKCkpIHx8CisjZW5kaWYKKyAgICAg
ICAgICAgICByZXF1aXJlc0NvbXBvc2l0aW5nTGF5ZXJGb3JUcmFuc2Zvcm0ocmVuZGVyU3R5bGUp
IHx8CisgICAgICAgICAgICAgY2xpcHNDb21wb3NpdGluZ0Rlc2NlbmRhbnRzKGxheWVyKSB8fAor
ICAgICAgICAgICAgIHJlcXVpcmVzQ29tcG9zaXRpbmdGb3JBbmltYXRpb24obGF5ZXIpOworfQor
CisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbGF5ZXIgaGFzIHNvbWUgYW5jZXN0b3IgaW4g
dGhlIFJlbmRlckxheWVyIGhpZXJhcmNoeSB0aGF0IGNsaXBzLAorLy8gdXAgdG8gdGhlIGVuY2xv
c2luZyBjb21wb3NpdGluZyBhbmNlc3Rvci4gVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIGNvbXBv
c2l0aW5nIGxheWVycyBhcmUgcGFyZW50ZWQKKy8vIGFjY29yZGluZyB0byB0aGUgei1vcmRlciBo
aWVyYXJjaHksIHlldCBjbGlwcGluZyBnb2VzIGRvd24gdGhlIHJlbmRlcmVyIGhpZXJhcmNoeS4K
Ky8vIFRodXMsIGEgUmVuZGVyTGF5ZXIgY2FuIGJlIGNsaXBwZWQgYnkgYSBSZW5kZXJMYXllciB0
aGF0IGlzIGFuIGFuY2VzdG9yIGluIHRoZSByZW5kZXJlciBoaWVyYXJjaHksCisvLyBidXQgYSBz
aWJsaW5nIGluIHRoZSB6LW9yZGVyIGhpZXJhcmNoeS4KK2Jvb2wgUmVuZGVyTGF5ZXJDb21wb3Np
dG9yOjpjbGlwcGVkQnlBbmNlc3RvcihSZW5kZXJMYXllciogbGF5ZXIpIGNvbnN0Cit7CisgICAg
aWYgKCFsYXllci0+aXNDb21wb3NpdGVkKCkgfHwgIWxheWVyLT5wYXJlbnQoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgUmVuZGVyTGF5ZXIqIGNvbXBvc2l0aW5nQW5jZXN0b3IgPSBl
bmNsb3NpbmdDb21wb3NpdGluZ0xheWVyKGxheWVyLCBmYWxzZSk7CisKKyAgICAvLyBXZSBuZWVk
IGFuY2VzdG9yIGNsaXBwaW5nIGlmIHNvbWV0aGluZyBjbGlwcyBiZXR3ZWVuIHRoaXMgbGF5ZXIg
YW5kIGl0cyBjb21wb3NpdGluZywgc3RhY2tpbmcgY29udGV4dCBhbmNlc3RvcgorICAgIGZvciAo
UmVuZGVyTGF5ZXIqIGN1ckxheWVyID0gbGF5ZXItPnBhcmVudCgpOyBjdXJMYXllciAmJiBjdXJM
YXllciAhPSBjb21wb3NpdGluZ0FuY2VzdG9yOyBjdXJMYXllciA9IGN1ckxheWVyLT5wYXJlbnQo
KSkgeworICAgICAgICAvLyBGSVhNRTogbmVlZCB0byBsb29rIGF0IGhhc0NsaXAoKSB0b28gZXZl
bnR1YWxseQorICAgICAgICBpZiAoY3VyTGF5ZXItPnJlbmRlcmVyKCktPmhhc092ZXJmbG93Q2xp
cCgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIAorICAgICAgICAvLyBDbGlw
IGlzIHJlc2V0IGZvciBhbiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgZWxlbWVudC4KKyAgICAgICAg
Ly8gRklYTUU6IG1hbnkgY2FzZXMgYXJlIGJyb2tlbi4gV2UgbmVlZCBtb3JlIG9mIHRoZSBsb2dp
YyBpbiBjYWxjdWxhdGVDbGlwUmVjdHMoKSBoZXJlCisgICAgICAgIGlmIChjdXJMYXllci0+cmVu
ZGVyZXIoKS0+c3R5bGUoKS0+cG9zaXRpb24oKSA9PSBBYnNvbHV0ZVBvc2l0aW9uKQorICAgICAg
ICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm4g
dHJ1ZSBpZiB0aGUgZ2l2ZW4gbGF5ZXIgaXMgYSBzdGFja2luZyBjb250ZXh0IGFuZCBoYXMgY29t
cG9zaXRpbmcgY2hpbGQKKy8vIGxheWVycyB0aGF0IGl0IG5lZWRzIHRvIGNsaXAuIEluIHRoaXMg
Y2FzZSB3ZSBpbnNlcnQgYSBjbGlwcGluZyBHcmFwaGljc0xheWVyCisvLyBpbnRvIHRoZSBoaWVy
YXJjaHkgYmV0d2VlbiB0aGlzIGxheWVyIGFuZCBpdHMgY2hpbGRyZW4gaW4gdGhlIHotb3JkZXIg
aGllcmFyY2h5LgorYm9vbCBSZW5kZXJMYXllckNvbXBvc2l0b3I6OmNsaXBzQ29tcG9zaXRpbmdE
ZXNjZW5kYW50cyhjb25zdCBSZW5kZXJMYXllciogbGF5ZXIpIGNvbnN0Cit7CisgICAgLy8gRklY
TUU6IG5lZWQgdG8gbG9vayBhdCBoYXNDbGlwKCkgdG9vIGV2ZW50dWFsbHkKKyAgICByZXR1cm4g
bGF5ZXItPmhhc0NvbXBvc2l0aW5nRGVzY2VuZGFudCgpICYmCisgICAgICAgICAgIGxheWVyLT5p
c1N0YWNraW5nQ29udGV4dCgpICYmCisgICAgICAgICAgIGxheWVyLT5yZW5kZXJlcigpLT5oYXNP
dmVyZmxvd0NsaXAoKTsKK30KKworYm9vbCBSZW5kZXJMYXllckNvbXBvc2l0b3I6OnJlcXVpcmVz
Q29tcG9zaXRpbmdGb3JBbmltYXRpb24oY29uc3QgUmVuZGVyTGF5ZXIqIGxheWVyKSBjb25zdAor
eworICAgIEFuaW1hdGlvbkNvbnRyb2xsZXIqIGFuaW1Db250cm9sbGVyID0gbGF5ZXItPnJlbmRl
cmVyKCktPmFuaW1hdGlvbigpOworICAgIGlmIChhbmltQ29udHJvbGxlcikKKyAgICAgICAgcmV0
dXJuIGFuaW1Db250cm9sbGVyLT5pc0FuaW1hdGluZ1Byb3BlcnR5T25SZW5kZXJlcihsYXllci0+
cmVuZGVyZXIoKSwgQ1NTUHJvcGVydHlPcGFjaXR5KSB8fAorICAgICAgICAgICAgICAgYW5pbUNv
bnRyb2xsZXItPmlzQW5pbWF0aW5nUHJvcGVydHlPblJlbmRlcmVyKGxheWVyLT5yZW5kZXJlcigp
LCBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisv
LyBJZiBhbiBlbGVtZW50IGhhcyBuZWdhdGl2ZSB6LWluZGV4IGNoaWxkcmVuLCB0aG9zZSBjaGls
ZHJlbiByZW5kZXIgaW4gZnJvbnQgb2YgdGhlIAorLy8gbGF5ZXIgYmFja2dyb3VuZCwgc28gd2Ug
bmVlZCBhbiBleHRyYSAnY29udGVudHMnIGxheWVyIGZvciB0aGUgZm9yZWdyb3VuZCBvZiB0aGUg
bGF5ZXIKKy8vIG9iamVjdC4KK2Jvb2wgUmVuZGVyTGF5ZXJDb21wb3NpdG9yOjpuZWVkc0NvbnRl
bnRzQ29tcG9zaXRpbmdMYXllcihjb25zdCBSZW5kZXJMYXllciogbGF5ZXIpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIChsYXllci0+bV9uZWdaT3JkZXJMaXN0ICYmIGxheWVyLT5tX25lZ1pPcmRlckxp
c3QtPnNpemUoKSA+IDApOworfQorCit2b2lkIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6ZW5zdXJl
Um9vdFBsYXRmb3JtTGF5ZXIoKQoreworICAgIGlmIChtX3Jvb3RQbGF0Zm9ybUxheWVyKQorICAg
ICAgICByZXR1cm47CisKKyAgICBtX3Jvb3RQbGF0Zm9ybUxheWVyID0gR3JhcGhpY3NMYXllcjo6
Y3JlYXRlR3JhcGhpY3NMYXllcigwKTsKKyAgICBtX3Jvb3RQbGF0Zm9ybUxheWVyLT5zZXRTaXpl
KEZsb2F0U2l6ZShtX3JlbmRlclZpZXctPmRvY1dpZHRoKCksIG1fcmVuZGVyVmlldy0+ZG9jSGVp
Z2h0KCkpKTsKKyAgICBtX3Jvb3RQbGF0Zm9ybUxheWVyLT5zZXRQb3NpdGlvbihGbG9hdFBvaW50
KDAsIDApKTsKKworICAgIGlmIChHcmFwaGljc0xheWVyOjpncmFwaGljc0NvbnRleHRzRmxpcHBl
ZCgpKQorICAgICAgICBtX3Jvb3RQbGF0Zm9ybUxheWVyLT5zZXRDaGlsZHJlblRyYW5zZm9ybShm
bGlwVHJhbnNmb3JtKCkpOworCisgICAgLy8gTmVlZCB0byBjbGlwIHRvIHByZXZlbnQgdHJhbnNm
b3JtZWQgY29udGVudCBzaG93aW5nIG91dHNpZGUgdGhpcyBmcmFtZQorICAgIG1fcm9vdFBsYXRm
b3JtTGF5ZXItPnNldE1hc2tzVG9Cb3VuZHModHJ1ZSk7CisgICAgCisgICAgd2FzQXR0YWNoZWQo
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQorCmRpZmYgLS1naXQgYS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJM
YXllckNvbXBvc2l0b3IuaCBiL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQ29tcG9zaXRv
ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkN2Q4YjAKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllckNvbXBvc2l0b3IuaApAQCAt
MCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBu
YW1lIG9mIEFwcGxlIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMg
Y29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk
ZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaWZuZGVmIFJlbmRlckxheWVyQ29tcG9zaXRvcl9oCisjZGVmaW5lIFJlbmRlckxh
eWVyQ29tcG9zaXRvcl9oCisKKyNpbmNsdWRlICJSZW5kZXJMYXllci5oIgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKKyNkZWZpbmUgUFJPRklMRV9MQVlFUl9SRUJVSUxEIDAKKworY2xhc3MgR3Jh
cGhpY3NMYXllcjsKKworLy8gUmVuZGVyTGF5ZXJDb21wb3NpdG9yIG1hbmFnZXMgdGhlIGhpZXJh
cmNoeSBvZgorLy8gY29tcG9zaXRlZCBSZW5kZXJMYXllcnMuIEl0IGRldGVybWluZXMgd2hpY2gg
UmVuZGVyTGF5ZXJzCisvLyBiZWNvbWUgY29tcG9zaXRpbmcsIGFuZCBjcmVhdGVzIGFuZCBtYWlu
dGFpbnMgYSBoaWVyYXJjaHkgb2YKKy8vIEdyYXBoaWNzTGF5ZXJzIGJhc2VkIG9uIHRoZSBSZW5k
ZXJMYXllciBwYWludGluZyBvcmRlci4KKy8vIAorLy8gVGhlcmUgaXMgb25lIFJlbmRlckxheWVy
Q29tcG9zaXRvciBwZXIgUmVuZGVyVmlldy4KKworY2xhc3MgUmVuZGVyTGF5ZXJDb21wb3NpdG9y
IHsKK3B1YmxpYzoKKworICAgIFJlbmRlckxheWVyQ29tcG9zaXRvcihSZW5kZXJWaWV3Kik7Cisg
ICAgflJlbmRlckxheWVyQ29tcG9zaXRvcigpOworICAgIAorICAgIC8vIFJldHVybiB0cnVlIGlm
IHRoaXMgUmVuZGVyVmlldyBpcyBpbiAiY29tcG9zaXRpbmcgbW9kZSIgKGkuZS4gaGFzIG9uZSBv
ciBtb3JlCisgICAgLy8gY29tcG9zaXRlZCBSZW5kZXJMYXllcnMpCisgICAgYm9vbCBpbkNvbXBv
c2l0aW5nTW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fY29tcG9zaXRpbmc7IH0KKyAgICAvLyBUaGlz
IHdpbGwgbWFrZSBhIGNvbXBvc2l0aW5nIGxheWVyIGF0IHRoZSByb290IGF1dG9tYXRpY2FsbHks
IGFuZCBob29rIHVwIHRvCisgICAgLy8gdGhlIG5hdGl2ZSB2aWV3L3dpbmRvdyBzeXN0ZW0uCisg
ICAgdm9pZCBlbmFibGVDb21wb3NpdGluZ01vZGUoYm9vbCBlbmFibGUgPSB0cnVlKTsKKworICAg
IHZvaWQgc2V0Q29tcG9zaXRpbmdMYXllcnNOZWVkVXBkYXRlKGJvb2wgbmVlZFVwZGF0ZSA9IHRy
dWUpOworICAgIGJvb2wgY29tcG9zaXRpbmdMYXllcnNOZWVkVXBkYXRlKCkgY29uc3QgeyByZXR1
cm4gbV9jb21wb3NpdGluZ0xheWVyc05lZWRVcGRhdGU7IH0KKworICAgIC8vIFJlYnVpbGQgdGhl
IHRyZWUgb2YgY29tcG9zaXRpbmcgbGF5ZXJzCisgICAgdm9pZCB1cGRhdGVDb21wb3NpdGluZ0xh
eWVycyhSZW5kZXJMYXllciogdXBkYXRlUm9vdCA9IDApOworCisgICAgLy8gVXBkYXRlIHRoZSBj
b21wb3NpdGluZyBzdGF0ZSBvZiB0aGUgZ2l2ZW4gbGF5ZXIuIFJldHVybnMgdHJ1ZSBpZiB0aGF0
IHN0YXRlIGNoYW5nZWQKKyAgICBib29sIHVwZGF0ZUxheWVyQ29tcG9zaXRpbmdTdGF0ZShSZW5k
ZXJMYXllciosIFJlbmRlclN0eWxlOjpEaWZmKTsKKworICAgIC8vIFJldHVybiB0aGUgYm91bmRp
bmcgYm94IHJlcXVpcmVkIGZvciBjb21wb3NpdGluZyBsYXllciBhbmQgaXRzIGNoaWxkZXJuLCBy
ZWxhdGl2ZSB0byBhbmNlc3RvckxheWVyLgorICAgIC8vIElmIGxheWVyQm91bmRpbmdCb3ggaXMg
bm90IDAsIG9uIHJldHVybiBpdCBjb250YWlucyB0aGUgYm91bmRpbmcgYm94IG9mIHRoaXMgbGF5
ZXIgb25seS4KKyAgICBJbnRSZWN0IGNhbGN1bGF0ZUNvbXBvc2l0ZWRCb3VuZHMoY29uc3QgUmVu
ZGVyTGF5ZXIqIGxheWVyLCBjb25zdCBSZW5kZXJMYXllciogYW5jZXN0b3JMYXllciwgSW50UmVj
dCogbGF5ZXJCb3VuZGluZ0JveCA9IDApOworICAgIAorICAgIC8vIE5vdGlmeSB1cyB0aGF0IGEg
bGF5ZXIgaGFzIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZAorICAgIHZvaWQgbGF5ZXJXYXNBZGRlZChS
ZW5kZXJMYXllciogcGFyZW50LCBSZW5kZXJMYXllciogY2hpbGQpOworICAgIHZvaWQgbGF5ZXJX
aWxsQmVSZW1vdmVkKFJlbmRlckxheWVyKiBwYXJlbnQsIFJlbmRlckxheWVyKiBjaGlsZCk7CisK
KyAgICAvLyBHZXRzIHRoZSBuZWFyZXN0IGVuY2xvc2luZyByZW5kZXIgbGF5ZXIgdGhhdCBpcyBj
b21wb3NpdGVkIChvcHRpb25hbGx5IGluY2x1ZGluZyBzZWxmKQorICAgIFJlbmRlckxheWVyKiBl
bmNsb3NpbmdDb21wb3NpdGluZ0xheWVyKFJlbmRlckxheWVyKiBsYXllciwgYm9vbCBpbmNsdWRl
U2VsZiA9IHRydWUpIGNvbnN0OworCisgICAgLy8gR2V0IHRoZSBuZWFyZXN0IGFuY2VzdG9yIGxh
eWVyIHRoYXQgaGFzIG92ZXJmbG93IG9yIGNsaXAsIGJ1dCBpcyBub3QgYSBzdGFja2luZyBjb250
ZXh0CisgICAgUmVuZGVyTGF5ZXIqIGVuY2xvc2luZ05vblN0YWNraW5nQ2xpcHBpbmdMYXllcihj
b25zdCBSZW5kZXJMYXllciogbGF5ZXIpIGNvbnN0OworCisgICAgdm9pZCByZXBhaW50Q29tcG9z
aXRpbmdMYXllclJlY3QoUmVuZGVyTGF5ZXIqLCBjb25zdCBJbnRSZWN0JiwgYm9vbCBpbmNsdWRl
RGVzY2VuZGFudHMpOworCisgICAgUmVuZGVyTGF5ZXIqIHJvb3RSZW5kZXJMYXllcigpIGNvbnN0
OworICAgIEdyYXBoaWNzTGF5ZXIqIHJvb3RQbGF0Zm9ybUxheWVyKCkgY29uc3Q7CisKKyAgICB2
b2lkIHdpbGxCZURldGFjaGVkKCk7CisgICAgdm9pZCB3YXNBdHRhY2hlZCgpOworICAgIHZvaWQg
dXBkYXRlUm9vdExheWVyUG9zaXRpb24oKTsKKworcHJpdmF0ZToKKyAgICAvLyBXaGV0aGVyIHRo
ZSBnaXZlbiBSTCBuZWVkcyBhIGNvbXBvc2l0aW5nIGxheWVyLgorICAgIGJvb2wgbmVlZHNUb0Jl
Q29tcG9zaXRlZChjb25zdCBSZW5kZXJMYXllciopIGNvbnN0OworICAgIC8vIFdoZXRoZXIgdGhl
IGxheWVyIGhhcyBhbiBpbnRyaW5zaWMgbmVlZCBmb3IgY29tcG9zaXRpbmcgbGF5ZXIuCisgICAg
Ym9vbCByZXF1aXJlc0NvbXBvc2l0aW5nTGF5ZXIoY29uc3QgUmVuZGVyTGF5ZXIqKSBjb25zdDsK
KworICAgIC8vIFdoZXRoZXIgd2UgbmVlZCBhIGdyYXBoaWNzIGxheWVyIHRvIGRvIGNsaXBwaW5n
IGJ5IGFuIGFuY2VzdG9yIChub24tc3RhY2tpbmctY29udGV4dCBwYXJlbnQgd2l0aCBvdmVyZmxv
dykuCisgICAgYm9vbCBjbGlwcGVkQnlBbmNlc3RvcihSZW5kZXJMYXllciopIGNvbnN0OworICAg
IC8vIFdoZXRoZXIgd2UgbmVlZCBhIGdyYXBoaWNzIGxheWVyIHRvIGNsaXAgei1vcmRlciBjaGls
ZHJlbiBvZiB0aGUgZ2l2ZW4gbGF5ZXIuCisgICAgYm9vbCBjbGlwc0NvbXBvc2l0aW5nRGVzY2Vu
ZGFudHMoY29uc3QgUmVuZGVyTGF5ZXIqKSBjb25zdDsKKworICAgIC8vIFdoZXRoZXIgYSBydW5u
aW5nIHRyYW5zaXRpb24gb3IgYW5pbWF0aW9uIGVuZm9yY2VzIHRoZSBuZWVkIGZvciBhIGNvbXBv
c2l0aW5nIGxheWVyLgorICAgIGJvb2wgcmVxdWlyZXNDb21wb3NpdGluZ0ZvckFuaW1hdGlvbihj
b25zdCBSZW5kZXJMYXllciopIGNvbnN0OworICAgIC8vIFdoZXRoZXIgdGhlIGdpdmVuIGxheWVy
IG5lZWRzIGFuIGV4dHJhICdjb250ZW50cycgbGF5ZXIuCisgICAgYm9vbCBuZWVkc0NvbnRlbnRz
Q29tcG9zaXRpbmdMYXllcihjb25zdCBSZW5kZXJMYXllciopIGNvbnN0OworCisgICAgLy8gU2V0
IGEgYml0IG9uIHRoaXMgbGF5ZXIgdG8gZm9yY2UgaXQgdG8gYmUgY29tcG9zaXN0ZWQsIGJlY2F1
c2UgaXQgaGFzIHRvIHJlbmRlciBvbiB0b3Agb2YKKyAgICAvLyBvdGhlciBjb21wb3NpdGluZyBs
YXllcnMuCisgICAgdm9pZCBzZXRGb3JjZWRDb21wb3NpdGluZ0xheWVyKFJlbmRlckxheWVyKiwg
Ym9vbCBmb3JjZSk7CisKKyAgICB2b2lkIGNvbXB1dGVDb21wb3NpdGluZ1JlcXVpcmVtZW50cyhS
ZW5kZXJMYXllciosIHN0cnVjdCBDb21wb3NpdGluZ1N0YXRlJiBjb21wU3RhdGUpOworICAgIHZv
aWQgcmVidWlsZENvbXBvc2l0aW5nTGF5ZXJUcmVlKFJlbmRlckxheWVyKiBsYXllciwgc3RydWN0
IENvbXBvc2l0aW5nU3RhdGUmIGNvbXBTdGF0ZSk7CisKKyAgICAvLyBIb29rIGNvbXBvc2l0aW5n
IGxheWVycyB0b2dldGhlcgorICAgIHZvaWQgc2V0Q29tcG9zaXRpbmdQYXJlbnQoUmVuZGVyTGF5
ZXIqIGNoaWxkTGF5ZXIsIFJlbmRlckxheWVyKiBwYXJlbnRMYXllcik7CisgICAgdm9pZCByZW1v
dmVDb21wb3NpdGVkQ2hpbGRyZW4oUmVuZGVyTGF5ZXIqIGxheWVyKTsKKworICAgIHZvaWQgcGFy
ZW50SW5Sb290TGF5ZXIoUmVuZGVyTGF5ZXIqIGxheWVyKTsKKworICAgIHZvaWQgZW5zdXJlUm9v
dFBsYXRmb3JtTGF5ZXIoKTsKKworcHJpdmF0ZToKKyAgICBSZW5kZXJWaWV3KiBtX3JlbmRlclZp
ZXc7CisgICAgR3JhcGhpY3NMYXllciogbV9yb290UGxhdGZvcm1MYXllcjsKKyAgICBib29sIG1f
Y29tcG9zaXRpbmc7CisgICAgYm9vbCBtX3Jvb3RMYXllckF0dGFjaGVkOworICAgIGJvb2wgbV9j
b21wb3NpdGluZ0xheWVyc05lZWRVcGRhdGU7CisjaWYgUFJPRklMRV9MQVlFUl9SRUJVSUxECisg
ICAgaW50IG1fcm9vdExheWVyVXBkYXRlQ291bnQ7CisjZW5kaWYKK307CisKKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUmVuZGVyTGF5ZXJDb21wb3NpdG9yX2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26986</attachid>
            <date>2009-01-23 16:22:41 -0800</date>
            <delta_ts>2009-01-23 16:23:02 -0800</delta_ts>
            <desc>Patch, changelog</desc>
            <filename>23357_patch2.txt</filename>
            <type>text/plain</type>
            <size>87171</size>
            <attacher name="Simon Fraser (smfr)">simon.fraser</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YmE1YmM5ZS4uZTIwOTM2ZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyNSBAQAorMjAwOS0wMS0yMyAgU2ltb24gRnJhc2Vy
ICA8c2ltb24uZnJhc2VyQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MjMzNTcKKyAgICAgICAgCisgICAgICAgIE5ldyBmaWxlcyB0byBzdXBwb3J0IGFjY2VsZXJh
dGVkIGNvbXBvc2l0aW5nIGF0IHRoZSBSZW5kZXJMYXllcgorICAgICAgICBsZXZlbC4KKyAgICAg
ICAgCisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAg
ICBOZXcgZmlsZXMgYWRkZWQgdG8gcHJvamVjdC4KKyAgICAgICAgCisgICAgICAgICogcmVuZGVy
aW5nL1JlbmRlckxheWVyQmFja2luZy5jcHA6IEFkZGVkLgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJMYXllckJhY2tpbmcuaDogQWRkZWQuCisgICAgICAgIE5ldyBvYmplY3QgdG8gc3RvcmUg
Y29tcG9zaXRpbmctcmVsYXRlZCBkYXRhIGZvciBhIHNpbmdsZQorICAgICAgICBSZW5kZXJMYXll
ci4KKyAgICAgICAgCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckxheWVyQ29tcG9zaXRvci5j
cHA6IEFkZGVkLgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJMYXllckNvbXBvc2l0b3IuaDog
QWRkZWQuCisgICAgICAgIFBlci1SZW5kZXJWaWV3IGNvbnRyb2xsZXIgb2JqZWN0IGZvciBjb21w
b3NpdGluZyBoaWVyYXJjaHkKKyAgICAgICAgbWFpbnRlbmFuY2UuCisKIDIwMDktMDEtMjMgIERh
dmlkIEh5YXR0ICA8aHlhdHRAYXBwbGUuY29tPgogCiAgICAgICAgIEZpeCBmb3IgPHJkYXI6Ly9w
cm9ibGVtLzY1MTg4NTA+IFJFR1JFU1NJT046IGhvdmVyIGZlZWRiYWNrIG5vdCBzaG93aW5nIG9u
IG1hbnkgc2l0ZXMKZGlmZiAtLWdpdCBhL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVj
dC5wYnhwcm9qIGIvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKaW5k
ZXggZjA4NTdkNy4uYWQzZDNjNCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oKKysrIGIvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0
LnBieHByb2oKQEAgLTEzOSw2ICsxMzksMTAgQEAKIAkJMEY1NjAyOTAwRTRCNzY1ODAwNjVCMDM4
IC8qIFJlbmRlck1hcnF1ZWUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMEY1NjAyOEUwRTRCNzY1ODAwNjVCMDM4IC8qIFJlbmRlck1hcnF1ZWUuY3Bw
ICovOyB9OwogCQkwRjZFQ0Q0NTBGMjUyRjM3MDBCREUyNzEgLyogQ1NTUHJvcGVydHlMb25naGFu
ZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY2RUNE
NDMwRjI1MkYzNzAwQkRFMjcxIC8qIENTU1Byb3BlcnR5TG9uZ2hhbmQuaCAqLzsgfTsKIAkJMEY2
RUNENDYwRjI1MkYzNzAwQkRFMjcxIC8qIENTU1Byb3BlcnR5TG9uZ2hhbmQuY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY2RUNENDQwRjI1MkYzNzAw
QkRFMjcxIC8qIENTU1Byb3BlcnR5TG9uZ2hhbmQuY3BwICovOyB9OworCQkwRkFGRjlBRTBGMkE5
NjkxMDAwN0RCNzUgLyogUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkFGRjlBQTBGMkE5NjkxMDAwN0RCNzUgLyog
UmVuZGVyTGF5ZXJDb21wb3NpdG9yLmggKi87IH07CisJCTBGQUZGOUFGMEYyQTk2OTEwMDA3REI3
NSAvKiBSZW5kZXJMYXllckNvbXBvc2l0b3IuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMEZBRkY5QUIwRjJBOTY5MTAwMDdEQjc1IC8qIFJlbmRlckxh
eWVyQ29tcG9zaXRvci5jcHAgKi87IH07CisJCTBGQUZGOUIwMEYyQTk2OTEwMDA3REI3NSAvKiBS
ZW5kZXJMYXllckJhY2tpbmcuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDBGQUZGOUFDMEYyQTk2OTEwMDA3REI3NSAvKiBSZW5kZXJMYXllckJhY2tpbmcu
aCAqLzsgfTsKKwkJMEZBRkY5QjEwRjJBOTY5MTAwMDdEQjc1IC8qIFJlbmRlckxheWVyQmFja2lu
Zy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkFG
RjlBRDBGMkE5NjkxMDAwN0RCNzUgLyogUmVuZGVyTGF5ZXJCYWNraW5nLmNwcCAqLzsgfTsKIAkJ
MEZDNzA1MjEwRUIxODE1NjAwQjkwQUQ4IC8qIEF0b21pY1N0cmluZ0hhc2guaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGQzcwNTIwMEVCMTgxNTYwMEI5
MEFEOCAvKiBBdG9taWNTdHJpbmdIYXNoLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAo
UHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEZENzIzODIwRUM4QkQ5MzAwQ0E1REQ3IC8qIEZsb2F0UXVh
ZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZENzIz
ODAwRUM4QkQ5MzAwQ0E1REQ3IC8qIEZsb2F0UXVhZC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGRDcyMzgzMEVDOEJEOTMwMENBNURENyAvKiBG
bG9hdFF1YWQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gMEZENzIzODEwRUM4QkQ5MzAwQ0E1REQ3IC8qIEZsb2F0UXVhZC5jcHAgKi87IH07CkBAIC00
OTc1LDYgKzQ5NzksMTAgQEAKIAkJMEY1NjAyOEUwRTRCNzY1ODAwNjVCMDM4IC8qIFJlbmRlck1h
cnF1ZWUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVyTWFy
cXVlZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGNkVDRDQzMEYyNTJGMzcw
MEJERTI3MSAvKiBDU1NQcm9wZXJ0eUxvbmdoYW5kLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IENTU1Byb3BlcnR5TG9uZ2hhbmQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJMEY2RUNENDQwRjI1MkYzNzAwQkRFMjcxIC8qIENTU1Byb3BlcnR5TG9uZ2hhbmQuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQ1NTUHJvcGVydHlMb25naGFu
ZC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGQUZGOUFBMEYyQTk2OTEwMDA3
REI3NSAvKiBSZW5kZXJMYXllckNvbXBvc2l0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CisJCTBGQUZGOUFCMEYyQTk2OTEwMDA3REI3NSAvKiBSZW5kZXJMYXllckNvbXBvc2l0b3Iu
Y3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVyTGF5ZXJDb21w
b3NpdG9yLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEZBRkY5QUMwRjJBOTY5
MTAwMDdEQjc1IC8qIFJlbmRlckxheWVyQmFja2luZy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBSZW5kZXJMYXllckJhY2tpbmcuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJMEZBRkY5QUQwRjJBOTY5MTAwMDdEQjc1IC8qIFJlbmRlckxheWVyQmFja2luZy5jcHAg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBSZW5kZXJMYXllckJhY2tpbmcu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwRkM3MDUyMDBFQjE4MTU2MDBCOTBB
RDggLyogQXRvbWljU3RyaW5nSGFzaC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBBdG9taWNTdHJpbmdIYXNoLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRDcy
MzgwMEVDOEJEOTMwMENBNURENyAvKiBGbG9hdFF1YWQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBwYXRoID0gRmxvYXRRdWFkLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBG
RDcyMzgxMEVDOEJEOTMwMENBNURENyAvKiBGbG9hdFF1YWQuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gRmxvYXRRdWFkLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKQEAgLTE0MDUxLDYgKzE0MDU5LDEwIEBACiAJCQkJQkNFQTQ4MzkwOTdEOTMwMjAwOTRD
OUU0IC8qIFJlbmRlcklubGluZS5oICovLAogCQkJCUJDRUE0ODNBMDk3RDkzMDIwMDk0QzlFNCAv
KiBSZW5kZXJMYXllci5jcHAgKi8sCiAJCQkJQkNFQTQ4M0IwOTdEOTMwMjAwOTRDOUU0IC8qIFJl
bmRlckxheWVyLmggKi8sCisJCQkJMEZBRkY5QUQwRjJBOTY5MTAwMDdEQjc1IC8qIFJlbmRlckxh
eWVyQmFja2luZy5jcHAgKi8sCisJCQkJMEZBRkY5QUMwRjJBOTY5MTAwMDdEQjc1IC8qIFJlbmRl
ckxheWVyQmFja2luZy5oICovLAorCQkJCTBGQUZGOUFCMEYyQTk2OTEwMDA3REI3NSAvKiBSZW5k
ZXJMYXllckNvbXBvc2l0b3IuY3BwICovLAorCQkJCTBGQUZGOUFBMEYyQTk2OTEwMDA3REI3NSAv
KiBSZW5kZXJMYXllckNvbXBvc2l0b3IuaCAqLywKIAkJCQlBOEVBNzNCNjBBMTkwMEUzMDBBOEVG
NUYgLyogUmVuZGVyTGVnZW5kLmNwcCAqLywKIAkJCQlBOEVBNzNCRDBBMTkwMEUzMDBBOEVGNUYg
LyogUmVuZGVyTGVnZW5kLmggKi8sCiAJCQkJQUJCNTQxOUMwQUNEREZFNDAwMjgyMEVCIC8qIFJl
bmRlckxpc3RCb3guY3BwICovLApAQCAtMTY2MjgsNiArMTY2NDAsOCBAQAogCQkJCTFBNTY5RDI1
MEQ3RTJCODIwMDdDMzk4MyAvKiBydW50aW1lX3Jvb3QuaCBpbiBIZWFkZXJzICovLAogCQkJCTkz
MzA5RTFFMDk5RTY0OTIwMDU2RTU4MSAvKiB2aXNpYmxlX3VuaXRzLmggaW4gSGVhZGVycyAqLywK
IAkJCQkxOEEwNTM3RDBGMjY4NTlDMDBBNTE3MDUgLyogV29ya2VyUnVuTG9vcC5oIGluIEhlYWRl
cnMgKi8sCisJCQkJMEZBRkY5QUUwRjJBOTY5MTAwMDdEQjc1IC8qIFJlbmRlckxheWVyQ29tcG9z
aXRvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMEZBRkY5QjAwRjJBOTY5MTAwMDdEQjc1IC8qIFJl
bmRlckxheWVyQmFja2luZy5oIGluIEhlYWRlcnMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRl
cGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkBAIC0xODU5Nyw2ICsxODYxMSw4IEBA
CiAJCQkJMUE1NjlEMjIwRDdFMkI4MjAwN0MzOTgzIC8qIHJ1bnRpbWVfb2JqZWN0LmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCTFBNTY5RDI0MEQ3RTJCODIwMDdDMzk4MyAvKiBydW50aW1lX3Jvb3Qu
Y3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTMzMDlFMUQwOTlFNjQ5MjAwNTZFNTgxIC8qIHZpc2li
bGVfdW5pdHMuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMEZBRkY5QUYwRjJBOTY5MTAwMDdEQjc1
IC8qIFJlbmRlckxheWVyQ29tcG9zaXRvci5jcHAgaW4gU291cmNlcyAqLywKKwkJCQkwRkFGRjlC
MTBGMkE5NjkxMDAwN0RCNzUgLyogUmVuZGVyTGF5ZXJCYWNraW5nLmNwcCBpbiBTb3VyY2VzICov
LAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9
OwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJCYWNraW5nLmNwcCBi
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5jcHAKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uY2VkMWNmOAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5jcHAKQEAgLTAsMCArMSw5NTEgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2lu
Y2x1ZGUgIkFuaW1hdGlvbkNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJDU1NTdHlsZVNlbGVjdG9y
LmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0Lmgi
CisjaW5jbHVkZSAiR3JhcGhpY3NMYXllci5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXF1ZXN0Lmgi
CisjaW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2lu
Y2x1ZGUgIlJlbmRlckJveC5oIgorI2luY2x1ZGUgIlJlbmRlckltYWdlLmgiCisjaW5jbHVkZSAi
UmVuZGVyTGF5ZXJDb21wb3NpdG9yLmgiCisjaW5jbHVkZSAiUmVuZGVyVmlkZW8uaCIKKyNpbmNs
dWRlICJSZW5kZXJWaWV3LmgiCisKKyNpbmNsdWRlICJSZW5kZXJMYXllckJhY2tpbmcuaCIKKwor
dXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdHJ1Y3QgTGF5
ZXJIaXRUZXN0RGF0YSB7CisgICAgTGF5ZXJIaXRUZXN0RGF0YShSZW5kZXJMYXllciogcm9vdExh
eWVyLCBjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgaGl0VGVz
dFJlc3VsdCwgY29uc3QgSW50UmVjdCYgaGl0VGVzdFJlY3QpCisgICAgICAgIDogbV9yb290TGF5
ZXIocm9vdExheWVyKQorICAgICAgICAsIG1fcmVxdWVzdChyZXF1ZXN0KQorICAgICAgICAsIG1f
aGl0VGVzdFJlY3QoaGl0VGVzdFJlY3QpCisgICAgICAgICwgbV9yZXN1bHQoaGl0VGVzdFJlc3Vs
dCkKKyAgICB7CisgICAgfQorICAgIAorICAgIFJlbmRlckxheWVyKiBtX3Jvb3RMYXllcjsKKyAg
ICBjb25zdCBIaXRUZXN0UmVxdWVzdCYgbV9yZXF1ZXN0OworICAgIGNvbnN0IEludFJlY3QmIG1f
aGl0VGVzdFJlY3Q7CisgICAgSGl0VGVzdFJlc3VsdCYgbV9yZXN1bHQ7Cit9OworCisKK1JlbmRl
ckxheWVyQmFja2luZzo6UmVuZGVyTGF5ZXJCYWNraW5nKFJlbmRlckxheWVyKiBsYXllcikKKyAg
ICA6IG1fb3duaW5nTGF5ZXIobGF5ZXIpCisgICAgLCBtX2FuY2VzdG9yQ2xpcHBpbmdMYXllcigw
KQorICAgICwgbV9ncmFwaGljc0xheWVyKDApCisgICAgLCBtX2NvbnRlbnRzTGF5ZXIoMCkKKyAg
ICAsIG1fY2xpcHBpbmdMYXllcigwKQorICAgICwgbV9mb3JjZUNvbXBvc2l0aW5nTGF5ZXIoZmFs
c2UpCisgICAgLCBtX2lzU2ltcGxlQ29udGFpbmVyQ29tcG9zaXRpbmdMYXllcihmYWxzZSkKKyAg
ICAsIG1fc2ltcGxlQ29tcG9zaXRpbmdMYXllclN0YXR1c0RpcnR5KHRydWUpCisgICAgLCBtX2Nv
bXBvc2l0aW5nQ29udGVudE9mZnNldERpcnR5KHRydWUpCit7CisgICAgY3JlYXRlR3JhcGhpY3NM
YXllcigpOworfQorCitSZW5kZXJMYXllckJhY2tpbmc6On5SZW5kZXJMYXllckJhY2tpbmcoKQor
eworICAgIHVwZGF0ZUNsaXBwaW5nTGF5ZXJzKGZhbHNlLCBmYWxzZSk7CisgICAgdXBkYXRlQ29u
dGVudHNMYXllcihmYWxzZSk7CisgICAgZGVzdHJveUdyYXBoaWNzTGF5ZXIoKTsKK30KKwordm9p
ZCBSZW5kZXJMYXllckJhY2tpbmc6OmNyZWF0ZUdyYXBoaWNzTGF5ZXIoKQoreworICAgIG1fZ3Jh
cGhpY3NMYXllciA9IEdyYXBoaWNzTGF5ZXI6OmNyZWF0ZUdyYXBoaWNzTGF5ZXIodGhpcyk7Cisg
ICAgCisjaWZuZGVmIE5ERUJVRworICAgIGlmIChyZW5kZXJlcigpLT5ub2RlKCktPmlzRG9jdW1l
bnROb2RlKCkpCisgICAgICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0TmFtZSgiRG9jdW1lbnQgTm9k
ZSIpOworICAgIGVsc2UgeworICAgICAgICBpZiAocmVuZGVyZXIoKS0+bm9kZSgpLT5pc0hUTUxF
bGVtZW50KCkgJiYgcmVuZGVyZXIoKS0+bm9kZSgpLT5oYXNJRCgpKQorICAgICAgICAgICAgbV9n
cmFwaGljc0xheWVyLT5zZXROYW1lKHJlbmRlcmVyKCktPnJlbmRlck5hbWUoKSArIFN0cmluZygi
ICIpICsgc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnQqPihyZW5kZXJlcigpLT5lbGVtZW50KCkpLT5p
ZCgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbV9ncmFwaGljc0xheWVyLT5zZXROYW1l
KHJlbmRlcmVyKCktPnJlbmRlck5hbWUoKSk7CisgICAgfQorI2VuZGlmICAvLyBOREVCVUcKKwor
ICAgIHVwZGF0ZUxheWVyT3BhY2l0eSgpOworICAgIHVwZGF0ZUxheWVyVHJhbnNmb3JtKCk7Cit9
CisKK3ZvaWQgUmVuZGVyTGF5ZXJCYWNraW5nOjpkZXN0cm95R3JhcGhpY3NMYXllcigpCit7Cisg
ICAgaWYgKG1fZ3JhcGhpY3NMYXllcikKKyAgICAgICAgbV9ncmFwaGljc0xheWVyLT5yZW1vdmVG
cm9tUGFyZW50KCk7CisKKyAgICBkZWxldGUgbV9ncmFwaGljc0xheWVyOworICAgIG1fZ3JhcGhp
Y3NMYXllciA9IDA7CisKKyAgICBkZWxldGUgbV9jb250ZW50c0xheWVyOworICAgIG1fY29udGVu
dHNMYXllciA9IDA7CisKKyAgICBkZWxldGUgbV9jbGlwcGluZ0xheWVyOworICAgIG1fY2xpcHBp
bmdMYXllciA9IDA7Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJCYWNraW5nOjp1cGRhdGVMYXllck9w
YWNpdHkoKQoreworICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0T3BhY2l0eShjb21wb3NpdGluZ09w
YWNpdHkocmVuZGVyZXIoKS0+b3BhY2l0eSgpKSwgMCwgMCk7Cit9CisKK3ZvaWQgUmVuZGVyTGF5
ZXJCYWNraW5nOjp1cGRhdGVMYXllclRyYW5zZm9ybSgpCit7CisgICAgUmVuZGVyU3R5bGUqIHN0
eWxlID0gcmVuZGVyZXIoKS0+c3R5bGUoKTsKKyAgICBjb25zdCBJbnRSZWN0IGJvcmRlckJveCA9
IHJlbmRlcmVyKCktPmJvcmRlckJveFJlY3QoKTsKKworICAgIC8vIEZJWE1FOiBUaGlzIHNob3Vs
ZCB1c2UgbV9vd25pbmdMYXllci0+dHJhbnNmb3JtKCksIGJ1dCB0aGF0IGN1cnJlbnRseSBoYXMg
dHJhbnNmb3JtLW9yaWdpbgorICAgIC8vIGJha2VkIGludG8gaXQsIGFuZCB3ZSBkb24ndCB3YW50
IHRoYXQuCisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdDsKKyAgICBzdHlsZS0+YXBwbHlUcmFu
c2Zvcm0odCwgYm9yZGVyQm94LnNpemUoKSwgZmFsc2UpOworCisgICAgbV9ncmFwaGljc0xheWVy
LT5zZXRUcmFuc2Zvcm0odCk7Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJCYWNraW5nOjp1cGRhdGVB
ZnRlckxheW91dCgpCit7CisgICAgaW52YWxpZGF0ZURyYXdpbmdPcHRpbWl6YXRpb25zKCk7Cisg
ICAgZGV0ZWN0RHJhd2luZ09wdGltaXphdGlvbnMoKTsKKworICAgIHVwZGF0ZUdyYXBoaWNzTGF5
ZXJHZW9tZXRyeSgpOworfQorCitib29sIFJlbmRlckxheWVyQmFja2luZzo6dXBkYXRlR3JhcGhp
Y3NMYXllcnMoYm9vbCBuZWVkc0NvbnRlbnRzTGF5ZXIsIGJvb2wgbmVlZHNVcHBlckNsaXBwaW5n
TGF5ZXIsIGJvb2wgbmVlZHNMb3dlckNsaXBwaW5nTGF5ZXIsIGJvb2wgbmVlZHNSZXBhaW50KQor
eworICAgIGJvb2wgbGF5ZXJDb25maWdDaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKHVwZGF0ZUNv
bnRlbnRzTGF5ZXIobmVlZHNDb250ZW50c0xheWVyKSkKKyAgICAgICAgbGF5ZXJDb25maWdDaGFu
Z2VkID0gdHJ1ZTsKKyAgICAKKyAgICBpZiAodXBkYXRlQ2xpcHBpbmdMYXllcnMobmVlZHNVcHBl
ckNsaXBwaW5nTGF5ZXIsIG5lZWRzTG93ZXJDbGlwcGluZ0xheWVyKSkKKyAgICAgICAgbGF5ZXJD
b25maWdDaGFuZ2VkID0gdHJ1ZTsKKworICAgIC8vIFNlZSBpZiB3ZSBjYW4gbm93IHVzZSBhbnkg
ZHJhd2luZyBvcHRpbWl6YXRpb25zLgorICAgIGJvb2wgZGlkRHJhd0NvbnRlbnQgPSBncmFwaGlj
c0xheWVyKCktPmRyYXdzQ29udGVudCgpOworICAgIGludmFsaWRhdGVEcmF3aW5nT3B0aW1pemF0
aW9ucygpOworICAgIGRldGVjdERyYXdpbmdPcHRpbWl6YXRpb25zKCk7CisgICAgaWYgKCFkaWRE
cmF3Q29udGVudCAmJiBncmFwaGljc0xheWVyKCktPmRyYXdzQ29udGVudCgpKQorICAgICAgICBu
ZWVkc1JlcGFpbnQgPSB0cnVlOworCisgICAgLy8gU2V0IG9wYWNpdHksIGlmIGl0IGlzIG5vdCBh
bmltYXRpbmcuCisgICAgaWYgKCFyZW5kZXJlcigpLT5hbmltYXRpb24oKS0+aXNBbmltYXRpbmdQ
cm9wZXJ0eU9uUmVuZGVyZXIocmVuZGVyZXIoKSwgQ1NTUHJvcGVydHlPcGFjaXR5KSkKKyAgICAg
ICAgdXBkYXRlTGF5ZXJPcGFjaXR5KCk7CisgICAgCisgICAgdXBkYXRlR3JhcGhpY3NMYXllckdl
b21ldHJ5KCk7CisgICAgCisgICAgbV9ncmFwaGljc0xheWVyLT51cGRhdGVDb250ZW50c1JlY3Qo
KTsKKyAgICAKKyAgICBpZiAobmVlZHNSZXBhaW50KSB7CisgICAgICAgIG1fZ3JhcGhpY3NMYXll
ci0+c2V0TmVlZHNEaXNwbGF5KCk7CisgICAgICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpCisgICAg
ICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldE5lZWRzRGlzcGxheSgpOworICAgIH0KKyAgICAK
KyAgICByZXR1cm4gbGF5ZXJDb25maWdDaGFuZ2VkOworfQorCit2b2lkIFJlbmRlckxheWVyQmFj
a2luZzo6dXBkYXRlR3JhcGhpY3NMYXllckdlb21ldHJ5KCkKK3sKKyAgICAvLyBJZiB3ZSBoYXZl
bid0IGJ1aWx0IHotb3JkZXIgbGlzdHMgeWV0LCB3YWl0IHVudGlsIGxhdGVyLgorICAgIGlmICht
X293bmluZ0xheWVyLT5pc1N0YWNraW5nQ29udGV4dCgpICYmIG1fb3duaW5nTGF5ZXItPm1fek9y
ZGVyTGlzdHNEaXJ0eSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gU2V0IHRyYW5zZm9ybSBw
cm9wZXJ0eSwgaWYgaXQgaXMgbm90IGFuaW1hdGluZy4gV2UgaGF2ZSB0byBkbyB0aGlzIGhlcmUg
YmVjYXVzZSB0aGUgdHJhbnNmb3JtCisgICAgLy8gaXMgYWZmZWN0ZWQgYnkgdGhlIGxheWVyIGRp
bWVuc2lvbnMuCisgICAgaWYgKCFyZW5kZXJlcigpLT5hbmltYXRpb24oKS0+aXNBbmltYXRpbmdQ
cm9wZXJ0eU9uUmVuZGVyZXIocmVuZGVyZXIoKSwgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm0p
KQorICAgICAgICB1cGRhdGVMYXllclRyYW5zZm9ybSgpOworCisgICAgbV9jb21wb3NpdGluZ0Nv
bnRlbnRPZmZzZXREaXJ0eSA9IHRydWU7CisgICAgCisgICAgUmVuZGVyTGF5ZXIqIGNvbXBBbmNl
c3RvciA9IGNvbXBvc2l0b3IoKS0+ZW5jbG9zaW5nQ29tcG9zaXRpbmdMYXllcihtX293bmluZ0xh
eWVyLCBmYWxzZSk7CisgICAgCisgICAgLy8gV2UgY29tcHV0ZSBldmVyeXRoaW5nIHJlbGF0aXZl
IHRvIHRoZSBlbmNsb3NpbmcgY29tcG9zaXRpbmcgbGF5ZXIuCisgICAgSW50UmVjdCBhbmNlc3Rv
ckNvbXBvc2l0aW5nQm91bmRzOworICAgIGlmIChjb21wQW5jZXN0b3IpCisgICAgICAgIGFuY2Vz
dG9yQ29tcG9zaXRpbmdCb3VuZHMgPSBjb21wb3NpdG9yKCktPmNhbGN1bGF0ZUNvbXBvc2l0ZWRC
b3VuZHMoY29tcEFuY2VzdG9yLCBjb21wQW5jZXN0b3IpOworICAgIAorICAgIEludFJlY3QgbG9j
YWxDb21wb3NpdGluZ0JvdW5kcyA9IGNvbXBvc2l0b3IoKS0+Y2FsY3VsYXRlQ29tcG9zaXRlZEJv
dW5kcyhtX293bmluZ0xheWVyLCBtX293bmluZ0xheWVyKTsKKworICAgIEludFJlY3QgcmVsYXRp
dmVDb21wb3NpdGluZ0JvdW5kcyhsb2NhbENvbXBvc2l0aW5nQm91bmRzKTsKKyAgICBpbnQgZGVs
dGFYID0gMCwgZGVsdGFZID0gMDsKKyAgICBtX293bmluZ0xheWVyLT5jb252ZXJ0VG9MYXllckNv
b3Jkcyhjb21wQW5jZXN0b3IsIGRlbHRhWCwgZGVsdGFZKTsKKyAgICByZWxhdGl2ZUNvbXBvc2l0
aW5nQm91bmRzLm1vdmUoZGVsdGFYLCBkZWx0YVkpOworCisgICAgSW50UG9pbnQgZ3JhcGhpY3NM
YXllclBhcmVudExvY2F0aW9uOworICAgIGlmIChjb21wQW5jZXN0b3IgJiYgY29tcEFuY2VzdG9y
LT5iYWNraW5nKCktPmhhc0NsaXBwaW5nTGF5ZXIoKSkgeworICAgICAgICAvLyBJZiB0aGUgY29t
cG9zaXRpbmcgYW5jZXN0b3IgaGFzIGEgbGF5ZXIgdG8gY2xpcCBjaGlsZHJlbiwgd2UgcGFyZW50
IGluIHRoYXQsIGFuZCB0aGVyZWZvcmUKKyAgICAgICAgLy8gcG9zaXRpb24gcmVsYXRpdmUgdG8g
aXQuCisgICAgICAgIGdyYXBoaWNzTGF5ZXJQYXJlbnRMb2NhdGlvbiA9IGNvbXBBbmNlc3Rvci0+
cmVuZGVyZXIoKS0+Z2V0T3ZlcmZsb3dDbGlwUmVjdCgwLCAwKS5sb2NhdGlvbigpOworICAgIH0g
ZWxzZQorICAgICAgICBncmFwaGljc0xheWVyUGFyZW50TG9jYXRpb24gPSBhbmNlc3RvckNvbXBv
c2l0aW5nQm91bmRzLmxvY2F0aW9uKCk7CisgICAgCisgICAgaWYgKGNvbXBBbmNlc3RvciAmJiBt
X2FuY2VzdG9yQ2xpcHBpbmdMYXllcikgeworICAgICAgICAvLyBDYWxsIGNhbGN1bGF0ZVJlY3Rz
IHRvIGdldCB0aGUgYmFja2dyb3VuZFJlY3Qgd2hpY2ggaXMgd2hhdCBpcyB1c2VkIHRvIGNsaXAg
dGhlIGNvbnRlbnRzIG9mIHRoaXMKKyAgICAgICAgLy8gbGF5ZXIuIE5vdGUgdGhhdCB3ZSBjYWxs
IGl0IHdpdGggdGVtcG9yYXJ5Q2xpcFJlY3RzID0gdHJ1ZSBiZWNhdXNlIG5vcm1hbGx5IHdoZW4g
Y29tcHV0aW5nIGNsaXAgcmVjdHMKKyAgICAgICAgLy8gZm9yIGEgY29tcG9zaXRpbmcgbGF5ZXIs
IHJvb3RMYXllciBpcyB0aGUgbGF5ZXIgaXRzZWxmLgorICAgICAgICBJbnRSZWN0IGluZmluaXRl
UmVjdChJTlRfTUlOLzIsIElOVF9NSU4vMiwgSU5UX01BWCwgSU5UX01BWCk7CisgICAgICAgIElu
dFJlY3QgbGF5ZXJCb3VuZHMsIGJhY2tncm91bmRSZWN0LCBmb3JlZ3JvdW5kUmVjdCwgb3V0bGlu
ZVJlY3Q7CisgICAgICAgIG1fb3duaW5nTGF5ZXItPmNhbGN1bGF0ZVJlY3RzKGNvbXBBbmNlc3Rv
ciwgaW5maW5pdGVSZWN0LCBsYXllckJvdW5kcywgYmFja2dyb3VuZFJlY3QsIGZvcmVncm91bmRS
ZWN0LCBvdXRsaW5lUmVjdCwgdHJ1ZSk7CisgICAgICAgIAorICAgICAgICBtX2FuY2VzdG9yQ2xp
cHBpbmdMYXllci0+c2V0UG9zaXRpb24oRmxvYXRQb2ludCgpICsgKGJhY2tncm91bmRSZWN0Lmxv
Y2F0aW9uKCkgLSBncmFwaGljc0xheWVyUGFyZW50TG9jYXRpb24pKTsKKyAgICAgICAgbV9hbmNl
c3RvckNsaXBwaW5nTGF5ZXItPnNldFNpemUoYmFja2dyb3VuZFJlY3Quc2l6ZSgpKTsKKworICAg
ICAgICAvLyBiYWNrZ3JvdW5kUmVjdCBpcyByZWxhdGl2ZSB0byBjb21wQW5jZXN0b3IsIHNvIHN1
YnRyYWN0IGRlbHRhWC9kZWx0YVkgdG8gZ2V0IGJhY2sgdG8gbG9jYWwgY29vcmRzLgorICAgICAg
ICBJbnRTaXplIHJlbmRlcmVyT2Zmc2V0KGJhY2tncm91bmRSZWN0LmxvY2F0aW9uKCkueCgpIC0g
ZGVsdGFYLCBiYWNrZ3JvdW5kUmVjdC5sb2NhdGlvbigpLnkoKSAtIGRlbHRhWSk7CisgICAgICAg
IG1fYW5jZXN0b3JDbGlwcGluZ0xheWVyLT5zZXRPZmZzZXRGcm9tUmVuZGVyZXIocmVuZGVyZXJP
ZmZzZXQpOworCisgICAgICAgIC8vIFRoZSBwcmltYXJ5IGxheWVyIGlzIHRoZW4gcGFyZW50ZWQg
aW4sIGFuZCBwb3NpdGlvbmVkIHJlbGF0aXZlIHRvIHRoaXMgY2xpcHBpbmcgbGF5ZXIuCisgICAg
ICAgIGdyYXBoaWNzTGF5ZXJQYXJlbnRMb2NhdGlvbiA9IGJhY2tncm91bmRSZWN0LmxvY2F0aW9u
KCk7CisgICAgfQorCisgICAgbV9ncmFwaGljc0xheWVyLT5zZXRQb3NpdGlvbihGbG9hdFBvaW50
KCkgKyAocmVsYXRpdmVDb21wb3NpdGluZ0JvdW5kcy5sb2NhdGlvbigpIC0gZ3JhcGhpY3NMYXll
clBhcmVudExvY2F0aW9uKSk7CisgICAgbV9ncmFwaGljc0xheWVyLT5zZXRPZmZzZXRGcm9tUmVu
ZGVyZXIobG9jYWxDb21wb3NpdGluZ0JvdW5kcy5sb2NhdGlvbigpIC0gSW50UG9pbnQoKSk7Cisg
ICAgCisgICAgRmxvYXRTaXplIG9sZFNpemUgPSBtX2dyYXBoaWNzTGF5ZXItPnNpemUoKTsKKyAg
ICBGbG9hdFNpemUgbmV3U2l6ZSA9IHJlbGF0aXZlQ29tcG9zaXRpbmdCb3VuZHMuc2l6ZSgpOwor
ICAgIGlmIChvbGRTaXplICE9IG5ld1NpemUpIHsKKyAgICAgICAgbV9ncmFwaGljc0xheWVyLT5z
ZXRTaXplKG5ld1NpemUpOworICAgICAgICAvLyBBIGJvdW5kcyBjaGFuZ2Ugd2lsbCBhbG1vc3Qg
YWx3YXlzIHJlcXVpcmUgcmVkaXNwbGF5LiBVc3VhbGx5IHRoYXQgcmVkaXNwbGF5CisgICAgICAg
IC8vIHdpbGwgaGFwcGVuIGJlY2F1c2Ugb2YgYSByZXBhaW50IGVsc2V3aGVyZSwgYnV0IG5vdCBh
bHdheXM6CisgICAgICAgIC8vIGUuZy4gc2VlIFJlbmRlclZpZXc6OnNldE1heGltYWxPdXRsaW5l
U2l6ZSgpCisgICAgICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7CisgICAg
fQorCisgICAgLy8gSWYgd2UgaGF2ZSBhIGxheWVyIHRoYXQgY2xpcHMgY2hpbGRyZW4sIHBvc2l0
aW9uIGl0LgorICAgIGlmIChtX2NsaXBwaW5nTGF5ZXIpIHsKKyAgICAgICAgSW50UmVjdCBjbGlw
cGluZ0JveCA9IHJlbmRlcmVyKCktPmdldE92ZXJmbG93Q2xpcFJlY3QoMCwgMCk7CisgICAgICAg
IG1fY2xpcHBpbmdMYXllci0+c2V0UG9zaXRpb24oRmxvYXRQb2ludCgpICsgKGNsaXBwaW5nQm94
LmxvY2F0aW9uKCkgLSBsb2NhbENvbXBvc2l0aW5nQm91bmRzLmxvY2F0aW9uKCkpKTsKKyAgICAg
ICAgbV9jbGlwcGluZ0xheWVyLT5zZXRTaXplKGNsaXBwaW5nQm94LnNpemUoKSk7CisgICAgICAg
IG1fY2xpcHBpbmdMYXllci0+c2V0T2Zmc2V0RnJvbVJlbmRlcmVyKGNsaXBwaW5nQm94LmxvY2F0
aW9uKCkgLSBJbnRQb2ludCgpKTsKKyAgICB9CisgICAgCisgICAgSW50UmVjdCBsYXllckJvdW5k
cyA9IEludFJlY3QobV9vd25pbmdMYXllci0+eFBvcygpLCBtX293bmluZ0xheWVyLT55UG9zKCks
IHJlbmRlcmVyKCktPndpZHRoKCksIHJlbmRlcmVyKCktPmhlaWdodCgpKTsKKworICAgIC8vIENv
bnZlcnQgdG8gYWJzb2x1dGUgY29vcmRzIHRvIG1hdGNoIGJib3guCisgICAgaW50IHggPSAwLCB5
ID0gMDsKKyAgICBtX293bmluZ0xheWVyLT5jb252ZXJ0VG9MYXllckNvb3Jkcyhjb21wQW5jZXN0
b3IsIHgsIHkpOworICAgIGxheWVyQm91bmRzLm1vdmUoeCAtIG1fb3duaW5nTGF5ZXItPnhQb3Mo
KSwgeSAtIG1fb3duaW5nTGF5ZXItPnlQb3MoKSk7CisKKyAgICAvLyBVcGRhdGUgcHJvcGVydGll
cyB0aGF0IGRlcGVuZCBvbiBsYXllciBkaW1lbnNpb25zCisgICAgY29uc3QgSW50UmVjdCBib3Jk
ZXJCb3ggPSByZW5kZXJlcigpLT5ib3JkZXJCb3hSZWN0KCk7CisKKyAgICBGbG9hdFBvaW50M0Qg
dHJhbnNmb3JtT3JpZ2luID0gY29tcHV0ZVRyYW5zZm9ybU9yaWdpbihib3JkZXJCb3gpOworICAg
IC8vIENvbXB1dGUgdGhlIGFuY2hvciBwb2ludCwgd2hpY2ggaXMgaW4gdGhlIGNlbnRlciBvZiB0
aGUgcmVuZGVyZXIgYm94IHVubGVzcyB0cmFuc2Zvcm0tb3JpZ2luIGlzIHNldC4KKyAgICBGbG9h
dFBvaW50ICBhbmNob3IocmVsYXRpdmVDb21wb3NpdGluZ0JvdW5kcy53aWR0aCgpICAhPSAwLjBm
ID8gKChsYXllckJvdW5kcy54KCkgLSByZWxhdGl2ZUNvbXBvc2l0aW5nQm91bmRzLngoKSkgKyB0
cmFuc2Zvcm1PcmlnaW4ueCgpKSAvIHJlbGF0aXZlQ29tcG9zaXRpbmdCb3VuZHMud2lkdGgoKSAg
OiAwLjVmLAorICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZUNvbXBvc2l0aW5nQm91bmRz
LmhlaWdodCgpICE9IDAuMGYgPyAoKGxheWVyQm91bmRzLnkoKSAtIHJlbGF0aXZlQ29tcG9zaXRp
bmdCb3VuZHMueSgpKSArIHRyYW5zZm9ybU9yaWdpbi55KCkpIC8gcmVsYXRpdmVDb21wb3NpdGlu
Z0JvdW5kcy5oZWlnaHQoKSA6IDAuNWYpOworICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0QW5jaG9y
UG9pbnQoYW5jaG9yLCB0cmFuc2Zvcm1PcmlnaW4ueigpKTsKKworICAgIGlmIChtX2NvbnRlbnRz
TGF5ZXIpIHsKKyAgICAgICAgLy8gVGhlIGNvbnRlbnRzIGxheWVyIGlzIGFsd2F5cyBjb2luY2lk
ZW50YWwgd2l0aCB0aGUgZ3JhcGhpY3NMYXllciBmb3Igbm93LgorICAgICAgICBtX2NvbnRlbnRz
TGF5ZXItPnNldFBvc2l0aW9uKEludFBvaW50KDAsIDApKTsKKyAgICAgICAgbV9jb250ZW50c0xh
eWVyLT5zZXRTaXplKG5ld1NpemUpOworICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldE9mZnNl
dEZyb21SZW5kZXJlcihtX2dyYXBoaWNzTGF5ZXItPm9mZnNldEZyb21SZW5kZXJlcigpKTsKKyAg
ICB9CisKKyAgICBtX2dyYXBoaWNzTGF5ZXItPnVwZGF0ZUNvbnRlbnRzUmVjdCgpOworfQorCit2
b2lkIFJlbmRlckxheWVyQmFja2luZzo6dXBkYXRlSW50ZXJuYWxIaWVyYXJjaHkoKQoreworICAg
IC8vIG1fY29udGVudHNMYXllciBoYXMgdG8gYmUgaW5zZXJ0ZWQgaW4gdGhlIGNvcnJlY3Qgb3Jk
ZXIgd2l0aCBjaGlsZCBsYXllcnMsCisgICAgLy8gc28gaXQncyBub3QgaW5zZXJ0ZWQgaGVyZS4K
KyAgICBpZiAobV9hbmNlc3RvckNsaXBwaW5nTGF5ZXIpIHsKKyAgICAgICAgbV9hbmNlc3RvckNs
aXBwaW5nTGF5ZXItPnJlbW92ZUFsbENoaWxkcmVuKCk7CisgICAgICAgIG1fZ3JhcGhpY3NMYXll
ci0+cmVtb3ZlRnJvbVBhcmVudCgpOworICAgICAgICBtX2FuY2VzdG9yQ2xpcHBpbmdMYXllci0+
YWRkQ2hpbGQobV9ncmFwaGljc0xheWVyKTsKKyAgICB9CisKKyAgICBpZiAobV9jbGlwcGluZ0xh
eWVyKSB7CisgICAgICAgIG1fY2xpcHBpbmdMYXllci0+cmVtb3ZlRnJvbVBhcmVudCgpOworICAg
ICAgICBtX2dyYXBoaWNzTGF5ZXItPmFkZENoaWxkKG1fY2xpcHBpbmdMYXllcik7CisgICAgfQor
fQorCisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGF5ZXJzIGNoYW5nZWQuCitib29sIFJlbmRlckxh
eWVyQmFja2luZzo6dXBkYXRlQ2xpcHBpbmdMYXllcnMoYm9vbCBuZWVkc0FuY2VzdG9yQ2xpcCwg
Ym9vbCBuZWVkc0Rlc2NlbmRhbnRDbGlwKQoreworICAgIGJvb2wgbGF5ZXJzQ2hhbmdlZCA9IGZh
bHNlOworCisgICAgaWYgKG5lZWRzQW5jZXN0b3JDbGlwKSB7CisgICAgICAgIGlmICghbV9hbmNl
c3RvckNsaXBwaW5nTGF5ZXIpIHsKKyAgICAgICAgICAgIG1fYW5jZXN0b3JDbGlwcGluZ0xheWVy
ID0gR3JhcGhpY3NMYXllcjo6Y3JlYXRlR3JhcGhpY3NMYXllcih0aGlzKTsKKyNpZm5kZWYgTkRF
QlVHCisgICAgICAgICAgICBtX2FuY2VzdG9yQ2xpcHBpbmdMYXllci0+c2V0TmFtZSgiQW5jZXN0
b3IgY2xpcHBpbmcgTGF5ZXIiKTsKKyNlbmRpZgorICAgICAgICAgICAgbV9hbmNlc3RvckNsaXBw
aW5nTGF5ZXItPnNldE1hc2tzVG9Cb3VuZHModHJ1ZSk7CisgICAgICAgICAgICBsYXllcnNDaGFu
Z2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobV9hbmNlc3RvckNsaXBwaW5n
TGF5ZXIpIHsKKyAgICAgICAgbV9hbmNlc3RvckNsaXBwaW5nTGF5ZXItPnJlbW92ZUZyb21QYXJl
bnQoKTsKKyAgICAgICAgZGVsZXRlIG1fYW5jZXN0b3JDbGlwcGluZ0xheWVyOworICAgICAgICBt
X2FuY2VzdG9yQ2xpcHBpbmdMYXllciA9IDA7CisgICAgICAgIGxheWVyc0NoYW5nZWQgPSB0cnVl
OworICAgIH0KKyAgICAKKyAgICBpZiAobmVlZHNEZXNjZW5kYW50Q2xpcCkgeworICAgICAgICBp
ZiAoIW1fY2xpcHBpbmdMYXllcikgeworICAgICAgICAgICAgbV9jbGlwcGluZ0xheWVyID0gR3Jh
cGhpY3NMYXllcjo6Y3JlYXRlR3JhcGhpY3NMYXllcigwKTsKKyNpZm5kZWYgTkRFQlVHCisgICAg
ICAgICAgICBtX2NsaXBwaW5nTGF5ZXItPnNldE5hbWUoIkNoaWxkIGNsaXBwaW5nIExheWVyIik7
CisjZW5kaWYKKyAgICAgICAgICAgIG1fY2xpcHBpbmdMYXllci0+c2V0TWFza3NUb0JvdW5kcyh0
cnVlKTsKKyAgICAgICAgICAgIGxheWVyc0NoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAg
fSBlbHNlIGlmIChtX2NsaXBwaW5nTGF5ZXIpIHsKKyAgICAgICAgbV9jbGlwcGluZ0xheWVyLT5y
ZW1vdmVGcm9tUGFyZW50KCk7CisgICAgICAgIGRlbGV0ZSBtX2NsaXBwaW5nTGF5ZXI7CisgICAg
ICAgIG1fY2xpcHBpbmdMYXllciA9IDA7CisgICAgICAgIGxheWVyc0NoYW5nZWQgPSB0cnVlOwor
ICAgIH0KKyAgICAKKyAgICBpZiAobGF5ZXJzQ2hhbmdlZCkKKyAgICAgICAgdXBkYXRlSW50ZXJu
YWxIaWVyYXJjaHkoKTsKKworICAgIHJldHVybiBsYXllcnNDaGFuZ2VkOworfQorCitib29sIFJl
bmRlckxheWVyQmFja2luZzo6dXBkYXRlQ29udGVudHNMYXllcihib29sIG5lZWRzQ29udGVudHNM
YXllcikKK3sKKyAgICBib29sIGxheWVyQ2hhbmdlZCA9IGZhbHNlOworICAgIGlmIChuZWVkc0Nv
bnRlbnRzTGF5ZXIpIHsKKyAgICAgICAgaWYgKCFtX2NvbnRlbnRzTGF5ZXIpIHsKKyAgICAgICAg
ICAgIG1fY29udGVudHNMYXllciA9IEdyYXBoaWNzTGF5ZXI6OmNyZWF0ZUdyYXBoaWNzTGF5ZXIo
dGhpcyk7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXRO
YW1lKCJDb250ZW50cyIpOworI2VuZGlmCisgICAgICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNl
dERyYXdzQ29udGVudCh0cnVlKTsKKyAgICAgICAgICAgIG1fY29udGVudHNMYXllci0+c2V0RHJh
d2luZ1BoYXNlKEdyYXBoaWNzTGF5ZXJQYWludEZvcmVncm91bmRNYXNrKTsKKyAgICAgICAgICAg
IG1fZ3JhcGhpY3NMYXllci0+c2V0RHJhd2luZ1BoYXNlKEdyYXBoaWNzTGF5ZXJQYWludEJhY2tn
cm91bmRNYXNrKTsKKyAgICAgICAgICAgIGxheWVyQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0K
KyAgICB9IGVsc2UgaWYgKG1fY29udGVudHNMYXllcikgeworICAgICAgICBtX2NvbnRlbnRzTGF5
ZXItPnJlbW92ZUZyb21QYXJlbnQoKTsKKyAgICAgICAgZGVsZXRlIG1fY29udGVudHNMYXllcjsK
KyAgICAgICAgbV9jb250ZW50c0xheWVyID0gMDsKKyAgICAgICAgbV9ncmFwaGljc0xheWVyLT5z
ZXREcmF3aW5nUGhhc2UoR3JhcGhpY3NMYXllclBhaW50QWxsTWFzayk7CisgICAgICAgIGxheWVy
Q2hhbmdlZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBsYXllckNoYW5nZWQ7Cit9CisKK2Zs
b2F0IFJlbmRlckxheWVyQmFja2luZzo6Y29tcG9zaXRpbmdPcGFjaXR5KGZsb2F0IHJlbmRlcmVy
T3BhY2l0eSkgY29uc3QKK3sKKyAgICBmbG9hdCBmaW5hbE9wYWNpdHkgPSByZW5kZXJlck9wYWNp
dHk7CisgICAgCisgICAgZm9yIChSZW5kZXJMYXllciogY3VyciA9IG1fb3duaW5nTGF5ZXItPnBh
cmVudCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+cGFyZW50KCkpIHsKKyAgICAgICAgLy8gV2Ugb25s
eSBjYXJlIGFib3V0IHBhcmVudHMgdGhhdCBhcmUgc3RhY2tpbmcgY29udGV4dHMuCisgICAgICAg
IC8vIFJlY2FsbCB0aGF0IG9wYWNpdHkgY3JlYXRlcyBzdGFja2luZyBjb250ZXh0LgorICAgICAg
ICBpZiAoIWN1cnItPmlzU3RhY2tpbmdDb250ZXh0KCkpCisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgCisgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgY29tcG9zaXRpbmcgbGF5ZXIsIHdl
IHdhbnQgdG8gY29tcHV0ZSBvcGFjaXR5CisgICAgICAgIC8vIHJlbGF0aXZlIHRvIGl0LiBTbyB3
ZSBjYW4gYnJlYWsgaGVyZS4KKyAgICAgICAgaWYgKGN1cnItPmlzQ29tcG9zaXRlZCgpKQorICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgICBmaW5hbE9wYWNpdHkgKj0gY3Vyci0+
cmVuZGVyZXIoKS0+b3BhY2l0eSgpOworICAgIH0KKworICAgIHJldHVybiBmaW5hbE9wYWNpdHk7
Cit9CisKKy8vIEEgc2ltcGxlIGJhY2tncm91bmQgaXMgZWl0aGVyIG5vbmUgb3IgYSBzb2xpZCBj
b2xvci4KK3N0YXRpYyBib29sIGhhc1NpbXBsZUJhY2tncm91bmQoUmVuZGVyU3R5bGUqIHN0eWxl
KQoreworICAgIHJldHVybiAhc3R5bGUtPmhhc0JhY2tncm91bmRJbWFnZSgpOworfQorCitzdGF0
aWMgYm9vbCBoYXNCb3JkZXJPdXRsaW5lT3JTaGFkb3coUmVuZGVyU3R5bGUqIHN0eWxlKQorewor
ICAgIHJldHVybiAoc3R5bGUtPmhhc0JvcmRlcigpIHx8IHN0eWxlLT5oYXNCb3JkZXJSYWRpdXMo
KSB8fCBzdHlsZS0+aGFzT3V0bGluZSgpIHx8IChzdHlsZS0+Ym94U2hhZG93KCkgIT0gMCkpOwor
fQorCitib29sIFJlbmRlckxheWVyQmFja2luZzo6cmVuZGVyZXJIYXNCYWNrZ3JvdW5kKCkgY29u
c3QKK3sKKyAgICAvLyBGSVhNRTogc2hhcmUgbW9yZSBjb2RlIGhlcmUKKyAgICBpZiAocmVuZGVy
ZXIoKS0+bm9kZSgpLT5pc0RvY3VtZW50Tm9kZSgpKSB7CisgICAgICAgIFJlbmRlck9iamVjdCog
aHRtbE9iamVjdCA9IHJlbmRlcmVyKCktPmZpcnN0Q2hpbGQoKTsKKyAgICAgICAgaWYgKCFodG1s
T2JqZWN0KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAgUmVu
ZGVyU3R5bGUqIHN0eWxlID0gaHRtbE9iamVjdC0+c3R5bGUoKTsKKyAgICAgICAgaWYgKHN0eWxl
LT5oYXNCYWNrZ3JvdW5kKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisg
ICAgICAgIFJlbmRlck9iamVjdCogYm9keU9iamVjdCA9IGh0bWxPYmplY3QtPmZpcnN0Q2hpbGQo
KTsKKyAgICAgICAgaWYgKCFib2R5T2JqZWN0KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICAKKyAgICAgICAgc3R5bGUgPSBib2R5T2JqZWN0LT5zdHlsZSgpOworICAgICAgICBy
ZXR1cm4gc3R5bGUtPmhhc0JhY2tncm91bmQoKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJl
bmRlcmVyKCktPnN0eWxlKCktPmhhc0JhY2tncm91bmQoKTsKK30KKworY29uc3QgQ29sb3ImIFJl
bmRlckxheWVyQmFja2luZzo6cmVuZGVyZXJCYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAg
IC8vIEZJWE1FOiBzaGFyZSBtb3JlIGNvZGUgaGVyZQorICAgIGlmIChyZW5kZXJlcigpLT5ub2Rl
KCktPmlzRG9jdW1lbnROb2RlKCkpIHsKKyAgICAgICAgUmVuZGVyT2JqZWN0KiBodG1sT2JqZWN0
ID0gcmVuZGVyZXIoKS0+Zmlyc3RDaGlsZCgpOworICAgICAgICBSZW5kZXJTdHlsZSogc3R5bGUg
PSBodG1sT2JqZWN0LT5zdHlsZSgpOworICAgICAgICBpZiAoc3R5bGUtPmhhc0JhY2tncm91bmQo
KSkKKyAgICAgICAgICAgIHJldHVybiBzdHlsZS0+YmFja2dyb3VuZENvbG9yKCk7CisKKyAgICAg
ICAgUmVuZGVyT2JqZWN0KiBib2R5T2JqZWN0ID0gaHRtbE9iamVjdC0+Zmlyc3RDaGlsZCgpOwor
ICAgICAgICBzdHlsZSA9IGJvZHlPYmplY3QtPnN0eWxlKCk7CisgICAgICAgIHJldHVybiBzdHls
ZS0+YmFja2dyb3VuZENvbG9yKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlbmRlcmVyKCktPnN0
eWxlKCktPmJhY2tncm91bmRDb2xvcigpOworfQorCitib29sIFJlbmRlckxheWVyQmFja2luZzo6
Y2FuQmVTaW1wbGVDb250YWluZXJDb21wb3NpdGluZ0xheWVyKCkgY29uc3QKK3sKKyAgICBSZW5k
ZXJPYmplY3QqIHJlbmRlck9iamVjdCA9IHJlbmRlcmVyKCk7CisgICAgaWYgKHJlbmRlck9iamVj
dC0+aXNSZXBsYWNlZCgpIHx8ICAgICAgIC8vIHJlcGxhY2VkIG9iamVjdHMgYXJlIG5vdCBjb250
YWluZXJzCisgICAgICAgIHJlbmRlck9iamVjdC0+aGFzTWFzaygpKSAgICAgICAgICAgIC8vIG1h
c2tzIHJlcXVpcmUgc3BlY2lhbCB0cmVhdG1lbnQKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gcmVuZGVyT2JqZWN0LT5zdHlsZSgpOworCisgICAgLy8g
UmVqZWN0IGFueXRoaW5nIHRoYXQgaGFzIGEgYm9yZGVyLCBhIGJvcmRlci1yYWRpdXMgb3Igb3V0
bGluZSwKKyAgICAvLyBvciBhbnkgYmFja2dyb3VuZCAoY29sb3Igb3IgaW1hZ2UpLgorICAgIC8v
IEZJWE1FOiB3ZSBjb3VsZCBvcHRpbWl6ZSBsYXllcnMgZm9yIHNpbXBsZSBiYWNrZ3JvdW5kcy4K
KyAgICBpZiAoaGFzQm9yZGVyT3V0bGluZU9yU2hhZG93KHN0eWxlKSB8fAorICAgICAgICBzdHls
ZS0+aGFzQmFja2dyb3VuZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZiB3
ZSBoYXZlIGdvdCB0aGlzIGZhciBhbmQgdGhlIHJlbmRlcmVyIGhhcyBubyBjaGlsZHJlbiwgdGhl
biB3ZSdyZSBvay4KKyAgICBpZiAoIXJlbmRlck9iamVjdC0+Zmlyc3RDaGlsZCgpKQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICBpZiAocmVuZGVyT2JqZWN0LT5ub2RlKCktPmlzRG9j
dW1lbnROb2RlKCkpIHsKKyAgICAgICAgLy8gTG9vayB0byBzZWUgaWYgdGhlIHJvb3Qgb2JqZWN0
IGhhcyBhIG5vbi1zaW1wbGUgYmFja2dvdW5kCisgICAgICAgIFJlbmRlck9iamVjdCogcm9vdE9i
amVjdCA9IHJlbmRlck9iamVjdC0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCktPnJlbmRl
cmVyKCk7CisgICAgICAgIGlmICghcm9vdE9iamVjdCkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgCisgICAgICAgIHN0eWxlID0gcm9vdE9iamVjdC0+c3R5bGUoKTsKKyAgICAg
ICAgCisgICAgICAgIC8vIFJlamVjdCBhbnl0aGluZyB0aGF0IGhhcyBhIGJvcmRlciwgYSBib3Jk
ZXItcmFkaXVzIG9yIG91dGxpbmUsCisgICAgICAgIC8vIG9yIGlzIG5vdCBhIHNpbXBsZSBiYWNr
Z3JvdW5kIChubyBiYWNrZ3JvdW5kLCBvciBzb2xpZCBjb2xvcikuCisgICAgICAgIGlmIChoYXNC
b3JkZXJPdXRsaW5lT3JTaGFkb3coc3R5bGUpIHx8CisgICAgICAgICAgICAhaGFzU2ltcGxlQmFj
a2dyb3VuZChzdHlsZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIAorICAg
ICAgICAvLyBOb3cgbG9vayBhdCB0aGUgYm9keSdzIHJlbmRlcmVyLgorICAgICAgICBIVE1MRWxl
bWVudCogYm9keSA9IHJlbmRlck9iamVjdC0+ZG9jdW1lbnQoKS0+Ym9keSgpOworICAgICAgICBS
ZW5kZXJPYmplY3QqIGJvZHlPYmplY3QgPSAoYm9keSAmJiBib2R5LT5oYXNMb2NhbE5hbWUoSFRN
TE5hbWVzOjpib2R5VGFnKSkgPyBib2R5LT5yZW5kZXJlcigpIDogMDsKKyAgICAgICAgaWYgKCFi
b2R5T2JqZWN0KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAg
c3R5bGUgPSBib2R5T2JqZWN0LT5zdHlsZSgpOworICAgICAgICAKKyAgICAgICAgaWYgKGhhc0Jv
cmRlck91dGxpbmVPclNoYWRvdyhzdHlsZSkgfHwKKyAgICAgICAgICAgICFoYXNTaW1wbGVCYWNr
Z3JvdW5kKHN0eWxlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBD
ZWNrIHRvIHNlZSBpZiBhbGwgdGhlIGJvZHkncyBjaGlsZHJlbiBhcmUgY29tcG9zaXRpbmcgbGF5
ZXJzLgorICAgICAgICBpZiAoaGFzTm9uQ29tcG9zaXRpbmdDb250ZW50KCkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisK
KyAgICAvLyBDaGVjayB0byBzZWUgaWYgYWxsIHRoZSByZW5kZXJlcidzIGNoaWxkcmVuIGFyZSBj
b21wb3NpdGluZyBsYXllcnMuCisgICAgaWYgKGhhc05vbkNvbXBvc2l0aW5nQ29udGVudCgpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wg
UmVuZGVyTGF5ZXJCYWNraW5nOjpoYXNOb25Db21wb3NpdGluZ0NvbnRlbnQoKSBjb25zdAorewor
ICAgIC8vIENvbnNlcnZhdGl2ZSB0ZXN0IGZvciBoYXZpbmcgbm8gcmVuZGVyZWQgY2hpbGRyZW4u
CisgICAgCisgICAgLy8gU29tZSBIVE1MIGNhbiBjYXVzZSB3aGl0ZXNwYWNlIHRleHQgbm9kZXMg
dG8gaGF2ZSByZW5kZXJlcnMsIGxpa2U6CisgICAgLy8gPGRpdj4KKyAgICAvLyA8aW1nIHNyYz0u
Li4+CisgICAgLy8gPC9kaXY+CisgICAgLy8gc28gdGVzdCBmb3IgMHgwIFJlbmRlclRleHRzIGhl
cmUKKyAgICBmb3IgKFJlbmRlck9iamVjdCogY2hpbGQgPSByZW5kZXJlcigpLT5maXJzdENoaWxk
KCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7CisgICAgICAgIGlmICgh
Y2hpbGQtPmhhc0xheWVyKCkgJiYgY2hpbGQtPmlzQm94KCkgJiYgKFJlbmRlckJveDo6dG9SZW5k
ZXJCb3goY2hpbGQpLT53aWR0aCgpID4gMCB8fCBSZW5kZXJCb3g6OnRvUmVuZGVyQm94KGNoaWxk
KS0+aGVpZ2h0KCkgPiAwKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg
IC8vIEZJWE1FOiB0ZXN0IGZvciBvdmVyZmxvdyBjb250cm9scy4KKyAgICBpZiAobV9vd25pbmdM
YXllci0+aXNTdGFja2luZ0NvbnRleHQoKSkgeworICAgICAgICAvLyBVc2UgdGhlIG1faGFzQ29t
cG9zaXRpbmdEZXNjZW5kYW50IGJpdCB0byBvcHRpbWl6ZT8KKyAgICAgICAgVmVjdG9yPFJlbmRl
ckxheWVyKj4qIG5lZ1pPcmRlckxpc3QgPSBtX293bmluZ0xheWVyLT5uZWdaT3JkZXJMaXN0KCk7
CisgICAgICAgIGlmIChuZWdaT3JkZXJMaXN0ICYmIG5lZ1pPcmRlckxpc3QtPnNpemUoKSA+IDAp
IHsKKyAgICAgICAgICAgIGZvciAoVmVjdG9yPFJlbmRlckxheWVyKj46OmNvbnN0X2l0ZXJhdG9y
IGl0ID0gbmVnWk9yZGVyTGlzdC0+YmVnaW4oKTsgaXQgIT0gbmVnWk9yZGVyTGlzdC0+ZW5kKCk7
ICsraXQpIHsKKyAgICAgICAgICAgICAgICBSZW5kZXJMYXllciogY3VyTGF5ZXIgPSAoKml0KTsK
KyAgICAgICAgICAgICAgICBpZiAoIWN1ckxheWVyLT5pc0NvbXBvc2l0ZWQoKSkKKyAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAg
ICAgICBWZWN0b3I8UmVuZGVyTGF5ZXIqPiogcG9zWk9yZGVyTGlzdCA9IG1fb3duaW5nTGF5ZXIt
PnBvc1pPcmRlckxpc3QoKTsKKyAgICAgICAgaWYgKHBvc1pPcmRlckxpc3QgJiYgcG9zWk9yZGVy
TGlzdC0+c2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyTGF5ZXIq
Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBwb3NaT3JkZXJMaXN0LT5iZWdpbigpOyBpdCAhPSBwb3Na
T3JkZXJMaXN0LT5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIFJlbmRlckxheWVyKiBj
dXJMYXllciA9ICgqaXQpOworICAgICAgICAgICAgICAgIGlmICghY3VyTGF5ZXItPmlzQ29tcG9z
aXRlZCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH0KKworICAgIFZlY3RvcjxSZW5kZXJMYXllcio+KiBvdmVyZmxvd0xp
c3QgPSBtX293bmluZ0xheWVyLT5vdmVyZmxvd0xpc3QoKTsKKyAgICBpZiAob3ZlcmZsb3dMaXN0
ICYmIG92ZXJmbG93TGlzdC0+c2l6ZSgpID4gMCkgeworICAgICAgICBmb3IgKFZlY3RvcjxSZW5k
ZXJMYXllcio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG92ZXJmbG93TGlzdC0+YmVnaW4oKTsgaXQg
IT0gb3ZlcmZsb3dMaXN0LT5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgUmVuZGVyTGF5ZXIq
IGN1ckxheWVyID0gKCppdCk7CisgICAgICAgICAgICBpZiAoIWN1ckxheWVyLT5pc0NvbXBvc2l0
ZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gQSAic2ltcGxlIGNvbnRhaW5lciBsYXllciIgaXMg
YSBSZW5kZXJMYXllciB3aGljaCBoYXMgbm8gdmlzaWJsZSBjb250ZW50IHRvIHJlbmRlci4KKy8v
IEl0IG1heSBoYXZlIG5vIGNoaWxkcmVuLCBvciBhbGwgaXRzIGNoaWxkcmVuIG1heSBiZSB0aGVt
c2VsdmVzIGNvbXBvc2l0ZWQuCisvLyBUaGlzIGlzIGEgdXNlZnVsIG9wdGltaXphdGlvbiwgYmVj
YXVzZSBpdCBhbGxvd3MgdXMgdG8gYXZvaWQgYWxsb2NhdGluZyBiYWNraW5nIHN0b3JlLgorYm9v
bCBSZW5kZXJMYXllckJhY2tpbmc6OmlzU2ltcGxlQ29udGFpbmVyQ29tcG9zaXRpbmdMYXllcigp
Cit7CisgICAgaWYgKG1fc2ltcGxlQ29tcG9zaXRpbmdMYXllclN0YXR1c0RpcnR5KSB7CisgICAg
ICAgIG1faXNTaW1wbGVDb250YWluZXJDb21wb3NpdGluZ0xheWVyID0gY2FuQmVTaW1wbGVDb250
YWluZXJDb21wb3NpdGluZ0xheWVyKCk7CisgICAgICAgIG1fc2ltcGxlQ29tcG9zaXRpbmdMYXll
clN0YXR1c0RpcnR5ID0gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIG1faXNTaW1wbGVDb250
YWluZXJDb21wb3NpdGluZ0xheWVyOworfQorCit2b2lkIFJlbmRlckxheWVyQmFja2luZzo6ZGV0
ZWN0RHJhd2luZ09wdGltaXphdGlvbnMoKQoreworICAgIGJvb2wgZHJhd3NDb250ZW50ID0gdHJ1
ZTsKKworICAgIGlmIChpc1NpbXBsZUNvbnRhaW5lckNvbXBvc2l0aW5nTGF5ZXIoKSB8fCBwYWlu
dGluZ0dvZXNUb1dpbmRvdygpKQorICAgICAgICBkcmF3c0NvbnRlbnQgPSBmYWxzZTsKKworICAg
IG1fZ3JhcGhpY3NMYXllci0+c2V0RHJhd3NDb250ZW50KGRyYXdzQ29udGVudCk7Cit9CisKK3Zv
aWQgUmVuZGVyTGF5ZXJCYWNraW5nOjppbnZhbGlkYXRlRHJhd2luZ09wdGltaXphdGlvbnMoKQor
eworICAgIG1fc2ltcGxlQ29tcG9zaXRpbmdMYXllclN0YXR1c0RpcnR5ID0gdHJ1ZTsKK30KKwor
dm9pZCBSZW5kZXJMYXllckJhY2tpbmc6OmZvcmNlQ29tcG9zaXRpbmdMYXllcihib29sIGZvcmNl
KQoreworICAgIG1fZm9yY2VDb21wb3NpdGluZ0xheWVyID0gZm9yY2U7Cit9CisKK0Zsb2F0UG9p
bnQgUmVuZGVyTGF5ZXJCYWNraW5nOjpjb21wdXRlVHJhbnNmb3JtT3JpZ2luKGNvbnN0IEludFJl
Y3QmIGJvcmRlckJveCkgY29uc3QKK3sKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSByZW5kZXJl
cigpLT5zdHlsZSgpOworCisgICAgRmxvYXRQb2ludCBvcmlnaW47CisgICAgb3JpZ2luLnNldFgo
c3R5bGUtPnRyYW5zZm9ybU9yaWdpblgoKS5jYWxjRmxvYXRWYWx1ZShib3JkZXJCb3gud2lkdGgo
KSkpOworICAgIG9yaWdpbi5zZXRZKHN0eWxlLT50cmFuc2Zvcm1PcmlnaW5ZKCkuY2FsY0Zsb2F0
VmFsdWUoYm9yZGVyQm94LmhlaWdodCgpKSk7CisKKyAgICByZXR1cm4gb3JpZ2luOworfQorCisv
LyBSZXR1cm4gdGhlIG9mZnNldCBmcm9tIHRoZSB0b3AtbGVmdCBvZiB0aGlzIGNvbXBvc2l0aW5n
IGxheWVyIGF0IHdoaWNoIHRoZSByZW5kZXJlcidzIGNvbnRlbnRzIGFyZSBwYWludGVkLgorSW50
U2l6ZSBSZW5kZXJMYXllckJhY2tpbmc6OmNvbnRlbnRPZmZzZXRJbkNvbXBvc3RpbmdMYXllcigp
Cit7CisgICAgaWYgKCFtX2NvbXBvc2l0aW5nQ29udGVudE9mZnNldERpcnR5KQorICAgICAgICBy
ZXR1cm4gbV9jb21wb3NpdGluZ0NvbnRlbnRPZmZzZXQ7CisKKyAgICBJbnRSZWN0IHJlbGF0aXZl
Q29tcG9zaXRpbmdCb3VuZHMgPSBjb21wb3NpdG9yKCktPmNhbGN1bGF0ZUNvbXBvc2l0ZWRCb3Vu
ZHMobV9vd25pbmdMYXllciwgbV9vd25pbmdMYXllcik7CisgICAgbV9jb21wb3NpdGluZ0NvbnRl
bnRPZmZzZXQgPSBJbnRTaXplKC1yZWxhdGl2ZUNvbXBvc2l0aW5nQm91bmRzLngoKSwgLXJlbGF0
aXZlQ29tcG9zaXRpbmdCb3VuZHMueSgpKTsKKyAgICBtX2NvbXBvc2l0aW5nQ29udGVudE9mZnNl
dERpcnR5ID0gZmFsc2U7CisKKyAgICByZXR1cm4gbV9jb21wb3NpdGluZ0NvbnRlbnRPZmZzZXQ7
Cit9CisKK0ludFJlY3QgUmVuZGVyTGF5ZXJCYWNraW5nOjpjb250ZW50c0JveChjb25zdCBHcmFw
aGljc0xheWVyKikKK3sKKyAgICBJbnRSZWN0IGNvbnRlbnRzUmVjdCA9IHJlbmRlcmVyKCktPmNv
bnRlbnRCb3hSZWN0KCk7CisgICAgSW50U2l6ZSBjb250ZW50T2Zmc2V0ID0gY29udGVudE9mZnNl
dEluQ29tcG9zdGluZ0xheWVyKCk7CisgICAgY29udGVudHNSZWN0Lm1vdmUoY29udGVudE9mZnNl
dCk7CisgICAgcmV0dXJuIGNvbnRlbnRzUmVjdDsKK30KKworLy8gTWFwIHRoZSBnaXZlbiBwb2lu
dCBmcm9tIGNvb3JkaW5hdGVzIGluIHRoZSBHcmFwaGljc0xheWVyIHRvIFJlbmRlckxheWVyIGNv
b3JkaW5hdGVzLgorRmxvYXRQb2ludCBSZW5kZXJMYXllckJhY2tpbmc6OmdyYXBoaWNzTGF5ZXJU
b0NvbnRlbnRzQ29vcmRpbmF0ZXMoY29uc3QgR3JhcGhpY3NMYXllciogZ3JhcGhpY3NMYXllciwg
Y29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgcmV0dXJuIHBvaW50ICsgRmxvYXRTaXpl
KGdyYXBoaWNzTGF5ZXItPm9mZnNldEZyb21SZW5kZXJlcigpKTsKK30KKworLy8gTWFwIHRoZSBn
aXZlbiBwb2ludCBmcm9tIGNvb3JkaW5hdGVzIGluIHRoZSBSZW5kZXJMYXllciB0byBHcmFwaGlj
c0xheWVyIGNvb3JkaW5hdGVzLgorRmxvYXRQb2ludCBSZW5kZXJMYXllckJhY2tpbmc6OmNvbnRl
bnRzVG9HcmFwaGljc0xheWVyQ29vcmRpbmF0ZXMoY29uc3QgR3JhcGhpY3NMYXllciogZ3JhcGhp
Y3NMYXllciwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgcmV0dXJuIHBvaW50IC0g
RmxvYXRTaXplKGdyYXBoaWNzTGF5ZXItPm9mZnNldEZyb21SZW5kZXJlcigpKTsKK30KKworYm9v
bCBSZW5kZXJMYXllckJhY2tpbmc6OnBhaW50aW5nR29lc1RvV2luZG93KCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gbV9vd25pbmdMYXllci0+aXNEb2N1bWVudExheWVyKCk7Cit9CisKK3ZvaWQgUmVu
ZGVyTGF5ZXJCYWNraW5nOjpzZXRDb250ZW50c05lZWREaXNwbGF5KCkKK3sKKyAgICBpZiAobV9n
cmFwaGljc0xheWVyKQorICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPnNldE5lZWRzRGlzcGxheSgp
OworICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIG1fY29udGVudHNMYXllci0+c2V0
TmVlZHNEaXNwbGF5KCk7Cit9CisKKy8vIHIgaXMgaW4gdGhlIGNvb3JkaW5hdGUgc3BhY2Ugb2Yg
dGhlIGxheWVyJ3MgcmVuZGVyIG9iamVjdAordm9pZCBSZW5kZXJMYXllckJhY2tpbmc6OnNldENv
bnRlbnRzTmVlZERpc3BsYXlJblJlY3QoY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBpZiAobV9n
cmFwaGljc0xheWVyKSB7CisgICAgICAgIEZsb2F0UG9pbnQgZGlydHlPcmlnaW4gPSBjb250ZW50
c1RvR3JhcGhpY3NMYXllckNvb3JkaW5hdGVzKG1fZ3JhcGhpY3NMYXllciwgRmxvYXRQb2ludChy
LngoKSwgci55KCkpKTsKKyAgICAgICAgRmxvYXRSZWN0IGRpcnR5UmVjdChkaXJ0eU9yaWdpbiwg
ci5zaXplKCkpOworICAgICAgICBGbG9hdFJlY3QgYm91bmRzKEZsb2F0UG9pbnQoKSwgbV9ncmFw
aGljc0xheWVyLT5zaXplKCkpOworICAgICAgICBpZiAoYm91bmRzLmludGVyc2VjdHMoZGlydHlS
ZWN0KSkKKyAgICAgICAgICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0TmVlZHNEaXNwbGF5SW5SZWN0
KGRpcnR5UmVjdCk7CisgICAgfQorCisgICAgaWYgKG1fY29udGVudHNMYXllcikgeworICAgICAg
ICAvLyBGSVhNRTogZG8gaW5jcmVtZW50YWwgcmVwYWludAorICAgICAgICBtX2NvbnRlbnRzTGF5
ZXItPnNldE5lZWRzRGlzcGxheSgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2V0Q2xpcChH
cmFwaGljc0NvbnRleHQqIHAsIGNvbnN0IEludFJlY3QmIHBhaW50RGlydHlSZWN0LCBjb25zdCBJ
bnRSZWN0JiBjbGlwUmVjdCkKK3sKKyAgICBpZiAocGFpbnREaXJ0eVJlY3QgPT0gY2xpcFJlY3Qp
CisgICAgICAgIHJldHVybjsKKyAgICBwLT5zYXZlKCk7CisgICAgcC0+Y2xpcChjbGlwUmVjdCk7
Cit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVDbGlwKEdyYXBoaWNzQ29udGV4dCogcCwgY29uc3Qg
SW50UmVjdCYgcGFpbnREaXJ0eVJlY3QsIGNvbnN0IEludFJlY3QmIGNsaXBSZWN0KQoreworICAg
IGlmIChwYWludERpcnR5UmVjdCA9PSBjbGlwUmVjdCkKKyAgICAgICAgcmV0dXJuOworICAgIHAt
PnJlc3RvcmUoKTsKK30KKworLy8gU2hhcmUgdGhpcyB3aXRoIFJlbmRlckxheWVyOjpwYWludExh
eWVyLCB3aGljaCB3b3VsZCBoYXZlIHRvIGJlIGVkdWNhdGVkIGFib3V0IEdyYXBoaWNzTGF5ZXJQ
YWludGluZ1BoYXNlPwordm9pZCBSZW5kZXJMYXllckJhY2tpbmc6OnBhaW50SW50b0xheWVyKFJl
bmRlckxheWVyKiByb290TGF5ZXIsIEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwKKyAgICAgICAg
ICAgICAgICAgICAgY29uc3QgSW50UmVjdCYgcGFpbnREaXJ0eVJlY3QsICAgICAgLy8gaW4gdGhl
IGNvb3JkcyBvZiByb290TGF5ZXIKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXZlVHJhbnNw
YXJlbmN5LCBQYWludFJlc3RyaWN0aW9uIHBhaW50UmVzdHJpY3Rpb24sIEdyYXBoaWNzTGF5ZXJQ
YWludGluZ1BoYXNlIHBhaW50aW5nUGhhc2UsCisgICAgICAgICAgICAgICAgICAgIFJlbmRlck9i
amVjdCogcGFpbnRpbmdSb290KQoreworICAgIGlmIChwYWludGluZ0dvZXNUb1dpbmRvdygpKSB7
CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm47CisgICAgfQor
ICAgIAorICAgIGlmIChtX293bmluZ0xheWVyLT5pc1N0YWNraW5nQ29udGV4dCgpICYmIChtX293
bmluZ0xheWVyLT5tX3pPcmRlckxpc3RzRGlydHkgfHwgbV9vd25pbmdMYXllci0+bV9vdmVyZmxv
d0xpc3REaXJ0eSkpCisgICAgICAgIGNvbXBvc2l0b3IoKS0+dXBkYXRlQ29tcG9zaXRpbmdMYXll
cnMobV9vd25pbmdMYXllcik7CisgICAgCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBjbGlwIHJlY3Rz
IHdlIHNob3VsZCB1c2UuCisgICAgSW50UmVjdCBsYXllckJvdW5kcywgZGFtYWdlUmVjdCwgY2xp
cFJlY3RUb0FwcGx5LCBvdXRsaW5lUmVjdDsKKyAgICBtX293bmluZ0xheWVyLT5jYWxjdWxhdGVS
ZWN0cyhyb290TGF5ZXIsIHBhaW50RGlydHlSZWN0LCBsYXllckJvdW5kcywgZGFtYWdlUmVjdCwg
Y2xpcFJlY3RUb0FwcGx5LCBvdXRsaW5lUmVjdCk7CisgICAgCisgICAgaW50IHggPSBsYXllckJv
dW5kcy54KCk7ICAgICAgICAvLyBsYXllckJvdW5kcyBpcyBjb21wdXRlZCByZWxhdGl2ZSB0byBy
b290TGF5ZXIKKyAgICBpbnQgeSA9IGxheWVyQm91bmRzLnkoKTsKKyAgICBpbnQgdHggPSB4IC0g
cmVuZGVyZXIoKS0+eCgpOworICAgIGludCB0eSA9IHkgLSByZW5kZXJlcigpLT55KCkgKyByZW5k
ZXJlcigpLT5ib3JkZXJUb3BFeHRyYSgpOworCisgICAgLy8gSWYgdGhpcyBsYXllcidzIHJlbmRl
cmVyIGlzIGEgY2hpbGQgb2YgdGhlIHBhaW50aW5nUm9vdCwgd2UgcmVuZGVyIHVuY29uZGl0aW9u
YWxseSwgd2hpY2gKKyAgICAvLyBpcyBkb25lIGJ5IHBhc3NpbmcgYSBuaWwgcGFpbnRpbmdSb290
IGRvd24gdG8gb3VyIHJlbmRlcmVyIChhcyBpZiBubyBwYWludGluZ1Jvb3Qgd2FzIGV2ZXIgc2V0
KS4KKyAgICAvLyBFbHNlLCBvdXIgcmVuZGVyZXIgdHJlZSBtYXkgb3IgbWF5IG5vdCBjb250YWlu
IHRoZSBwYWludGluZyByb290LCBzbyB3ZSBwYXNzIHRoYXQgcm9vdCBhbG9uZworICAgIC8vIHNv
IGl0IHdpbGwgYmUgdGVzdGVkIGFnYWluc3QgYXMgd2UgZGVjZW5kIHRocm91Z2ggdGhlIHJlbmRl
cmVycy4KKyAgICBSZW5kZXJPYmplY3QgKnBhaW50aW5nUm9vdEZvclJlbmRlcmVyID0gMDsKKyAg
ICBpZiAocGFpbnRpbmdSb290ICYmICFyZW5kZXJlcigpLT5pc0Rlc2NlbmRhbnRPZihwYWludGlu
Z1Jvb3QpKQorICAgICAgICBwYWludGluZ1Jvb3RGb3JSZW5kZXJlciA9IHBhaW50aW5nUm9vdDsK
KworICAgIGlmIChwYWludGluZ1BoYXNlICYgR3JhcGhpY3NMYXllclBhaW50QmFja2dyb3VuZE1h
c2spIHsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgcm9vdCB0aGVuIHdlIG5lZWQgdG8gc2Vu
ZCBpbiBhIGJpZ2dlciBib3VuZGluZyBib3gKKyAgICAgICAgLy8gYmVjYXVzZSB3ZSdsbCBiZSBw
YWludGluZyB0aGUgYmFja2dyb3VuZCBhcyB3ZWxsIChzZWUgUmVuZGVyQm94OjpwYWludFJvb3RC
b3hEZWNvcmF0aW9ucygpKS4KKyAgICAgICAgSW50UmVjdCBwYWludEJveCA9IGNsaXBSZWN0VG9B
cHBseTsKKyAgICAgICAgCisgICAgICAgIGlmIChyZW5kZXJlcigpLT5ub2RlKCktPmlzRG9jdW1l
bnROb2RlKCkgJiYgcmVuZGVyZXIoKS0+ZG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSkgewor
ICAgICAgICAgICAgaW50IHcgPSByZW5kZXJlcigpLT53aWR0aCgpOworICAgICAgICAgICAgaW50
IGggPSByZW5kZXJlcigpLT5oZWlnaHQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50
IHJ3OworICAgICAgICAgICAgaW50IHJoOworICAgICAgICAgICAgaWYgKHJlbmRlcmVyKCktPnZp
ZXcoKS0+ZnJhbWVWaWV3KCkpIHsKKyAgICAgICAgICAgICAgICBydyA9IHJlbmRlcmVyKCktPnZp
ZXcoKS0+ZnJhbWVWaWV3KCktPmNvbnRlbnRzV2lkdGgoKTsKKyAgICAgICAgICAgICAgICByaCA9
IHJlbmRlcmVyKCktPnZpZXcoKS0+ZnJhbWVWaWV3KCktPmNvbnRlbnRzSGVpZ2h0KCk7CisgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJ3ID0gcmVuZGVyZXIoKS0+dmlldygp
LT53aWR0aCgpOworICAgICAgICAgICAgICAgIHJoID0gcmVuZGVyZXIoKS0+dmlldygpLT5oZWln
aHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IGJ4ID0g
dHggLSByZW5kZXJlcigpLT5tYXJnaW5MZWZ0KCk7CisgICAgICAgICAgICBpbnQgYnkgPSB0eSAt
IHJlbmRlcmVyKCktPm1hcmdpblRvcCgpOworICAgICAgICAgICAgaW50IGJ3ID0gbWF4KHcgKyBy
ZW5kZXJlcigpLT5tYXJnaW5MZWZ0KCkgKyByZW5kZXJlcigpLT5tYXJnaW5SaWdodCgpICsgcmVu
ZGVyZXIoKS0+Ym9yZGVyTGVmdCgpICsgcmVuZGVyZXIoKS0+Ym9yZGVyUmlnaHQoKSwgcncpOwor
ICAgICAgICAgICAgaW50IGJoID0gbWF4KGggKyByZW5kZXJlcigpLT5tYXJnaW5Ub3AoKSArIHJl
bmRlcmVyKCktPm1hcmdpbkJvdHRvbSgpICsgcmVuZGVyZXIoKS0+Ym9yZGVyVG9wKCkgKyByZW5k
ZXJlcigpLT5ib3JkZXJCb3R0b20oKSwgcmgpOworICAgICAgICAgICAgcGFpbnRCb3ggPSBJbnRS
ZWN0KGJ4LCBieSwgYncsIGJoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhaW50IG91ciBi
YWNrZ3JvdW5kIGZpcnN0LCBiZWZvcmUgcGFpbnRpbmcgYW55IGNoaWxkIGxheWVycy4KKyAgICAg
ICAgLy8gRXN0YWJsaXNoIHRoZSBjbGlwIHVzZWQgdG8gcGFpbnQgb3VyIGJhY2tncm91bmQuCisg
ICAgICAgIHNldENsaXAoY29udGV4dCwgcGFpbnREaXJ0eVJlY3QsIGRhbWFnZVJlY3QpOworICAg
ICAgICAKKyAgICAgICAgUmVuZGVyT2JqZWN0OjpQYWludEluZm8gaW5mbyhjb250ZXh0LCBwYWlu
dEJveCwgUGFpbnRQaGFzZUJsb2NrQmFja2dyb3VuZCwgZmFsc2UsIHBhaW50aW5nUm9vdEZvclJl
bmRlcmVyLCAwKTsKKyAgICAgICAgcmVuZGVyZXIoKS0+cGFpbnQoaW5mbywgdHgsIHR5KTsKKwor
ICAgICAgICAvLyBPdXIgc2Nyb2xsYmFyIHdpZGdldHMgcGFpbnQgZXhhY3RseSB3aGVuIHdlIHRl
bGwgdGhlbSB0bywgc28gdGhhdCB0aGV5IHdvcmsgcHJvcGVybHkgd2l0aAorICAgICAgICAvLyB6
LWluZGV4LiAgV2UgcGFpbnQgYWZ0ZXIgd2UgcGFpbnRlZCB0aGUgYmFja2dyb3VuZC9ib3JkZXIs
IHNvIHRoYXQgdGhlIHNjcm9sbGJhcnMgd2lsbAorICAgICAgICAvLyBzaXQgYWJvdmUgdGhlIGJh
Y2tncm91bmQvYm9yZGVyLgorICAgICAgICBtX293bmluZ0xheWVyLT5wYWludE92ZXJmbG93Q29u
dHJvbHMoY29udGV4dCwgeCwgeSwgZGFtYWdlUmVjdCk7CisgICAgICAgIAorICAgICAgICAvLyBS
ZXN0b3JlIHRoZSBjbGlwLgorICAgICAgICByZXN0b3JlQ2xpcChjb250ZXh0LCBwYWludERpcnR5
UmVjdCwgZGFtYWdlUmVjdCk7CisgICAgfQorICAgICAgICAgICAgICAgIAorICAgIGlmIChwYWlu
dGluZ1BoYXNlICYgR3JhcGhpY3NMYXllclBhaW50Rm9yZWdyb3VuZE1hc2spIHsKKyAgICAgICAg
Ly8gTm93IHdhbGsgdGhlIHNvcnRlZCBsaXN0IG9mIGNoaWxkcmVuIHdpdGggbmVnYXRpdmUgei1p
bmRpY2VzLiBPbmx5IFJlbmRlckxheWVycyB3aXRob3V0IGNvbXBvc2l0aW5nIGxheWVycyB3aWxs
IHBhaW50LgorICAgICAgICAvLyBGSVhNRTogc2hvdWxkIHRoZXNlIGJlIHBhaW50ZWQgYXMgYmFj
a2dyb3VuZD8KKyAgICAgICAgVmVjdG9yPFJlbmRlckxheWVyKj4qIG5lZ1pPcmRlckxpc3QgPSBt
X293bmluZ0xheWVyLT5uZWdaT3JkZXJMaXN0KCk7CisgICAgICAgIGlmIChuZWdaT3JkZXJMaXN0
KSB7CisgICAgICAgICAgICBmb3IgKFZlY3RvcjxSZW5kZXJMYXllcio+OjppdGVyYXRvciBpdCA9
IG5lZ1pPcmRlckxpc3QtPmJlZ2luKCk7IGl0ICE9IG5lZ1pPcmRlckxpc3QtPmVuZCgpOyArK2l0
KQorICAgICAgICAgICAgICAgIGl0WzBdLT5wYWludExheWVyKHJvb3RMYXllciwgY29udGV4dCwg
cGFpbnREaXJ0eVJlY3QsIGhhdmVUcmFuc3BhcmVuY3ksIHBhaW50UmVzdHJpY3Rpb24sIHBhaW50
aW5nUm9vdCk7CisgICAgICAgIH0KKworICAgICAgICBib29sIGZvcmNlQmxhY2tUZXh0ID0gcGFp
bnRSZXN0cmljdGlvbiA9PSBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seUJsYWNrVGV4dDsK
KyAgICAgICAgYm9vbCBzZWxlY3Rpb25Pbmx5ICA9IHBhaW50UmVzdHJpY3Rpb24gPT0gUGFpbnRS
ZXN0cmljdGlvblNlbGVjdGlvbk9ubHkgfHwgcGFpbnRSZXN0cmljdGlvbiA9PSBQYWludFJlc3Ry
aWN0aW9uU2VsZWN0aW9uT25seUJsYWNrVGV4dDsKKworICAgICAgICAvLyBTZXQgdXAgdGhlIGNs
aXAgdXNlZCB3aGVuIHBhaW50aW5nIG91ciBjaGlsZHJlbi4KKyAgICAgICAgc2V0Q2xpcChjb250
ZXh0LCBwYWludERpcnR5UmVjdCwgY2xpcFJlY3RUb0FwcGx5KTsKKyAgICAgICAgUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8gcGFpbnRJbmZvKGNvbnRleHQsIGNsaXBSZWN0VG9BcHBseSwgCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Pbmx5ID8gUGFp
bnRQaGFzZVNlbGVjdGlvbiA6IFBhaW50UGhhc2VDaGlsZEJsb2NrQmFja2dyb3VuZHMsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZUJsYWNrVGV4dCwgcGFp
bnRpbmdSb290Rm9yUmVuZGVyZXIsIDApOworICAgICAgICByZW5kZXJlcigpLT5wYWludChwYWlu
dEluZm8sIHR4LCB0eSk7CisKKyAgICAgICAgaWYgKCFzZWxlY3Rpb25Pbmx5KSB7CisgICAgICAg
ICAgICBwYWludEluZm8ucGhhc2UgPSBQYWludFBoYXNlRmxvYXQ7CisgICAgICAgICAgICByZW5k
ZXJlcigpLT5wYWludChwYWludEluZm8sIHR4LCB0eSk7CisKKyAgICAgICAgICAgIHBhaW50SW5m
by5waGFzZSA9IFBhaW50UGhhc2VGb3JlZ3JvdW5kOworICAgICAgICAgICAgcmVuZGVyZXIoKS0+
cGFpbnQocGFpbnRJbmZvLCB0eCwgdHkpOworCisgICAgICAgICAgICBwYWludEluZm8ucGhhc2Ug
PSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lczsKKyAgICAgICAgICAgIHJlbmRlcmVyKCktPnBhaW50
KHBhaW50SW5mbywgdHgsIHR5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdyByZXN0b3Jl
IG91ciBjbGlwLgorICAgICAgICByZXN0b3JlQ2xpcChjb250ZXh0LCBwYWludERpcnR5UmVjdCwg
Y2xpcFJlY3RUb0FwcGx5KTsKKworICAgICAgICBpZiAoIW91dGxpbmVSZWN0LmlzRW1wdHkoKSkg
eworICAgICAgICAgICAgLy8gUGFpbnQgb3VyIG93biBvdXRsaW5lCisgICAgICAgICAgICBSZW5k
ZXJPYmplY3Q6OlBhaW50SW5mbyBwYWludEluZm8oY29udGV4dCwgb3V0bGluZVJlY3QsIFBhaW50
UGhhc2VTZWxmT3V0bGluZSwgZmFsc2UsIHBhaW50aW5nUm9vdEZvclJlbmRlcmVyLCAwKTsKKyAg
ICAgICAgICAgIHNldENsaXAoY29udGV4dCwgcGFpbnREaXJ0eVJlY3QsIG91dGxpbmVSZWN0KTsK
KyAgICAgICAgICAgIHJlbmRlcmVyKCktPnBhaW50KHBhaW50SW5mbywgdHgsIHR5KTsKKyAgICAg
ICAgICAgIHJlc3RvcmVDbGlwKGNvbnRleHQsIHBhaW50RGlydHlSZWN0LCBvdXRsaW5lUmVjdCk7
CisgICAgICAgIH0KKworICAgICAgICAvLyBQYWludCBhbnkgY2hpbGQgbGF5ZXJzIHRoYXQgaGF2
ZSBvdmVyZmxvdy4KKyAgICAgICAgVmVjdG9yPFJlbmRlckxheWVyKj4qIG92ZXJmbG93TGlzdCA9
IG1fb3duaW5nTGF5ZXItPm92ZXJmbG93TGlzdCgpOworICAgICAgICBpZiAob3ZlcmZsb3dMaXN0
KSB7CisgICAgICAgICAgICBmb3IgKFZlY3RvcjxSZW5kZXJMYXllcio+OjppdGVyYXRvciBpdCA9
IG92ZXJmbG93TGlzdC0+YmVnaW4oKTsgaXQgIT0gb3ZlcmZsb3dMaXN0LT5lbmQoKTsgKytpdCkK
KyAgICAgICAgICAgICAgICBpdFswXS0+cGFpbnRMYXllcihyb290TGF5ZXIsIGNvbnRleHQsIHBh
aW50RGlydHlSZWN0LCBoYXZlVHJhbnNwYXJlbmN5LCBwYWludFJlc3RyaWN0aW9uLCBwYWludGlu
Z1Jvb3QpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IHdhbGsgdGhlIHNvcnRlZCBsaXN0
IG9mIGNoaWxkcmVuIHdpdGggcG9zaXRpdmUgei1pbmRpY2VzLgorICAgICAgICBWZWN0b3I8UmVu
ZGVyTGF5ZXIqPiogcG9zWk9yZGVyTGlzdCA9IG1fb3duaW5nTGF5ZXItPnBvc1pPcmRlckxpc3Qo
KTsKKyAgICAgICAgaWYgKHBvc1pPcmRlckxpc3QpIHsKKyAgICAgICAgICAgIGZvciAoVmVjdG9y
PFJlbmRlckxheWVyKj46Oml0ZXJhdG9yIGl0ID0gcG9zWk9yZGVyTGlzdC0+YmVnaW4oKTsgaXQg
IT0gcG9zWk9yZGVyTGlzdC0+ZW5kKCk7ICsraXQpCisgICAgICAgICAgICAgICAgaXRbMF0tPnBh
aW50TGF5ZXIocm9vdExheWVyLCBjb250ZXh0LCBwYWludERpcnR5UmVjdCwgaGF2ZVRyYW5zcGFy
ZW5jeSwgcGFpbnRSZXN0cmljdGlvbiwgcGFpbnRpbmdSb290KTsKKyAgICAgICAgfQorICAgICAg
ICAKKyAgICAgICAgaWYgKHJlbmRlcmVyKCktPmhhc01hc2soKSAmJiAhc2VsZWN0aW9uT25seSAm
JiAhZGFtYWdlUmVjdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHNldENsaXAoY29udGV4dCwg
cGFpbnREaXJ0eVJlY3QsIGRhbWFnZVJlY3QpOworCisgICAgICAgICAgICAvLyBQYWludCB0aGUg
bWFzay4KKyAgICAgICAgICAgIFJlbmRlck9iamVjdDo6UGFpbnRJbmZvIHBhaW50SW5mbyhjb250
ZXh0LCBkYW1hZ2VSZWN0LCBQYWludFBoYXNlTWFzaywgZmFsc2UsIHBhaW50aW5nUm9vdEZvclJl
bmRlcmVyLCAwKTsKKyAgICAgICAgICAgIHJlbmRlcmVyKCktPnBhaW50KHBhaW50SW5mbywgdHgs
IHR5KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgY2xpcC4KKyAg
ICAgICAgICAgIHJlc3RvcmVDbGlwKGNvbnRleHQsIHBhaW50RGlydHlSZWN0LCBkYW1hZ2VSZWN0
KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFTU0VSVCghbV9vd25pbmdMYXllci0+bV91c2Vk
VHJhbnNwYXJlbmN5KTsKK30KKworLy8gVXAtY2FsbCBmcm9tIGNvbXBvc2l0aW5nIGxheWVyIGRy
YXdpbmcgY2FsbGJhY2suCit2b2lkIFJlbmRlckxheWVyQmFja2luZzo6cGFpbnRDb250ZW50cyhj
b25zdCBHcmFwaGljc0xheWVyKiwgR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0LCBHcmFwaGljc0xh
eWVyUGFpbnRpbmdQaGFzZSBkcmF3aW5nUGhhc2UsIGNvbnN0IEludFJlY3QmIGNsaXApCit7Cisg
ICAgLy8gV2UgaGF2ZSB0byB1c2UgdGhlIHNhbWUgcm9vdCBhcyBmb3IgaGl0IHRlc3RpbmcsIGJl
Y2F1c2UgYm90aCBtZXRob2RzCisgICAgLy8gY2FuIGNvbXB1dGUgYW5kIGNhY2hlIGNsaXBSZWN0
cy4KKyAgICBJbnRSZWN0IGVuY2xvc2luZ0JCb3ggPSBjb21wb3NpdG9yKCktPmNhbGN1bGF0ZUNv
bXBvc2l0ZWRCb3VuZHMobV9vd25pbmdMYXllciwgbV9vd25pbmdMYXllcik7CisKKyAgICBJbnRS
ZWN0IGNsaXBSZWN0KGNsaXApOworICAgIAorICAgIC8vIFNldCB1cCB0aGUgY29vcmRpbmF0ZSBz
cGFjZSB0byBiZSBpbiB0aGUgbGF5ZXIncyByZW5kZXJpbmcgY29vcmRpbmF0ZXMuCisgICAgY29u
dGV4dC50cmFuc2xhdGUoLWVuY2xvc2luZ0JCb3gueCgpLCAtZW5jbG9zaW5nQkJveC55KCkpOwor
CisgICAgLy8gT2Zmc2V0IHRoZSBjbGlwLgorICAgIGNsaXBSZWN0Lm1vdmUoZW5jbG9zaW5nQkJv
eC54KCksIGVuY2xvc2luZ0JCb3gueSgpKTsKKyAgICAKKyAgICAvLyBUaGUgZGlydHlSZWN0IGlz
IGluIHRoZSBjb29yZHMgb2YgdGhlIHBhaW50aW5nIHJvb3QuCisgICAgSW50UmVjdCBkaXJ0eVJl
Y3QgPSBlbmNsb3NpbmdCQm94OworICAgIGRpcnR5UmVjdC5pbnRlcnNlY3QoY2xpcFJlY3QpOwor
CisgICAgcGFpbnRJbnRvTGF5ZXIobV9vd25pbmdMYXllciwgJmNvbnRleHQsIGRpcnR5UmVjdCwg
ZmFsc2UsIFBhaW50UmVzdHJpY3Rpb25Ob25lLCBkcmF3aW5nUGhhc2UsIHJlbmRlcmVyKCkpOwor
fQorCitib29sIFJlbmRlckxheWVyQmFja2luZzo6c3RhcnRBbmltYXRpb24oZG91YmxlIGJlZ2lu
VGltZSwgY29uc3QgQW5pbWF0aW9uKiBhbmltLCBjb25zdCBLZXlmcmFtZUxpc3QmIGtleWZyYW1l
cykKK3sKKyAgICBib29sIGhhc09wYWNpdHkgPSBrZXlmcmFtZXMuY29udGFpbnNQcm9wZXJ0eShD
U1NQcm9wZXJ0eU9wYWNpdHkpOworICAgIGJvb2wgaGFzVHJhbnNmb3JtID0ga2V5ZnJhbWVzLmNv
bnRhaW5zUHJvcGVydHkoQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm0pOworICAgIAorICAgIGlm
ICghaGFzT3BhY2l0eSAmJiAhaGFzVHJhbnNmb3JtKQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgCisgICAgR3JhcGhpY3NMYXllcjo6VHJhbnNmb3JtVmFsdWVMaXN0IHRyYW5zZm9ybVZlY3Rv
cjsKKyAgICBHcmFwaGljc0xheWVyOjpGbG9hdFZhbHVlTGlzdCBvcGFjaXR5VmVjdG9yOworCisg
ICAgZm9yIChWZWN0b3I8S2V5ZnJhbWVWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0ga2V5ZnJh
bWVzLmJlZ2luS2V5ZnJhbWVzKCk7IGl0ICE9IGtleWZyYW1lcy5lbmRLZXlmcmFtZXMoKTsgKytp
dCkgeworICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSoga2V5ZnJhbWVTdHlsZSA9IGl0LT5zdHls
ZSgpOworICAgICAgICBmbG9hdCBrZXkgPSBpdC0+a2V5KCk7CisKKyAgICAgICAgaWYgKCFrZXlm
cmFtZVN0eWxlKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAKKyAgICAgICAg
Ly8gZ2V0IHRpbWluZyBmdW5jdGlvbgorICAgICAgICBjb25zdCBUaW1pbmdGdW5jdGlvbiogdGYg
PSBrZXlmcmFtZVN0eWxlLT5oYXNBbmltYXRpb25zKCkgPyAmKCgqa2V5ZnJhbWVTdHlsZS0+YW5p
bWF0aW9ucygpKS5hbmltYXRpb24oMCktPnRpbWluZ0Z1bmN0aW9uKCkpIDogMDsKKyAgICAgICAg
CisgICAgICAgIGlmIChoYXNUcmFuc2Zvcm0pCisgICAgICAgICAgICB0cmFuc2Zvcm1WZWN0b3Iu
aW5zZXJ0KGtleSwgJihrZXlmcmFtZVN0eWxlLT50cmFuc2Zvcm0oKSksIHRmKTsKKworICAgICAg
ICBpZiAoaGFzT3BhY2l0eSkKKyAgICAgICAgICAgIG9wYWNpdHlWZWN0b3IuaW5zZXJ0KGtleSwg
a2V5ZnJhbWVTdHlsZS0+b3BhY2l0eSgpLCB0Zik7CisgICAgfQorCisgICAgYm9vbCBkaWRBbmlt
YXRlVHJhbnNmb3JtID0gIWhhc1RyYW5zZm9ybTsKKyAgICBib29sIGRpZEFuaW1hdGVPcGFjaXR5
ID0gIWhhc09wYWNpdHk7CisgICAgCisgICAgaWYgKGhhc1RyYW5zZm9ybSAmJiBtX2dyYXBoaWNz
TGF5ZXItPmFuaW1hdGVUcmFuc2Zvcm0odHJhbnNmb3JtVmVjdG9yLCByZW5kZXJlcigpLT5ib3Jk
ZXJCb3hSZWN0KCkuc2l6ZSgpLCBhbmltLCBiZWdpblRpbWUsIGZhbHNlKSkKKyAgICAgICAgZGlk
QW5pbWF0ZVRyYW5zZm9ybSA9IHRydWU7CisKKyAgICBpZiAoaGFzT3BhY2l0eSAmJiBtX2dyYXBo
aWNzTGF5ZXItPmFuaW1hdGVGbG9hdChBbmltYXRlZFByb3BlcnR5T3BhY2l0eSwgb3BhY2l0eVZl
Y3RvciwgYW5pbSwgYmVnaW5UaW1lKSkKKyAgICAgICAgZGlkQW5pbWF0ZU9wYWNpdHkgPSB0cnVl
OworICAgIAorICAgIHJldHVybiBkaWRBbmltYXRlVHJhbnNmb3JtICYmIGRpZEFuaW1hdGVPcGFj
aXR5OworfQorCitib29sIFJlbmRlckxheWVyQmFja2luZzo6c3RhcnRUcmFuc2l0aW9uKGRvdWJs
ZSBiZWdpblRpbWUsIGludCBwcm9wZXJ0eSwgY29uc3QgUmVuZGVyU3R5bGUqIGZyb21TdHlsZSwg
Y29uc3QgUmVuZGVyU3R5bGUqIHRvU3R5bGUpCit7CisgICAgYm9vbCBkaWRBbmltYXRlID0gZmFs
c2U7CisgICAgCisgICAgaWYgKHByb3BlcnR5ID09IGNBbmltYXRlQWxsIHx8IHByb3BlcnR5ID09
IChpbnQpQ1NTUHJvcGVydHlPcGFjaXR5KSB7CisgICAgICAgIGNvbnN0IEFuaW1hdGlvbiogb3Bh
Y2l0eUFuaW0gPSB0b1N0eWxlLT50cmFuc2l0aW9uRm9yUHJvcGVydHkoQ1NTUHJvcGVydHlPcGFj
aXR5KTsKKyAgICAgICAgaWYgKG9wYWNpdHlBbmltICYmICFvcGFjaXR5QW5pbS0+aXNFbXB0eU9y
WmVyb0R1cmF0aW9uKCkpIHsKKyAgICAgICAgICAgIC8vIElmIGJlZ2luVGltZSBpcyBub3QgMCwg
d2UgYXJlIHJlc3RhcnRpbmcgdGhpcyB0cmFuc2l0aW9uLCBzbyBmaXJzdCBzZXQgdGhlIGZyb20g
dmFsdWUKKyAgICAgICAgICAgIC8vIGluIGNhc2UgaXQgd2FzIHNtYXNoZWQgYnkgYSBwcmV2aW91
cyBhbmltYXRpb24uCisgICAgICAgICAgICBpZiAoYmVnaW5UaW1lID4gMCkKKyAgICAgICAgICAg
ICAgICBtX2dyYXBoaWNzTGF5ZXItPnNldE9wYWNpdHkoY29tcG9zaXRpbmdPcGFjaXR5KGZyb21T
dHlsZS0+b3BhY2l0eSgpKSwgMCwgMCk7CisKKyAgICAgICAgICAgIGlmIChtX2dyYXBoaWNzTGF5
ZXItPnNldE9wYWNpdHkoY29tcG9zaXRpbmdPcGFjaXR5KHRvU3R5bGUtPm9wYWNpdHkoKSksIG9w
YWNpdHlBbmltLCBiZWdpblRpbWUpKQorICAgICAgICAgICAgICAgIGRpZEFuaW1hdGUgPSB0cnVl
OworICAgICAgICB9CisgICAgfQorICAgIGlmIChwcm9wZXJ0eSA9PSBjQW5pbWF0ZUFsbCB8fCBw
cm9wZXJ0eSA9PSAoaW50KUNTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtKSB7CisgICAgICAgIC8v
IFdlIGdldCBhIFRyYW5zZm9ybU9wZXJhdGlvbiwgd2hpY2ggaXMgYSBsaW5rZWQgbGlzdCBvZiBw
cmltaXRpdmUgb3BlcmF0aW9ucyBhbmQgdGhlaXIgYXJndW1lbnRzLgorICAgICAgICAvLyBBcmd1
bWVudHMgY2FuIGJlIGZsb2F0cyBvciBMZW5ndGggdmFsdWVzLCB3aGljaCBuZWVkIHRvIGJlIGNv
bnZlcnRlZCB0byBudW1iZXJzIHVzaW5nCisgICAgICAgIC8vIHZhbC5jYWxjRmxvYXRWYWx1ZShy
ZW5kZXJlcigpLT53aWR0aCgpKSAob3IgaGVpZ2h0KCkpLgorICAgICAgICBjb25zdCBBbmltYXRp
b24qIHRyYW5zZm9ybUFuaW0gPSB0b1N0eWxlLT50cmFuc2l0aW9uRm9yUHJvcGVydHkoQ1NTUHJv
cGVydHlXZWJraXRUcmFuc2Zvcm0pOworICAgICAgICBpZiAodHJhbnNmb3JtQW5pbSAmJiAhdHJh
bnNmb3JtQW5pbS0+aXNFbXB0eU9yWmVyb0R1cmF0aW9uKCkpIHsKKyAgICAgICAgICAgIEdyYXBo
aWNzTGF5ZXI6OlRyYW5zZm9ybVZhbHVlTGlzdCB0cmFuc2Zvcm1WZWN0b3I7CisgICAgICAgICAg
ICB0cmFuc2Zvcm1WZWN0b3IuaW5zZXJ0KDAsICZmcm9tU3R5bGUtPnRyYW5zZm9ybSgpLCAwKTsg
ICAgICAgIAorICAgICAgICAgICAgdHJhbnNmb3JtVmVjdG9yLmluc2VydCgxLCAmdG9TdHlsZS0+
dHJhbnNmb3JtKCksIDApOyAgICAgICAgCisgICAgICAgICAgICBpZiAobV9ncmFwaGljc0xheWVy
LT5hbmltYXRlVHJhbnNmb3JtKHRyYW5zZm9ybVZlY3RvciwgcmVuZGVyZXIoKS0+Ym9yZGVyQm94
UmVjdCgpLnNpemUoKSwgdHJhbnNmb3JtQW5pbSwgYmVnaW5UaW1lLCB0cnVlKSkKKyAgICAgICAg
ICAgICAgICBkaWRBbmltYXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBy
ZXR1cm4gZGlkQW5pbWF0ZTsKK30KKwordm9pZCBSZW5kZXJMYXllckJhY2tpbmc6Om5vdGlmeVRy
YW5zaXRpb25TdGFydGVkKGNvbnN0IEdyYXBoaWNzTGF5ZXIqLCBBbmltYXRlZFByb3BlcnR5SUQg
cHJvcGVydHksIGRvdWJsZSB0aW1lKQoreworICAgIGludCBjc3NQcm9wZXJ0eSA9IENTU1Byb3Bl
cnR5SW52YWxpZDsKKyAgICBzd2l0Y2ggKHByb3BlcnR5KSB7CisgICAgICAgIGNhc2UgQW5pbWF0
ZWRQcm9wZXJ0eUludmFsaWQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBbmlt
YXRlZFByb3BlcnR5V2Via2l0VHJhbnNmb3JtOgorICAgICAgICAgICAgY3NzUHJvcGVydHkgPSBD
U1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEFuaW1hdGVkUHJvcGVydHlPcGFjaXR5OgorICAgICAgICAgICAgY3NzUHJvcGVydHkgPSBD
U1NQcm9wZXJ0eU9wYWNpdHk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBbmlt
YXRlZFByb3BlcnR5QmFja2dyb3VuZENvbG9yOgorICAgICAgICAgICAgY3NzUHJvcGVydHkgPSBD
U1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAg
ICAKKyAgICByZW5kZXJlcigpLT5ub3RpZnlUcmFuc2l0aW9uU3RhcnRlZChjc3NQcm9wZXJ0eSwg
dGltZSk7Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJCYWNraW5nOjpub3RpZnlBbmltYXRpb25TdGFy
dGVkKGNvbnN0IEdyYXBoaWNzTGF5ZXIqLCBkb3VibGUgdGltZSkKK3sKKyAgICByZW5kZXJlcigp
LT5ub3RpZnlBbmltYXRpb25TdGFydGVkKHRpbWUpOworfQorCit2b2lkIFJlbmRlckxheWVyQmFj
a2luZzo6YW5pbWF0aW9uRmluaXNoZWQoY29uc3QgU3RyaW5nJiBuYW1lLCBpbnQgaW5kZXgsIGJv
b2wgcmVzZXQpCit7CisgICAgbV9ncmFwaGljc0xheWVyLT5yZW1vdmVGaW5pc2hlZEFuaW1hdGlv
bnMobmFtZSwgaW5kZXgsIHJlc2V0KTsKK30KKwordm9pZCBSZW5kZXJMYXllckJhY2tpbmc6OnRy
YW5zaXRpb25GaW5pc2hlZChpbnQgcHJvcGVydHkpCit7CisgICAgbV9ncmFwaGljc0xheWVyLT5y
ZW1vdmVGaW5pc2hlZFRyYW5zaXRpb25zKHByb3BlcnR5KTsKK30KKwordm9pZCBSZW5kZXJMYXll
ckJhY2tpbmc6OnN1c3BlbmRBbmltYXRpb25zKCkKK3sKKyAgICBtX2dyYXBoaWNzTGF5ZXItPnN1
c3BlbmRBbmltYXRpb25zKCk7Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJCYWNraW5nOjpyZXN1bWVB
bmltYXRpb25zKCkKK3sKKyAgICBtX2dyYXBoaWNzTGF5ZXItPnJlc3VtZUFuaW1hdGlvbnMoKTsK
K30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJC
YWNraW5nLmggYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllckJhY2tpbmcuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDU5ZDQwCi0tLSAvZGV2L251bGwKKysrIGIv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJCYWNraW5nLmgKQEAgLTAsMCArMSwxNzAgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpZm5kZWYgUmVuZGVyTGF5ZXJCYWNraW5nX2gKKyNkZWZpbmUgUmVuZGVyTGF5ZXJCYWNraW5n
X2gKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2luY2x1ZGUgIkZsb2F0
UG9pbnQuaCIKKyNpbmNsdWRlICJGbG9hdFBvaW50M0QuaCIKKyNpbmNsdWRlICJHcmFwaGljc0xh
eWVyLmgiOworI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJDbGllbnQuaCI7CisjaW5jbHVkZSAiUmVu
ZGVyTGF5ZXIuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK2NsYXNzIFJlbmRlckxheWVyQ29tcG9zaXRvcjsKKworLy8gUmVuZGVy
TGF5ZXJCYWNraW5nIGNvbnRyb2xzIHRoZSBjb21wb3NpdGluZyBiZWhhdmlvciBmb3IgYSBzaW5n
bGUgUmVuZGVyTGF5ZXIuCisvLyBJdCBob2xkcyB0aGUgdmFyaW91cyBHcmFwaGljc0xheWVycywg
YW5kIG1ha2VzIGRlY2lzaW9ucyBhYm91dCBpbnRyYS1sYXllciByZW5kZXJpbmcKKy8vIG9wdGlt
aXphdGlvbnMuCisvLyAKKy8vIFRoZXJlIGlzIG9uZSBSZW5kZXJMYXllckJhY2tpbmcgZm9yIGVh
Y2ggUmVuZGVyTGF5ZXIgdGhhdCBpcyBjb21wb3NpdGVkLgorCitjbGFzcyBSZW5kZXJMYXllckJh
Y2tpbmcgOiBwdWJsaWMgR3JhcGhpY3NMYXllckNsaWVudCB7CitwdWJsaWM6CisgICAgUmVuZGVy
TGF5ZXJCYWNraW5nKFJlbmRlckxheWVyKik7CisgICAgflJlbmRlckxheWVyQmFja2luZygpOwor
CisgICAgUmVuZGVyTGF5ZXIqIG93bmluZ0xheWVyKCkgY29uc3QgeyByZXR1cm4gbV9vd25pbmdM
YXllcjsgfQorCisgICAgdm9pZCB1cGRhdGVBZnRlckxheW91dCgpOworICAgIAorICAgIC8vIFJl
dHVybnMgdHJ1ZSBpZiBsYXllciBjb25maWd1cmF0aW9uIGNoYW5nZWQuCisgICAgYm9vbCB1cGRh
dGVHcmFwaGljc0xheWVycyhib29sIG5lZWRzQ29udGVudHNMYXllciwgYm9vbCBuZWVkc1VwcGVy
Q2xpcHBpbmdMYXllciwgYm9vbCBuZWVkc0xvd2VyQ2xpcHBpbmdMYXllciwgYm9vbCBuZWVkc1Jl
cGFpbnQpOworICAgIHZvaWQgdXBkYXRlR3JhcGhpY3NMYXllckdlb21ldHJ5KCk7CisgICAgdm9p
ZCB1cGRhdGVJbnRlcm5hbEhpZXJhcmNoeSgpOworICAgIAorICAgIEdyYXBoaWNzTGF5ZXIqIGdy
YXBoaWNzTGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2dyYXBoaWNzTGF5ZXI7IH0KKworICAgIC8v
IExheWVyIHRvIGNsaXAgY2hpbGRyZW4KKyAgICBib29sIGhhc0NsaXBwaW5nTGF5ZXIoKSBjb25z
dCB7IHJldHVybiBtX2NsaXBwaW5nTGF5ZXIgIT0gMDsgfQorICAgIEdyYXBoaWNzTGF5ZXIqIGNs
aXBwaW5nTGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2NsaXBwaW5nTGF5ZXI7IH0KKworICAgIC8v
IExheWVyIHRvIGdldCBjbGlwcGVkIGJ5IGFuY2VzdG9yCisgICAgYm9vbCBoYXNBbmNlc3RvckNs
aXBwaW5nTGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2FuY2VzdG9yQ2xpcHBpbmdMYXllciAhPSAw
OyB9CisgICAgR3JhcGhpY3NMYXllciogYW5jZXN0b3JDbGlwcGluZ0xheWVyKCkgY29uc3QgeyBy
ZXR1cm4gbV9hbmNlc3RvckNsaXBwaW5nTGF5ZXI7IH0KKworICAgIGJvb2wgaGFzQ29udGVudHNM
YXllcigpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudHNMYXllciAhPSAwOyB9CisgICAgR3JhcGhp
Y3NMYXllciogY29udGVudHNMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudHNMYXllcjsg
fQorICAgIAorICAgIEdyYXBoaWNzTGF5ZXIqIHBhcmVudEZvclN1YmxheWVycygpIGNvbnN0IHsg
cmV0dXJuIG1fY2xpcHBpbmdMYXllciA/IG1fY2xpcHBpbmdMYXllciA6IG1fZ3JhcGhpY3NMYXll
cjsgfQorICAgIEdyYXBoaWNzTGF5ZXIqIGNoaWxkRm9yU3VwZXJsYXllcnMoKSBjb25zdCB7IHJl
dHVybiBtX2FuY2VzdG9yQ2xpcHBpbmdMYXllciA/IG1fYW5jZXN0b3JDbGlwcGluZ0xheWVyIDog
bV9ncmFwaGljc0xheWVyOyB9CisKKyAgICAvLyBSZW5kZXJMYXllcnMgd2l0aCBiYWNraW5nIG5v
cm1hbGx5IHNob3J0LWNpcmN1aXQgcGFpbnRMYXllcigpIGJlY2F1c2UKKyAgICAvLyB0aGVpciBj
b250ZW50IGlzIHJlbmRlcmVkIHZpYSBjYWxsYmFja3MgZnJvbSBHcmFwaGljc0xheWVyLiBIb3dl
dmVyLCB0aGUgZG9jdW1lbnQKKyAgICAvLyBsYXllciBpcyBzcGVjaWFsLCBiZWNhdXNlIGl0IGhh
cyBhIEdyYXBoaWNzTGF5ZXIgdG8gYWN0IGFzIGEgY29udGFpbmVyIGZvciB0aGUgR3JhcGhpY3NM
YXllcnMKKyAgICAvLyBmb3IgZGVzY2VuZGFudHMsIGJ1dCBpdHMgY29udGVudHMgdXN1YWxseSBy
ZW5kZXIgaW50byB0aGUgd2luZG93IChpbiB3aGljaCBjYXNlIHRoaXMgcmV0dXJucyB0cnVlKS4K
KyAgICAvLyBUaGlzIHJldHVybnMgZmFsc2UgZm9yIG90aGVyIGxheWVycywgYW5kIHdoZW4gdGhl
IGRvY3VtZW50IGxheWVyIGFjdHVhbGx5IG5lZWRzIHRvIHBhaW50IGludG8gaXRzIGJhY2tpbmcg
c3RvcmUKKyAgICAvLyBmb3Igc29tZSByZWFzb24uCisgICAgYm9vbCBwYWludGluZ0dvZXNUb1dp
bmRvdygpIGNvbnN0OworCisgICAgdm9pZCBzZXRDb250ZW50c05lZWREaXNwbGF5KCk7CisgICAg
Ly8gciBpcyBpbiB0aGUgY29vcmRpbmF0ZSBzcGFjZSBvZiB0aGUgbGF5ZXIncyByZW5kZXIgb2Jq
ZWN0CisgICAgdm9pZCBzZXRDb250ZW50c05lZWREaXNwbGF5SW5SZWN0KGNvbnN0IEludFJlY3Qm
IHIpOworCisgICAgLy8gSW50ZXJmYWNlIHRvIHN0YXJ0LCBmaW5pc2gsIHN1c3BlbmQgYW5kIHJl
c3VtZSBhbmltYXRpb25zIGFuZCB0cmFuc2l0aW9ucworICAgIGJvb2wgc3RhcnRBbmltYXRpb24o
ZG91YmxlIGJlZ2luVGltZSwgY29uc3QgQW5pbWF0aW9uKiBhbmltLCBjb25zdCBLZXlmcmFtZUxp
c3QmIGtleWZyYW1lcyk7CisgICAgYm9vbCBzdGFydFRyYW5zaXRpb24oZG91YmxlIGJlZ2luVGlt
ZSwgaW50IHByb3BlcnR5LCBjb25zdCBSZW5kZXJTdHlsZSogZnJvbVN0eWxlLCBjb25zdCBSZW5k
ZXJTdHlsZSogdG9TdHlsZSk7CisgICAgdm9pZCBhbmltYXRpb25GaW5pc2hlZChjb25zdCBTdHJp
bmcmIG5hbWUsIGludCBpbmRleCwgYm9vbCByZXNldCk7CisgICAgdm9pZCB0cmFuc2l0aW9uRmlu
aXNoZWQoaW50IHByb3BlcnR5KTsKKworICAgIHZvaWQgc3VzcGVuZEFuaW1hdGlvbnMoKTsKKyAg
ICB2b2lkIHJlc3VtZUFuaW1hdGlvbnMoKTsKKworICAgIEZsb2F0UG9pbnQgZ3JhcGhpY3NMYXll
clRvQ29udGVudHNDb29yZGluYXRlcyhjb25zdCBHcmFwaGljc0xheWVyKiwgY29uc3QgRmxvYXRQ
b2ludCYpOworICAgIEZsb2F0UG9pbnQgY29udGVudHNUb0dyYXBoaWNzTGF5ZXJDb29yZGluYXRl
cyhjb25zdCBHcmFwaGljc0xheWVyKiwgY29uc3QgRmxvYXRQb2ludCYpOworCisgICAgdm9pZCBm
b3JjZUNvbXBvc2l0aW5nTGF5ZXIoYm9vbCBmb3JjZSA9IHRydWUpOworICAgIGJvb2wgZm9yY2Vk
Q29tcG9zaXRpbmdMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fZm9yY2VDb21wb3NpdGluZ0xheWVy
OyB9CisKKyAgICB2b2lkIGRldGVjdERyYXdpbmdPcHRpbWl6YXRpb25zKCk7CisgICAgdm9pZCBp
bnZhbGlkYXRlRHJhd2luZ09wdGltaXphdGlvbnMoKTsKKworICAgIC8vIEdyYXBoaWNzTGF5ZXJD
bGllbnQgaW50ZXJmYWNlCisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVRyYW5zaXRpb25TdGFydGVk
KGNvbnN0IEdyYXBoaWNzTGF5ZXIqLCBBbmltYXRlZFByb3BlcnR5SUQsIGRvdWJsZSBzdGFydFRp
bWUpOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlBbmltYXRpb25TdGFydGVkKGNvbnN0IEdyYXBo
aWNzTGF5ZXIqLCBkb3VibGUgc3RhcnRUaW1lKTsKKworICAgIHZpcnR1YWwgdm9pZCBwYWludENv
bnRlbnRzKGNvbnN0IEdyYXBoaWNzTGF5ZXIqLCBHcmFwaGljc0NvbnRleHQmLCBHcmFwaGljc0xh
eWVyUGFpbnRpbmdQaGFzZSwgY29uc3QgSW50UmVjdCYgY2xpcCk7CisKKyAgICB2aXJ0dWFsIElu
dFJlY3QgY29udGVudHNCb3goY29uc3QgR3JhcGhpY3NMYXllciopOworICAgIAorcHJpdmF0ZToK
KyAgICB2b2lkIGNyZWF0ZUdyYXBoaWNzTGF5ZXIoKTsKKyAgICB2b2lkIGRlc3Ryb3lHcmFwaGlj
c0xheWVyKCk7CisKKyAgICBSZW5kZXJCb3gqIHJlbmRlcmVyKCkgY29uc3QgeyByZXR1cm4gbV9v
d25pbmdMYXllci0+cmVuZGVyZXIoKTsgfQorICAgIFJlbmRlckxheWVyQ29tcG9zaXRvciogY29t
cG9zaXRvcigpIGNvbnN0IHsgcmV0dXJuIG1fb3duaW5nTGF5ZXItPmNvbXBvc2l0b3IoKTsgfQor
CisgICAgYm9vbCB1cGRhdGVDbGlwcGluZ0xheWVycyhib29sIG5lZWRzQW5jZXN0b3JDbGlwLCBi
b29sIG5lZWRzRGVzY2VuZGFudENsaXApOworICAgIGJvb2wgdXBkYXRlQ29udGVudHNMYXllcihi
b29sIG5lZWRzQ29udGVudHNMYXllcik7CisKKyAgICBJbnRTaXplIGNvbnRlbnRPZmZzZXRJbkNv
bXBvc3RpbmdMYXllcigpOworICAgIC8vIFJlc3VsdCBpcyB0cmFuc2Zvcm0gb3JpZ2luIGluIHBp
eGVscy4KKyAgICBGbG9hdFBvaW50IGNvbXB1dGVUcmFuc2Zvcm1PcmlnaW4oY29uc3QgSW50UmVj
dCYgYm9yZGVyQm94KSBjb25zdDsKKworICAgIHZvaWQgdXBkYXRlTGF5ZXJPcGFjaXR5KCk7Cisg
ICAgdm9pZCB1cGRhdGVMYXllclRyYW5zZm9ybSgpOworCisgICAgLy8gUmV0dXJuIHRoZSBvcGFj
aXR5IHZhbHVlIHRoYXQgdGhpcyBsYXllciBzaG91bGQgdXNlIGZvciBjb21wb3NpdGluZy4KKyAg
ICBmbG9hdCBjb21wb3NpdGluZ09wYWNpdHkoZmxvYXQgcmVuZGVyZXJPcGFjaXR5KSBjb25zdDsK
KyAgICAKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBSZW5kZXJMYXllciBvbmx5IGhhcyBj
b250ZW50IHRoYXQgY2FuIGJlIHJlbmRlcmVkIGRpcmVjdGx5CisgICAgLy8gYnkgdGhlIGNvbXBv
c2l0aW5nIGxheWVyLCB3aXRob3V0IGRyYXdpbmcgKGUuZy4gc29saWQgYmFja2dyb3VuZCBjb2xv
cikuCisgICAgYm9vbCBpc1NpbXBsZUNvbnRhaW5lckNvbXBvc2l0aW5nTGF5ZXIoKTsKKworICAg
IGJvb2wgcmVuZGVyZXJIYXNCYWNrZ3JvdW5kKCkgY29uc3Q7CisgICAgY29uc3QgQ29sb3ImIHJl
bmRlcmVyQmFja2dyb3VuZENvbG9yKCkgY29uc3Q7CisKKyAgICBib29sIGNhbkJlU2ltcGxlQ29u
dGFpbmVyQ29tcG9zaXRpbmdMYXllcigpIGNvbnN0OworICAgIGJvb2wgaGFzTm9uQ29tcG9zaXRp
bmdDb250ZW50KCkgY29uc3Q7CisgICAgCisgICAgdm9pZCBwYWludEludG9MYXllcihSZW5kZXJM
YXllciogcm9vdExheWVyLCBHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRSZWN0JiBwYWludERp
cnR5UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXZlVHJhbnNwYXJlbmN5LCBQYWlu
dFJlc3RyaWN0aW9uIHBhaW50UmVzdHJpY3Rpb24sIEdyYXBoaWNzTGF5ZXJQYWludGluZ1BoYXNl
LCBSZW5kZXJPYmplY3QqIHBhaW50aW5nUm9vdCk7CisKK3ByaXZhdGU6CisgICAgUmVuZGVyTGF5
ZXIqIG1fb3duaW5nTGF5ZXI7CisKKyAgICBHcmFwaGljc0xheWVyKiBtX2FuY2VzdG9yQ2xpcHBp
bmdMYXllcjsgLy8gb25seSB1c2VkIGlmIHdlIGFyZSBjbGlwcGVkIGJ5IGFuIGFuY2VzdG9yIHdo
aWNoIGlzIG5vdCBhIHN0YWNraW5nIGNvbnRleHQKKyAgICBHcmFwaGljc0xheWVyKiBtX2dyYXBo
aWNzTGF5ZXI7CisgICAgR3JhcGhpY3NMYXllciogbV9jb250ZW50c0xheWVyOyAgICAgICAgIC8v
IG9ubHkgdXNlZCBpbiBjYXNlcyB3aGVyZSB3ZSBuZWVkIHRvIGRyYXcgdGhlIGZvcmVncm91bmQg
c2VwYXJhdGVseQorICAgIEdyYXBoaWNzTGF5ZXIqIG1fY2xpcHBpbmdMYXllcjsgICAgICAgICAv
LyBvbmx5IHVzZWQgaWYgd2UgaGF2ZSBjbGlwcGluZyBvbiBhIHN0YWNraW5nIGNvbnRleHQsIHdp
dGggY29tcG9zaXRpbmcgY2hpbGRyZW4KKworICAgIEludFNpemUgbV9jb21wb3NpdGluZ0NvbnRl
bnRPZmZzZXQ7CisKKyAgICBib29sIG1fZm9yY2VDb21wb3NpdGluZ0xheWVyIDogMTsgICAvLyBz
ZXQgaWYgd2UgbmVlZCBhIGNvbXBvc2l0aW5nIGxheWVyIGJlY2F1c2Ugb2Ygc29tZSBleHRlcm5h
bCByZXF1aXJlbWVudAorICAgIGJvb2wgbV9pc1NpbXBsZUNvbnRhaW5lckNvbXBvc2l0aW5nTGF5
ZXIgOiAxOyAgLy8gaXMgdGhpcyBjb21wb3NpdGluZyBsYXllciBhYmxlIHRvIGJlIHNpbXBsaWZp
ZWQKKyAgICBib29sIG1fc2ltcGxlQ29tcG9zaXRpbmdMYXllclN0YXR1c0RpcnR5IDogMTsgLy8g
c2V0IGlmIHRoZSB0ZXN0IGZvciBzaW1wbGUgbGF5ZXJzIG5lZWRzIHRvIGJlIHJlZG9uZQorCisg
ICAgYm9vbCBtX2NvbXBvc2l0aW5nQ29udGVudE9mZnNldERpcnR5OiAxOworfTsKKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5H
KQorCisjZW5kaWYgLy8gUmVuZGVyTGF5ZXJCYWNraW5nX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckxheWVyQ29tcG9zaXRvci5jcHAgYi9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJMYXllckNvbXBvc2l0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAuLjQxM2Q2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJM
YXllckNvbXBvc2l0b3IuY3BwCkBAIC0wLDAgKzEsNzQ5IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisjaW5jbHVkZSAiUmVuZGVyTGF5
ZXJDb21wb3NpdG9yLmgiCisKKyNpbmNsdWRlICJBbmltYXRpb25Db250cm9sbGVyLmgiCisjaW5j
bHVkZSAiQ2hyb21lQ2xpZW50LmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAi
R3JhcGhpY3NMYXllci5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXF1ZXN0LmgiCisjaW5jbHVkZSAi
SGl0VGVzdFJlc3VsdC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJSZW5kZXJMYXll
ckJhY2tpbmcuaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCisKKyNpZiBQUk9GSUxFX0xBWUVS
X1JFQlVJTEQKKyNpbmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KKyNlbmRpZgorCisjaWZuZGVm
IE5ERUJVRworI2luY2x1ZGUgIkNTdHJpbmcuaCIKKyNpbmNsdWRlICJSZW5kZXJUcmVlQXNUZXh0
LmgiCisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdHJ1Y3QgQ29tcG9zaXRpbmdT
dGF0ZSB7CisgICAgQ29tcG9zaXRpbmdTdGF0ZShSZW5kZXJMYXllciogY29tcEFuY2VzdG9yKQor
ICAgICAgICA6IG1fc3VidHJlZUlzQ29tcG9zaXRpbmcoZmFsc2UpCisgICAgICAgICwgbV9jb21w
b3NpdGluZ0FuY2VzdG9yKGNvbXBBbmNlc3RvcikKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgICwg
bV9kZXB0aCgwKQorI2VuZGlmCisgICAgeworICAgIH0KKyAgICAKKyAgICBib29sIG1fc3VidHJl
ZUlzQ29tcG9zaXRpbmc7CisgICAgUmVuZGVyTGF5ZXIqIG1fY29tcG9zaXRpbmdBbmNlc3RvcjsK
KyNpZm5kZWYgTkRFQlVHCisgICAgaW50IG1fZGVwdGg7CisjZW5kaWYKK307CisKK3N0YXRpYyBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCBmbGlwVHJhbnNmb3JtKCkKK3sKKyAgICBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCBmbGlwcGVyOworICAgIGZsaXBwZXIuZmxpcFkoKTsKKyAgICByZXR1cm4gZmxpcHBl
cjsKK30KKworUmVuZGVyTGF5ZXJDb21wb3NpdG9yOjpSZW5kZXJMYXllckNvbXBvc2l0b3IoUmVu
ZGVyVmlldyogcmVuZGVyVmlldykKKyAgICA6IG1fcmVuZGVyVmlldyhyZW5kZXJWaWV3KQorICAg
ICwgbV9yb290UGxhdGZvcm1MYXllcigwKQorICAgICwgbV9jb21wb3NpdGluZyhmYWxzZSkKKyAg
ICAsIG1fcm9vdExheWVyQXR0YWNoZWQoZmFsc2UpCisgICAgLCBtX2NvbXBvc2l0aW5nTGF5ZXJz
TmVlZFVwZGF0ZShmYWxzZSkKKyNpZiBQUk9GSUxFX0xBWUVSX1JFQlVJTEQKKyAgICAsIG1fcm9v
dExheWVyVXBkYXRlQ291bnQoMCkKKyNlbmRpZiAvLyBQUk9GSUxFX0xBWUVSX1JFQlVJTEQKK3sK
K30KKworUmVuZGVyTGF5ZXJDb21wb3NpdG9yOjp+UmVuZGVyTGF5ZXJDb21wb3NpdG9yKCkKK3sK
KyAgICBBU1NFUlQoIW1fcm9vdExheWVyQXR0YWNoZWQpOworICAgIGRlbGV0ZSBtX3Jvb3RQbGF0
Zm9ybUxheWVyOworfQorCit2b2lkIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6ZW5hYmxlQ29tcG9z
aXRpbmdNb2RlKGJvb2wgZW5hYmxlIC8qID0gdHJ1ZSAqLykKK3sKKyAgICBpZiAoZW5hYmxlICE9
IG1fY29tcG9zaXRpbmcpIHsKKyAgICAgICAgbV9jb21wb3NpdGluZyA9IGVuYWJsZTsKKyAgICAg
ICAgCisgICAgICAgIC8vIFdlIG5ldmVyIGdvIG91dCBvZiBjb21wb3NpdGluZyBtb2RlIGZvciBh
IGdpdmVuIHBhZ2UsCisgICAgICAgIC8vIGJ1dCBpZiBhbGwgdGhlIGxheWVycyBkaXNhcHBlYXIs
IHdlJ2xsIGp1c3QgYmUgbGVmdCB3aXRoCisgICAgICAgIC8vIHRoZSBlbXB0eSByb290IGxheWVy
LCB3aGljaCBoYXMgbWluaW1hbCBvdmVyaGVhZC4KKyAgICAgICAgaWYgKG1fY29tcG9zaXRpbmcp
CisgICAgICAgICAgICBlbnN1cmVSb290UGxhdGZvcm1MYXllcigpOworICAgIH0KK30KKwordm9p
ZCBSZW5kZXJMYXllckNvbXBvc2l0b3I6OnNldENvbXBvc2l0aW5nTGF5ZXJzTmVlZFVwZGF0ZShi
b29sIG5lZWRVcGRhdGUpCit7CisgICAgaWYgKGluQ29tcG9zaXRpbmdNb2RlKCkpCisgICAgICAg
IG1fY29tcG9zaXRpbmdMYXllcnNOZWVkVXBkYXRlID0gbmVlZFVwZGF0ZTsKK30KKwordm9pZCBS
ZW5kZXJMYXllckNvbXBvc2l0b3I6OnVwZGF0ZUNvbXBvc2l0aW5nTGF5ZXJzKFJlbmRlckxheWVy
KiB1cGRhdGVSb290KQoreworICAgIGlmICghbV9jb21wb3NpdGluZ0xheWVyc05lZWRVcGRhdGUp
CisgICAgICAgIHJldHVybjsKKworICAgIG1fY29tcG9zaXRpbmdMYXllcnNOZWVkVXBkYXRlID0g
ZmFsc2U7CisKKyAgICBBU1NFUlQoaW5Db21wb3NpdGluZ01vZGUoKSk7CisKKyAgICBpZiAoIXVw
ZGF0ZVJvb3QpCisgICAgICAgIHVwZGF0ZVJvb3QgPSByb290UmVuZGVyTGF5ZXIoKTsKKworI2lm
IFBST0ZJTEVfTEFZRVJfUkVCVUlMRAorICAgICsrbV9yb290TGF5ZXJVcGRhdGVDb3VudDsKKyAg
ICAKKyAgICBkb3VibGUgc3RhcnRUaW1lID0gV1RGOjpjdXJyZW50VGltZSgpOworI2VuZGlmICAg
ICAgICAKKworICAgIC8vIEdvIHRocm91Z2ggdGhlIGxheWVycyBpbiBwcmVzZW50YXRpb24gb3Jk
ZXIsIHNvIHRoYXQgd2UgY2FuIGNvbXB1dGUgd2hpY2gKKyAgICAvLyBSTHMgbmVlZCBjb21wb3Np
dGluZyBsYXllcnMuCisgICAgLy8gRklYTUU6IHdlIGNvdWxkIG1heWJlIGRvIHRoaXMgaW4gb25l
IHBhc3MsIGJ1dCB0aGUgcGFyZW50aW5nIGxvZ2ljIHdvdWxkIGJlIG1vcmUKKyAgICAvLyBjb21w
bGV4LgorICAgIHsKKyAgICAgICAgQ29tcG9zaXRpbmdTdGF0ZSBjb21wU3RhdGUodXBkYXRlUm9v
dCk7CisgICAgICAgIGNvbXB1dGVDb21wb3NpdGluZ1JlcXVpcmVtZW50cyh1cGRhdGVSb290LCBj
b21wU3RhdGUpOworICAgIH0KKworICAgIC8vIE5vdyBjcmVhdGUgYW5kIHBhcmVudCB0aGUgY29t
cG9zaXRpbmcgbGF5ZXJzLgorICAgIHsKKyAgICAgICAgQ29tcG9zaXRpbmdTdGF0ZSBjb21wU3Rh
dGUodXBkYXRlUm9vdCk7CisgICAgICAgIHJlYnVpbGRDb21wb3NpdGluZ0xheWVyVHJlZSh1cGRh
dGVSb290LCBjb21wU3RhdGUpOworICAgIH0KKyAgICAKKyNpZiBQUk9GSUxFX0xBWUVSX1JFQlVJ
TEQKKyAgICBkb3VibGUgZW5kVGltZSA9IFdURjo6Y3VycmVudFRpbWUoKTsKKyAgICBpZiAoIXVw
ZGF0ZVJvb3QpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXBkYXRlICVkOiBjb21wdXRlQ29t
cG9zaXRpbmdSZXF1aXJlbWVudHMgZm9yIHRoZSB3b3JsZCB0b29rICVmbXNcbiIKKyAgICAgICAg
ICAgICAgICAgICAgbV9yb290TGF5ZXJVcGRhdGVDb3VudCwgMTAwMC4wICogKGVuZFRpbWUgLSBz
dGFydFRpbWUpKTsKKyNlbmRpZgorICAgIEFTU0VSVCghbV9jb21wb3NpdGluZ0xheWVyc05lZWRV
cGRhdGUpOworfQorCitib29sIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6dXBkYXRlTGF5ZXJDb21w
b3NpdGluZ1N0YXRlKFJlbmRlckxheWVyKiBsYXllciwgUmVuZGVyU3R5bGU6OkRpZmYgZGlmZikK
K3sKKyAgICBib29sIG5lZWRzTGF5ZXIgPSBuZWVkc1RvQmVDb21wb3NpdGVkKGxheWVyKTsKKyAg
ICBib29sIGxheWVyQ2hhbmdlZCA9IGZhbHNlOworICAgIGlmIChuZWVkc0xheWVyKSB7CisgICAg
ICAgIGVuYWJsZUNvbXBvc2l0aW5nTW9kZSgpOworICAgICAgICBpZiAoIWxheWVyLT5iYWNraW5n
KCkpIHsKKyAgICAgICAgICAgIGxheWVyLT5lbnN1cmVCYWNraW5nKCk7CisgICAgICAgICAgICBs
YXllckNoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYg
KGxheWVyLT5iYWNraW5nKCkpIHsKKyAgICAgICAgICAgIGxheWVyLT5jbGVhckJhY2tpbmcoKTsK
KyAgICAgICAgICAgIGxheWVyQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAg
CisgICAgaWYgKGxheWVyQ2hhbmdlZCkgeworICAgICAgICAvLyBpbnZhbGlkYXRlIHRoZSBwYXJl
bnQgaW4gdGhpcyByZWdpb24KKyAgICAgICAgUmVuZGVyTGF5ZXIqIGNvbXBMYXllciA9IGVuY2xv
c2luZ0NvbXBvc2l0aW5nTGF5ZXIobGF5ZXIsIGZhbHNlKTsKKyAgICAgICAgaWYgKGNvbXBMYXll
cikgeworICAgICAgICAgICAgLy8gV2UgY2FuJ3QgcmVsaWFibHkgY29tcHV0ZSBhIGRpcnR5IHJl
Y3QsIGJlY2F1c2Ugc3R5bGUgbWF5IGhhdmUgY2hhbmdlZCBhbHJlYWR5LCAKKyAgICAgICAgICAg
IC8vIHNvIGp1c3QgZGlydHkgdGhlIHdob2xlIHBhcmVudCBsYXllcgorICAgICAgICAgICAgY29t
cExheWVyLT5zZXROZWVkc1JlcGFpbnQoKTsKKyAgICAgICAgICAgIC8vIFRoZSBjb250ZW50cyBv
ZiB0aGlzIGxheWVyIG1heSBiZSBtb3ZpbmcgYmV0d2VlbiB0aGUgd2luZG93CisgICAgICAgICAg
ICAvLyBhbmQgYSBHcmFwaGljc0xheWVyLCBzbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgd2lu
ZG93IHN5c3RlbQorICAgICAgICAgICAgLy8gc3luY2hyb25pemVzIHRob3NlIGNoYW5nZXMgb24g
dGhlIHNjcmVlbi4KKyAgICAgICAgICAgIG1fcmVuZGVyVmlldy0+ZnJhbWVWaWV3KCktPnNldE5l
ZWRzU3luY2hyb25pemVkR3JhcGhpY3NGbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgbGF5
ZXItPnJlbmRlcmVyKCktPmNvbXBvc2l0aW5nU3RhdGVDaGFuZ2VkKCk7CisgICAgfQorCisgICAg
aWYgKCFuZWVkc0xheWVyKQorICAgICAgICByZXR1cm4gbGF5ZXJDaGFuZ2VkOworCisgICAgaWYg
KGxheWVyLT5iYWNraW5nKCktPnVwZGF0ZUdyYXBoaWNzTGF5ZXJzKG5lZWRzQ29udGVudHNDb21w
b3NpdGluZ0xheWVyKGxheWVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY2xpcHBlZEJ5QW5jZXN0b3IobGF5ZXIpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwc0NvbXBvc2l0aW5nRGVzY2VuZGFudHMo
bGF5ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBk
aWZmID49IFJlbmRlclN0eWxlOjpSZXBhaW50KSkKKyAgICAgICAgbGF5ZXJDaGFuZ2VkID0gdHJ1
ZTsKKworICAgIHJldHVybiBsYXllckNoYW5nZWQ7Cit9CisKKy8vIFRoZSBib3VuZHMgb2YgdGhl
IEdyYXBoaWNzTGF5ZXIgY3JlYXRlZCBmb3IgYSBjb21wb3NpdGluZyBsYXllciBpcyB0aGUgdW5p
b24gb2YgdGhlIGJvdW5kcyBvZiBhbGwgdGhlIGRlc2NlbmRhbnQKKy8vIFJlbmRlckxheWVycyB0
aGF0IGFyZSByZW5kZXJlZCBieSB0aGUgY29tcG9zaXRlZCBSZW5kZXJMYXllci4KK0ludFJlY3Qg
UmVuZGVyTGF5ZXJDb21wb3NpdG9yOjpjYWxjdWxhdGVDb21wb3NpdGVkQm91bmRzKGNvbnN0IFJl
bmRlckxheWVyKiBsYXllciwgY29uc3QgUmVuZGVyTGF5ZXIqIGFuY2VzdG9yTGF5ZXIsIEludFJl
Y3QqIGxheWVyQm91bmRpbmdCb3gpCit7CisgICAgSW50UmVjdCBib3VuZGluZ0JveFJlY3QsIHVu
aW9uQm91bmRzOworICAgIGJvdW5kaW5nQm94UmVjdCA9IHVuaW9uQm91bmRzID0gbGF5ZXItPmJv
dW5kaW5nQm94KGxheWVyKTsKKyAgICAKKyAgICBBU1NFUlQobGF5ZXItPmlzU3RhY2tpbmdDb250
ZXh0KCkgfHwgKCFsYXllci0+bV9wb3NaT3JkZXJMaXN0IHx8IGxheWVyLT5tX3Bvc1pPcmRlckxp
c3QtPnNpemUoKSA9PSAwKSk7CisKKyAgICBWZWN0b3I8UmVuZGVyTGF5ZXIqPiogbmVnWk9yZGVy
TGlzdCA9IGxheWVyLT5uZWdaT3JkZXJMaXN0KCk7CisgICAgaWYgKG5lZ1pPcmRlckxpc3QpIHsK
KyAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyTGF5ZXIqPjo6aXRlcmF0b3IgaXQgPSBuZWdaT3Jk
ZXJMaXN0LT5iZWdpbigpOyBpdCAhPSBuZWdaT3JkZXJMaXN0LT5lbmQoKTsgKytpdCkgeworICAg
ICAgICAgICAgUmVuZGVyTGF5ZXIqIGN1ckxheWVyID0gKCppdCk7CisgICAgICAgICAgICBpZiAo
IWN1ckxheWVyLT5pc0NvbXBvc2l0ZWQoKSkgeworICAgICAgICAgICAgICAgIEludFJlY3QgY2hp
bGRVbmlvbkJvdW5kcyA9IGNhbGN1bGF0ZUNvbXBvc2l0ZWRCb3VuZHMoY3VyTGF5ZXIsIGxheWVy
KTsKKyAgICAgICAgICAgICAgICB1bmlvbkJvdW5kcy51bml0ZShjaGlsZFVuaW9uQm91bmRzKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFZlY3RvcjxSZW5kZXJMYXll
cio+KiBwb3NaT3JkZXJMaXN0ID0gbGF5ZXItPnBvc1pPcmRlckxpc3QoKTsKKyAgICBpZiAocG9z
Wk9yZGVyTGlzdCkgeworICAgICAgICBmb3IgKFZlY3RvcjxSZW5kZXJMYXllcio+OjppdGVyYXRv
ciBpdCA9IHBvc1pPcmRlckxpc3QtPmJlZ2luKCk7IGl0ICE9IHBvc1pPcmRlckxpc3QtPmVuZCgp
OyArK2l0KSB7CisgICAgICAgICAgICBSZW5kZXJMYXllciogY3VyTGF5ZXIgPSAoKml0KTsKKyAg
ICAgICAgICAgIGlmICghY3VyTGF5ZXItPmlzQ29tcG9zaXRlZCgpKSB7CisgICAgICAgICAgICAg
ICAgSW50UmVjdCBjaGlsZFVuaW9uQm91bmRzID0gY2FsY3VsYXRlQ29tcG9zaXRlZEJvdW5kcyhj
dXJMYXllciwgbGF5ZXIpOworICAgICAgICAgICAgICAgIHVuaW9uQm91bmRzLnVuaXRlKGNoaWxk
VW5pb25Cb3VuZHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgVmVj
dG9yPFJlbmRlckxheWVyKj4qIG92ZXJmbG93TGlzdCA9IGxheWVyLT5vdmVyZmxvd0xpc3QoKTsK
KyAgICBpZiAob3ZlcmZsb3dMaXN0KSB7CisgICAgICAgIGZvciAoVmVjdG9yPFJlbmRlckxheWVy
Kj46Oml0ZXJhdG9yIGl0ID0gb3ZlcmZsb3dMaXN0LT5iZWdpbigpOyBpdCAhPSBvdmVyZmxvd0xp
c3QtPmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBSZW5kZXJMYXllciogY3VyTGF5ZXIgPSAo
Kml0KTsKKyAgICAgICAgICAgIGlmICghY3VyTGF5ZXItPmlzQ29tcG9zaXRlZCgpKSB7CisgICAg
ICAgICAgICAgICAgSW50UmVjdCBjdXJBYnNCb3VuZHMgPSBjYWxjdWxhdGVDb21wb3NpdGVkQm91
bmRzKGN1ckxheWVyLCBsYXllcik7CisgICAgICAgICAgICAgICAgdW5pb25Cb3VuZHMudW5pdGUo
Y3VyQWJzQm91bmRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlm
ICghbGF5ZXItPmlzQ29tcG9zaXRlZCgpICYmIGxheWVyLT50cmFuc2Zvcm0oKSkgeworICAgICAg
ICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCogYWZmaW5lVHJhbnMgPSBsYXllci0+dHJhbnNmb3JtKCk7
CisgICAgICAgIGJvdW5kaW5nQm94UmVjdCA9IGFmZmluZVRyYW5zLT5tYXBSZWN0KGJvdW5kaW5n
Qm94UmVjdCk7CisgICAgICAgIHVuaW9uQm91bmRzID0gYWZmaW5lVHJhbnMtPm1hcFJlY3QodW5p
b25Cb3VuZHMpOworICAgIH0KKworICAgIGludCBhbmNlc3RvclJlbFggPSAwLCBhbmNlc3RvclJl
bFkgPSAwOworICAgIGxheWVyLT5jb252ZXJ0VG9MYXllckNvb3JkcyhhbmNlc3RvckxheWVyLCBh
bmNlc3RvclJlbFgsIGFuY2VzdG9yUmVsWSk7CisgICAgdW5pb25Cb3VuZHMubW92ZShhbmNlc3Rv
clJlbFgsIGFuY2VzdG9yUmVsWSk7CisKKyAgICBpZiAobGF5ZXJCb3VuZGluZ0JveCkgeworICAg
ICAgICBib3VuZGluZ0JveFJlY3QubW92ZShhbmNlc3RvclJlbFgsIGFuY2VzdG9yUmVsWSk7Cisg
ICAgICAgICpsYXllckJvdW5kaW5nQm94ID0gYm91bmRpbmdCb3hSZWN0OworICAgIH0KKyAgICAK
KyAgICByZXR1cm4gdW5pb25Cb3VuZHM7Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJDb21wb3NpdG9y
OjpsYXllcldhc0FkZGVkKFJlbmRlckxheWVyKiAvKnBhcmVudCovLCBSZW5kZXJMYXllciogLypj
aGlsZCovKQoreworICAgIHNldENvbXBvc2l0aW5nTGF5ZXJzTmVlZFVwZGF0ZSgpOworfQorCit2
b2lkIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6bGF5ZXJXaWxsQmVSZW1vdmVkKFJlbmRlckxheWVy
KiBwYXJlbnQsIFJlbmRlckxheWVyKiBjaGlsZCkKK3sKKyAgICBpZiAoY2hpbGQtPmlzQ29tcG9z
aXRlZCgpKQorICAgICAgICBzZXRDb21wb3NpdGluZ1BhcmVudChjaGlsZCwgMCk7CisgICAgCisg
ICAgUmVuZGVyTGF5ZXIqIGNvbXBMYXllciA9IGVuY2xvc2luZ0NvbXBvc2l0aW5nTGF5ZXIocGFy
ZW50LCBmYWxzZSk7CisgICAgaWYgKGNvbXBMYXllcikgeworICAgICAgICBJbnRSZWN0IGFuY2Vz
dG9yUmVjdCA9IGNhbGN1bGF0ZUNvbXBvc2l0ZWRCb3VuZHMoY2hpbGQsIGNvbXBMYXllcik7Cisg
ICAgICAgIGNvbXBMYXllci0+c2V0TmVlZHNSZXBhaW50SW5SZWN0KGFuY2VzdG9yUmVjdCk7Cisg
ICAgICAgIC8vIFRoZSBjb250ZW50cyBvZiB0aGlzIGxheWVyIG1heSBiZSBtb3ZpbmcgZnJvbSBh
IEdyYXBoaWNzTGF5ZXIgdG8gdGhlIHdpbmRvdywKKyAgICAgICAgLy8gc28gd2UgbmVlZCB0byBt
YWtlIHN1cmUgdGhlIHdpbmRvdyBzeXN0ZW0gc3luY2hyb25pemVzIHRob3NlIGNoYW5nZXMgb24g
dGhlIHNjcmVlbi4KKyAgICAgICAgbV9yZW5kZXJWaWV3LT5mcmFtZVZpZXcoKS0+c2V0TmVlZHNT
eW5jaHJvbml6ZWRHcmFwaGljc0ZsdXNoKCk7CisgICAgfQorCisgICAgc2V0Q29tcG9zaXRpbmdM
YXllcnNOZWVkVXBkYXRlKCk7Cit9CisKK1JlbmRlckxheWVyKiBSZW5kZXJMYXllckNvbXBvc2l0
b3I6OmVuY2xvc2luZ0NvbXBvc2l0aW5nTGF5ZXIoUmVuZGVyTGF5ZXIqIGxheWVyLCBib29sIGlu
Y2x1ZGVTZWxmKSBjb25zdAoreworICAgIGlmIChpbmNsdWRlU2VsZiAmJiBsYXllci0+aXNDb21w
b3NpdGVkKCkpCisgICAgICAgIHJldHVybiBsYXllcjsKKworICAgIGJvb2wgY2hpbGRPdmVyZmxv
d09ubHkgPSBsYXllci0+aXNPdmVyZmxvd09ubHkoKTsKKyAgICBmb3IgKFJlbmRlckxheWVyKiBj
dXJyID0gbGF5ZXItPnBhcmVudCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+cGFyZW50KCkpIHsKKyAg
ICAgICAgLy8gQ29tcG9zaXRpbmcgbGF5ZXJzIGFyZSBwYXJlbnRlZCBhY2NvcmRpbmcgdG8gc3Rh
Y2tpbmcgb3JkZXIgYW5kIG92ZXJmbG93IGxpc3QsCisgICAgICAgIC8vIHNvIHdlIGhhdmUgdG8g
Y2hlY2sgd2hldGhlciB0aGUgcGFyZW50IGlzIGEgc3RhY2tpbmcgY29udGV4dCwgb3Igd2hldGhl
ciAKKyAgICAgICAgLy8gdGhlIGNoaWxkIGlzIG92ZXJmbG93LW9ubHkuCisgICAgICAgIGlmIChj
dXJyLT5pc0NvbXBvc2l0ZWQoKSAmJiAoY2hpbGRPdmVyZmxvd09ubHkgfHwgY3Vyci0+aXNTdGFj
a2luZ0NvbnRleHQoKSkpCisgICAgICAgICAgICByZXR1cm4gY3VycjsKKyAgICAgICAgCisgICAg
ICAgIGNoaWxkT3ZlcmZsb3dPbmx5ID0gY3Vyci0+aXNPdmVyZmxvd09ubHkoKTsKKyAgICB9Cisg
ICAgICAgICAKKyAgICByZXR1cm4gMDsKK30KKworUmVuZGVyTGF5ZXIqIFJlbmRlckxheWVyQ29t
cG9zaXRvcjo6ZW5jbG9zaW5nTm9uU3RhY2tpbmdDbGlwcGluZ0xheWVyKGNvbnN0IFJlbmRlckxh
eWVyKiBsYXllcikgY29uc3QKK3sKKyAgICBmb3IgKFJlbmRlckxheWVyKiBjdXJyID0gbGF5ZXIt
PnBhcmVudCgpOyBjdXJyICE9IDA7IGN1cnIgPSBjdXJyLT5wYXJlbnQoKSkgeworICAgICAgICBp
ZiAoY3Vyci0+aXNTdGFja2luZ0NvbnRleHQoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisg
ICAgICAgIGlmIChjdXJyLT5yZW5kZXJlcigpLT5oYXNPdmVyZmxvd0NsaXAoKSkKKyAgICAgICAg
ICAgIHJldHVybiBjdXJyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLy8gIFJlY3Vyc2Ug
dGhyb3VnaCB0aGUgbGF5ZXJzIGluIHotaW5kZXggYW5kIG92ZXJmbG93IG9yZGVyICh3aGljaCBp
cyBlcXVpdmFsZW50IHRvIHBhaW50aW5nIG9yZGVyKQorLy8gIEZvciB0aGUgei1vcmRlciBjaGls
ZHJlbiBvZiBhIGNvbXBvc2l0aW5nIGxheWVyOgorLy8gICAgICBJZiBhIGNoaWxkIGxheWVycyBo
YXMgYSBjb21wb3NpdGluZyBsYXllciwgdGhlbiBhbGwgc3Vic2VxdWVudCBsYXllcnMgbXVzdAor
Ly8gICAgICBiZSBjb21wb3NpdGluZyBpbiBvcmRlciB0byByZW5kZXIgYWJvdmUgdGhhdCBsYXll
ci4KKy8vCisvLyAgICAgIElmIGEgY2hpbGQgaW4gdGhlIG5lZ2F0aXZlIHotb3JkZXIgbGlzdCBp
cyBjb21wb3NpdGluZywgdGhlbiB0aGUgbGF5ZXIgaXRzZWxmCisvLyAgICAgIG11c3QgYmUgY29t
cG9zaXRpbmcgc28gdGhhdCBpdHMgY29udGVudHMgcmVuZGVyIG92ZXIgdGhhdCBjaGlsZC4KKy8v
ICAgICAgVGhpcyBpbXBsaWVzIHRoYXQgaXRzIHBvc2l0aXZlIHotaW5kZXggY2hpbGRyZW4gbXVz
dCBhbHNvIGJlIGNvbXBvc2l0aW5nLgorLy8KK3ZvaWQgUmVuZGVyTGF5ZXJDb21wb3NpdG9yOjpj
b21wdXRlQ29tcG9zaXRpbmdSZXF1aXJlbWVudHMoUmVuZGVyTGF5ZXIqIGxheWVyLCBzdHJ1Y3Qg
Q29tcG9zaXRpbmdTdGF0ZSYgaW9Db21wU3RhdGUpCit7CisgICAgLy8gTWFrZSBzdXJlIHRoaXMg
bGF5ZXIncyB6LW9yZGVyIGFuZCBvdmVyZmxvdyBsaXN0cyBhcmUgdXAgdG8gZGF0ZQorICAgIGxh
eWVyLT51cGRhdGVUaGlzTGF5ZXIoKTsKKyAgICAKKyAgICAvLyBDbGVhciB0aGUgZmxhZworICAg
IGxheWVyLT5zZXRIYXNDb21wb3NpdGluZ0Rlc2NlbmRhbnQoZmFsc2UpOworCisgICAgc2V0Rm9y
Y2VkQ29tcG9zaXRpbmdMYXllcihsYXllciwgaW9Db21wU3RhdGUubV9zdWJ0cmVlSXNDb21wb3Np
dGluZyk7CisgICAgCisgICAgY29uc3QgYm9vbCBpc0NvbXBvc2l0aW5nTGF5ZXIgPSBuZWVkc1Rv
QmVDb21wb3NpdGVkKGxheWVyKTsKKyAgICBpb0NvbXBTdGF0ZS5tX3N1YnRyZWVJc0NvbXBvc2l0
aW5nID0gaXNDb21wb3NpdGluZ0xheWVyOworCisgICAgQ29tcG9zaXRpbmdTdGF0ZSBjaGlsZFN0
YXRlID0gaW9Db21wU3RhdGU7CisgICAgaWYgKGlzQ29tcG9zaXRpbmdMYXllcikKKyAgICAgICAg
Y2hpbGRTdGF0ZS5tX2NvbXBvc2l0aW5nQW5jZXN0b3IgPSBsYXllcjsKKworICAgIC8vIFRoZSBj
aGlsZHJlbiBvZiB0aGlzIHN0YWNraW5nIGNvbnRleHQgZG9uJ3QgbmVlZCB0byBjb21wb3NpdGUs
IHVubGVzcyB0aGVyZSBpcworICAgIC8vIGEgY29tcG9zaXRpbmcgbGF5ZXIgYW1vbmcgdGhlbSwg
c28gc3RhcnQgYnkgYXNzdW1pbmcgZmFsc2UuCisgICAgY2hpbGRTdGF0ZS5tX3N1YnRyZWVJc0Nv
bXBvc2l0aW5nID0gZmFsc2U7CisKKyNpZm5kZWYgTkRFQlVHCisgICAgKytjaGlsZFN0YXRlLm1f
ZGVwdGg7CisjZW5kaWYKKworICAgIGlmIChsYXllci0+aXNTdGFja2luZ0NvbnRleHQoKSkgewor
ICAgICAgICBBU1NFUlQoIWxheWVyLT5tX3pPcmRlckxpc3RzRGlydHkpOworICAgICAgICBWZWN0
b3I8UmVuZGVyTGF5ZXIqPiogbmVnWk9yZGVyTGlzdCA9IGxheWVyLT5uZWdaT3JkZXJMaXN0KCk7
CisgICAgICAgIGlmIChuZWdaT3JkZXJMaXN0ICYmIG5lZ1pPcmRlckxpc3QtPnNpemUoKSA+IDAp
IHsKKyAgICAgICAgICAgIGZvciAoVmVjdG9yPFJlbmRlckxheWVyKj46OmNvbnN0X2l0ZXJhdG9y
IGl0ID0gbmVnWk9yZGVyTGlzdC0+YmVnaW4oKTsgaXQgIT0gbmVnWk9yZGVyTGlzdC0+ZW5kKCk7
ICsraXQpIHsKKyAgICAgICAgICAgICAgICBSZW5kZXJMYXllciogY3VyTGF5ZXIgPSAoKml0KTsK
KyAgICAgICAgICAgICAgICBjb21wdXRlQ29tcG9zaXRpbmdSZXF1aXJlbWVudHMoY3VyTGF5ZXIs
IGNoaWxkU3RhdGUpOworCisgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSB0byBtYWtlIGEg
bGF5ZXIgZm9yIHRoaXMgY2hpbGQsIG1ha2Ugb25lIG5vdyBzbyB3ZSBjYW4gaGF2ZSBhIGNvbnRl
bnRzIGxheWVyCisgICAgICAgICAgICAgICAgLy8gKHNpbmNlIHdlIG5lZWQgdG8gZW5zdXJlIHRo
YXQgdGhlIC12ZSB6LW9yZGVyIGNoaWxkIHJlbmRlcnMgdW5kZXJuZWF0aCBvdXIgY29udGVudHMp
CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkU3RhdGUubV9zdWJ0cmVlSXNDb21wb3NpdGluZykg
eworICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHx0aGlzfCBjb21wb3NpdGluZworICAgICAg
ICAgICAgICAgICAgICBzZXRGb3JjZWRDb21wb3NpdGluZ0xheWVyKGxheWVyLCB0cnVlKTsKKyAg
ICAgICAgICAgICAgICAgICAgY2hpbGRTdGF0ZS5tX2NvbXBvc2l0aW5nQW5jZXN0b3IgPSBsYXll
cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cisg
ICAgCisgICAgQVNTRVJUKCFsYXllci0+bV9vdmVyZmxvd0xpc3REaXJ0eSk7CisgICAgVmVjdG9y
PFJlbmRlckxheWVyKj4qIG92ZXJmbG93TGlzdCA9IGxheWVyLT5vdmVyZmxvd0xpc3QoKTsKKyAg
ICBpZiAob3ZlcmZsb3dMaXN0ICYmIG92ZXJmbG93TGlzdC0+c2l6ZSgpID4gMCkgeworICAgICAg
ICBmb3IgKFZlY3RvcjxSZW5kZXJMYXllcio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG92ZXJmbG93
TGlzdC0+YmVnaW4oKTsgaXQgIT0gb3ZlcmZsb3dMaXN0LT5lbmQoKTsgKytpdCkgeworICAgICAg
ICAgICAgUmVuZGVyTGF5ZXIqIGN1ckxheWVyID0gKCppdCk7CisgICAgICAgICAgICBjb21wdXRl
Q29tcG9zaXRpbmdSZXF1aXJlbWVudHMoY3VyTGF5ZXIsIGNoaWxkU3RhdGUpOworICAgICAgICB9
CisgICAgfQorCisgICAgaWYgKGxheWVyLT5pc1N0YWNraW5nQ29udGV4dCgpKSB7CisgICAgICAg
IFZlY3RvcjxSZW5kZXJMYXllcio+KiBwb3NaT3JkZXJMaXN0ID0gbGF5ZXItPnBvc1pPcmRlckxp
c3QoKTsKKyAgICAgICAgaWYgKHBvc1pPcmRlckxpc3QgJiYgcG9zWk9yZGVyTGlzdC0+c2l6ZSgp
ID4gMCkgeworICAgICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyTGF5ZXIqPjo6Y29uc3RfaXRl
cmF0b3IgaXQgPSBwb3NaT3JkZXJMaXN0LT5iZWdpbigpOyBpdCAhPSBwb3NaT3JkZXJMaXN0LT5l
bmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIFJlbmRlckxheWVyKiBjdXJMYXllciA9ICgq
aXQpOworICAgICAgICAgICAgICAgIGNvbXB1dGVDb21wb3NpdGluZ1JlcXVpcmVtZW50cyhjdXJM
YXllciwgY2hpbGRTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICAvLyBJZiB3ZSBoYXZlIGEgc29mdHdhcmUgdHJhbnNmb3JtLCBhbmQgd2UgaGF2ZSBsYXllcnMg
dW5kZXIgdXMsIHdlIG5lZWQgdG8gYWxzbworICAgIC8vIGJlIGNvbXBvc2l0ZWQuIEFsc28sIGlm
IHdlIGhhdmUgb3BhY2l0eSA8IDEsIHRoZW4gd2UgbmVlZCB0byBiZSBhIGxheWVyIHNvIHRoYXQK
KyAgICAvLyB0aGUgY2hpbGQgbGF5ZXJzIGFyZSBvcGFxdWUsIHRoZW4gcmVuZGVyZWQgd2l0aCBv
cGFjaXR5IG9uIHRoaXMgbGF5ZXIuCisgICAgaWYgKGNoaWxkU3RhdGUubV9zdWJ0cmVlSXNDb21w
b3NpdGluZyAmJgorICAgICAgICAobGF5ZXItPnJlbmRlcmVyKCktPnN0eWxlKCktPmhhc1RyYW5z
Zm9ybSgpIHx8IGxheWVyLT5yZW5kZXJlcigpLT5zdHlsZSgpLT5vcGFjaXR5KCkgPCAxKSkKKyAg
ICAgICAgc2V0Rm9yY2VkQ29tcG9zaXRpbmdMYXllcihsYXllciwgdHJ1ZSk7CisKKyAgICAvLyBT
dWJzZXF1ZW50IGxheWVycyBpbiB0aGUgcGFyZW50IHN0YWNraW5nIGNvbnRleHQgYWxzbyBuZWVk
IHRvIGNvbXBvc2l0ZS4KKyAgICBpZiAoY2hpbGRTdGF0ZS5tX3N1YnRyZWVJc0NvbXBvc2l0aW5n
KQorICAgICAgICBpb0NvbXBTdGF0ZS5tX3N1YnRyZWVJc0NvbXBvc2l0aW5nID0gdHJ1ZTsKKwor
ICAgIC8vIFNldCB0aGUgZmxhZyB0byBzYXkgdGhhdCB0aGlzIFNDIGhhcyBjb21wb3NpdGluZyBj
aGlsZHJlbi4KKyAgICAvLyB0aGlzIGNhbiBhZmZlY3QgdGhlIGFuc3dlciB0byBuZWVkc1RvQmVD
b21wb3NpdGVkKCkgd2hlbiBjbGlwcGluZywKKyAgICAvLyBidXQgdGhhdCdzIG9rIGhlcmUuCisg
ICAgbGF5ZXItPnNldEhhc0NvbXBvc2l0aW5nRGVzY2VuZGFudChjaGlsZFN0YXRlLm1fc3VidHJl
ZUlzQ29tcG9zaXRpbmcpOworfQorCit2b2lkIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6c2V0Rm9y
Y2VkQ29tcG9zaXRpbmdMYXllcihSZW5kZXJMYXllciogbGF5ZXIsIGJvb2wgZm9yY2UpCit7Cisg
ICAgaWYgKGZvcmNlKSB7CisgICAgICAgIGxheWVyLT5lbnN1cmVCYWNraW5nKCk7CisgICAgICAg
IGxheWVyLT5iYWNraW5nKCktPmZvcmNlQ29tcG9zaXRpbmdMYXllcigpOworICAgIH0gZWxzZSB7
CisgICAgICAgIGlmIChsYXllci0+YmFja2luZygpKQorICAgICAgICAgICAgbGF5ZXItPmJhY2tp
bmcoKS0+Zm9yY2VDb21wb3NpdGluZ0xheWVyKGZhbHNlKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVu
ZGVyTGF5ZXJDb21wb3NpdG9yOjpzZXRDb21wb3NpdGluZ1BhcmVudChSZW5kZXJMYXllciogY2hp
bGRMYXllciwgUmVuZGVyTGF5ZXIqIHBhcmVudExheWVyKQoreworICAgIEFTU0VSVChjaGlsZExh
eWVyLT5pc0NvbXBvc2l0ZWQoKSk7CisgICAgQVNTRVJUKCFwYXJlbnRMYXllciB8fCBwYXJlbnRM
YXllci0+aXNDb21wb3NpdGVkKCkpOworICAgIAorICAgIGlmIChwYXJlbnRMYXllcikgeworICAg
ICAgICBHcmFwaGljc0xheWVyKiBob3N0aW5nTGF5ZXIgPSBwYXJlbnRMYXllci0+YmFja2luZygp
LT5wYXJlbnRGb3JTdWJsYXllcnMoKTsKKyAgICAgICAgR3JhcGhpY3NMYXllciogaG9zdGVkTGF5
ZXIgPSBjaGlsZExheWVyLT5iYWNraW5nKCktPmNoaWxkRm9yU3VwZXJsYXllcnMoKTsKKyAgICAg
ICAgCisgICAgICAgIGhvc3RpbmdMYXllci0+YWRkQ2hpbGQoaG9zdGVkTGF5ZXIpOworICAgIH0g
ZWxzZQorICAgICAgICBjaGlsZExheWVyLT5iYWNraW5nKCktPmNoaWxkRm9yU3VwZXJsYXllcnMo
KS0+cmVtb3ZlRnJvbVBhcmVudCgpOworICAgIAorICAgIC8vIEZJWE1FOiBzZXRDb21wb3NpdGlu
Z1BhcmVudCgpIGlzIG9ubHkgY2FsbGVkIGF0IHByZXNlbnQgYnkgcmVidWlsZENvbXBvc2l0aW5n
TGF5ZXJUcmVlKCksCisgICAgLy8gd2hpY2ggY2FsbHMgdXBkYXRlR3JhcGhpY3NMYXllckdlb21l
dHJ5IHZpYSB1cGRhdGVMYXllckNvbXBvc2l0aW5nU3RhdGUoKSwgc28gdGhpcyBzaG91bGQKKyAg
ICAvLyBiZSBvcHRpbWl6ZWQuCisgICAgaWYgKHBhcmVudExheWVyKQorICAgICAgICBjaGlsZExh
eWVyLT5iYWNraW5nKCktPnVwZGF0ZUdyYXBoaWNzTGF5ZXJHZW9tZXRyeSgpOworfQorCit2b2lk
IFJlbmRlckxheWVyQ29tcG9zaXRvcjo6cmVtb3ZlQ29tcG9zaXRlZENoaWxkcmVuKFJlbmRlckxh
eWVyKiBsYXllcikKK3sKKyAgICBBU1NFUlQobGF5ZXItPmlzQ29tcG9zaXRlZCgpKTsKKworICAg
IEdyYXBoaWNzTGF5ZXIqIGhvc3RpbmdMYXllciA9IGxheWVyLT5iYWNraW5nKCktPnBhcmVudEZv
clN1YmxheWVycygpOworICAgIGhvc3RpbmdMYXllci0+cmVtb3ZlQWxsQ2hpbGRyZW4oKTsKK30K
Kwordm9pZCBSZW5kZXJMYXllckNvbXBvc2l0b3I6OnBhcmVudEluUm9vdExheWVyKFJlbmRlckxh
eWVyKiBsYXllcikKK3sKKyAgICBBU1NFUlQobGF5ZXItPmlzQ29tcG9zaXRlZCgpKTsKKworICAg
IEdyYXBoaWNzTGF5ZXIqIGxheWVyQW5jaG9yID0gbGF5ZXItPmJhY2tpbmcoKS0+Y2hpbGRGb3JT
dXBlcmxheWVycygpOworCisgICAgaWYgKGxheWVyQW5jaG9yLT5wYXJlbnQoKSAhPSBtX3Jvb3RQ
bGF0Zm9ybUxheWVyKSB7CisgICAgICAgIGxheWVyQW5jaG9yLT5yZW1vdmVGcm9tUGFyZW50KCk7
CisgICAgICAgIGlmIChtX3Jvb3RQbGF0Zm9ybUxheWVyKQorICAgICAgICAgICAgbV9yb290UGxh
dGZvcm1MYXllci0+YWRkQ2hpbGQobGF5ZXJBbmNob3IpOworICAgIH0KK30KKwordm9pZCBSZW5k
ZXJMYXllckNvbXBvc2l0b3I6OnJlYnVpbGRDb21wb3NpdGluZ0xheWVyVHJlZShSZW5kZXJMYXll
ciogbGF5ZXIsIHN0cnVjdCBDb21wb3NpdGluZ1N0YXRlJiBpb0NvbXBTdGF0ZSkKK3sKKyAgICB1
cGRhdGVMYXllckNvbXBvc2l0aW5nU3RhdGUobGF5ZXIsIFJlbmRlclN0eWxlOjpFcXVhbCk7CisK
KyAgICAvLyBob3N0IHRoZSBkb2N1bWVudCBsYXllciBpbiB0aGUgUmVuZGVyVmlldydzIHJvb3Qg
bGF5ZXIKKyAgICBpZiAobGF5ZXItPmlzRG9jdW1lbnRMYXllcigpKQorICAgICAgICBwYXJlbnRJ
blJvb3RMYXllcihsYXllcik7CisKKyAgICBDb21wb3NpdGluZ1N0YXRlIGNoaWxkU3RhdGUgPSBp
b0NvbXBTdGF0ZTsKKyAgICBpZiAobGF5ZXItPmlzQ29tcG9zaXRlZCgpKQorICAgICAgICBjaGls
ZFN0YXRlLm1fY29tcG9zaXRpbmdBbmNlc3RvciA9IGxheWVyOworCisjaWZuZGVmIE5ERUJVRwor
ICAgICsrY2hpbGRTdGF0ZS5tX2RlcHRoOworI2VuZGlmCisKKyAgICBSZW5kZXJMYXllckJhY2tp
bmcqIGxheWVyQmFja2luZyA9IGxheWVyLT5iYWNraW5nKCk7CisgICAgCisgICAgLy8gRklYTUU6
IG1ha2UgdGhpcyBtb3JlIGluY3JlbWVudGFsCisgICAgaWYgKGxheWVyLT5pc0NvbXBvc2l0ZWQo
KSkgeworICAgICAgICBsYXllckJhY2tpbmctPnBhcmVudEZvclN1YmxheWVycygpLT5yZW1vdmVB
bGxDaGlsZHJlbigpOworICAgICAgICBsYXllckJhY2tpbmctPnVwZGF0ZUludGVybmFsSGllcmFy
Y2h5KCk7CisgICAgfQorICAgIAorICAgIC8vIFRoZSBjaGlsZHJlbiBvZiB0aGlzIHN0YWNraW5n
IGNvbnRleHQgZG9uJ3QgbmVlZCB0byBjb21wb3NpdGUsIHVubGVzcyB0aGVyZSBpcworICAgIC8v
IGEgY29tcG9zaXRpbmcgbGF5ZXIgYW1vbmcgdGhlbSwgc28gc3RhcnQgYnkgYXNzdW1pbmcgZmFs
c2UuCisgICAgY2hpbGRTdGF0ZS5tX3N1YnRyZWVJc0NvbXBvc2l0aW5nID0gZmFsc2U7CisKKyAg
ICBpZiAobGF5ZXItPmlzU3RhY2tpbmdDb250ZXh0KCkpIHsKKyAgICAgICAgQVNTRVJUKCFsYXll
ci0+bV96T3JkZXJMaXN0c0RpcnR5KTsKKworICAgICAgICBWZWN0b3I8UmVuZGVyTGF5ZXIqPiog
bmVnWk9yZGVyTGlzdCA9IGxheWVyLT5uZWdaT3JkZXJMaXN0KCk7CisgICAgICAgIGlmIChuZWda
T3JkZXJMaXN0ICYmIG5lZ1pPcmRlckxpc3QtPnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZv
ciAoVmVjdG9yPFJlbmRlckxheWVyKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbmVnWk9yZGVyTGlz
dC0+YmVnaW4oKTsgaXQgIT0gbmVnWk9yZGVyTGlzdC0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAg
ICAgICAgICBSZW5kZXJMYXllciogY3VyTGF5ZXIgPSAoKml0KTsKKyAgICAgICAgICAgICAgICBy
ZWJ1aWxkQ29tcG9zaXRpbmdMYXllclRyZWUoY3VyTGF5ZXIsIGNoaWxkU3RhdGUpOworICAgICAg
ICAgICAgICAgIGlmIChjdXJMYXllci0+aXNDb21wb3NpdGVkKCkpCisgICAgICAgICAgICAgICAg
ICAgIHNldENvbXBvc2l0aW5nUGFyZW50KGN1ckxheWVyLCBjaGlsZFN0YXRlLm1fY29tcG9zaXRp
bmdBbmNlc3Rvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobGF5
ZXJCYWNraW5nICYmIGxheWVyQmFja2luZy0+Y29udGVudHNMYXllcigpKSB7CisgICAgICAgICAg
ICAvLyB3ZSBvbmx5IGhhdmUgYSBjb250ZW50cyBsYXllciBpZiB3ZSBoYXZlIGFuIG1fbGF5ZXIK
KyAgICAgICAgICAgIGxheWVyQmFja2luZy0+Y29udGVudHNMYXllcigpLT5yZW1vdmVGcm9tUGFy
ZW50KCk7CisKKyAgICAgICAgICAgIEdyYXBoaWNzTGF5ZXIqIGhvc3RpbmdMYXllciA9IGxheWVy
QmFja2luZy0+Y2xpcHBpbmdMYXllcigpID8gbGF5ZXJCYWNraW5nLT5jbGlwcGluZ0xheWVyKCkg
OiBsYXllckJhY2tpbmctPmdyYXBoaWNzTGF5ZXIoKTsKKyAgICAgICAgICAgIGhvc3RpbmdMYXll
ci0+YWRkQ2hpbGQobGF5ZXJCYWNraW5nLT5jb250ZW50c0xheWVyKCkpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgQVNTRVJUKCFsYXllci0+bV9vdmVyZmxvd0xpc3REaXJ0eSk7CisgICAgVmVj
dG9yPFJlbmRlckxheWVyKj4qIG92ZXJmbG93TGlzdCA9IGxheWVyLT5vdmVyZmxvd0xpc3QoKTsK
KyAgICBpZiAob3ZlcmZsb3dMaXN0ICYmIG92ZXJmbG93TGlzdC0+c2l6ZSgpID4gMCkgeworICAg
ICAgICBmb3IgKFZlY3RvcjxSZW5kZXJMYXllcio+OjppdGVyYXRvciBpdCA9IG92ZXJmbG93TGlz
dC0+YmVnaW4oKTsgaXQgIT0gb3ZlcmZsb3dMaXN0LT5lbmQoKTsgKytpdCkgeworICAgICAgICAg
ICAgUmVuZGVyTGF5ZXIqIGN1ckxheWVyID0gKCppdCk7CisgICAgICAgICAgICByZWJ1aWxkQ29t
cG9zaXRpbmdMYXllclRyZWUoY3VyTGF5ZXIsIGNoaWxkU3RhdGUpOworICAgICAgICAgICAgaWYg
KGN1ckxheWVyLT5pc0NvbXBvc2l0ZWQoKSkKKyAgICAgICAgICAgICAgICBzZXRDb21wb3NpdGlu
Z1BhcmVudChjdXJMYXllciwgY2hpbGRTdGF0ZS5tX2NvbXBvc2l0aW5nQW5jZXN0b3IpOworICAg
ICAgICB9CisgICAgfQorICAgIAorICAgIGlmIChsYXllci0+aXNTdGFja2luZ0NvbnRleHQoKSkg
eworICAgICAgICBWZWN0b3I8UmVuZGVyTGF5ZXIqPiogcG9zWk9yZGVyTGlzdCA9IGxheWVyLT5w
b3NaT3JkZXJMaXN0KCk7CisgICAgICAgIGlmIChwb3NaT3JkZXJMaXN0ICYmIHBvc1pPcmRlckxp
c3QtPnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoVmVjdG9yPFJlbmRlckxheWVyKj46
OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcG9zWk9yZGVyTGlzdC0+YmVnaW4oKTsgaXQgIT0gcG9zWk9y
ZGVyTGlzdC0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBSZW5kZXJMYXllciogY3Vy
TGF5ZXIgPSAoKml0KTsKKyAgICAgICAgICAgICAgICByZWJ1aWxkQ29tcG9zaXRpbmdMYXllclRy
ZWUoY3VyTGF5ZXIsIGNoaWxkU3RhdGUpOworICAgICAgICAgICAgICAgIGlmIChjdXJMYXllci0+
aXNDb21wb3NpdGVkKCkpCisgICAgICAgICAgICAgICAgICAgIHNldENvbXBvc2l0aW5nUGFyZW50
KGN1ckxheWVyLCBjaGlsZFN0YXRlLm1fY29tcG9zaXRpbmdBbmNlc3Rvcik7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHJlcGFpbnQgdGhlIGdpdmVuIHJlY3QgaW4g
dGhpcyBsYXllciwgYW5kIG9wdGlvbmFsbHkgdGhlIHJlY3QgaW4gYWxsIGNoaWxkIGxheWVycwor
dm9pZCBSZW5kZXJMYXllckNvbXBvc2l0b3I6OnJlcGFpbnRDb21wb3NpdGluZ0xheWVyUmVjdChS
ZW5kZXJMYXllciogbGF5ZXIsIGNvbnN0IEludFJlY3QmIGluUmVjdCwgYm9vbCBpbmNsdWRlRGVz
Y2VuZGFudHMpCit7CisgICAgaWYgKGxheWVyLT5pc0NvbXBvc2l0ZWQoKSkKKyAgICAgICAgbGF5
ZXItPmJhY2tpbmcoKS0+c2V0Q29udGVudHNOZWVkRGlzcGxheUluUmVjdChpblJlY3QpOworCisg
ICAgaWYgKGxheWVyLT5oYXNDb21wb3NpdGluZ0Rlc2NlbmRhbnQoKSAmJiBpbmNsdWRlRGVzY2Vu
ZGFudHMpIHsKKyAgICAgICAgQVNTRVJUKGxheWVyLT5pc1N0YWNraW5nQ29udGV4dCgpIHx8ICgh
bGF5ZXItPm1fcG9zWk9yZGVyTGlzdCB8fCBsYXllci0+bV9wb3NaT3JkZXJMaXN0LT5zaXplKCkg
PT0gMCkpOworCisgICAgICAgIFZlY3RvcjxSZW5kZXJMYXllcio+KiBuZWdaT3JkZXJMaXN0ID0g
bGF5ZXItPm5lZ1pPcmRlckxpc3QoKTsKKyAgICAgICAgaWYgKG5lZ1pPcmRlckxpc3QpIHsKKyAg
ICAgICAgICAgIGZvciAoVmVjdG9yPFJlbmRlckxheWVyKj46Oml0ZXJhdG9yIGl0ID0gbmVnWk9y
ZGVyTGlzdC0+YmVnaW4oKTsgaXQgIT0gbmVnWk9yZGVyTGlzdC0+ZW5kKCk7ICsraXQpIHsKKyAg
ICAgICAgICAgICAgICBSZW5kZXJMYXllciogY3VyTGF5ZXIgPSAoKml0KTsKKyAgICAgICAgICAg
ICAgICBpbnQgeCA9IDAsIHkgPSAwOworICAgICAgICAgICAgICAgIGN1ckxheWVyLT5jb252ZXJ0
VG9MYXllckNvb3JkcyhsYXllciwgeCwgeSk7CisgICAgICAgICAgICAgICAgSW50UmVjdCBjaGls
ZFJlY3QoaW5SZWN0KTsKKyAgICAgICAgICAgICAgICBjaGlsZFJlY3QubW92ZSgteCwgLXkpOwor
ICAgICAgICAgICAgICAgIHJlcGFpbnRDb21wb3NpdGluZ0xheWVyUmVjdChjdXJMYXllciwgY2hp
bGRSZWN0LCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFZlY3Rv
cjxSZW5kZXJMYXllcio+KiBwb3NaT3JkZXJMaXN0ID0gbGF5ZXItPnBvc1pPcmRlckxpc3QoKTsK
KyAgICAgICAgaWYgKHBvc1pPcmRlckxpc3QpIHsKKyAgICAgICAgICAgIGZvciAoVmVjdG9yPFJl
bmRlckxheWVyKj46Oml0ZXJhdG9yIGl0ID0gcG9zWk9yZGVyTGlzdC0+YmVnaW4oKTsgaXQgIT0g
cG9zWk9yZGVyTGlzdC0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBSZW5kZXJMYXll
ciogY3VyTGF5ZXIgPSAoKml0KTsKKyAgICAgICAgICAgICAgICBpbnQgeCA9IDAsIHkgPSAwOwor
ICAgICAgICAgICAgICAgIGN1ckxheWVyLT5jb252ZXJ0VG9MYXllckNvb3JkcyhsYXllciwgeCwg
eSk7CisgICAgICAgICAgICAgICAgSW50UmVjdCBjaGlsZFJlY3QoaW5SZWN0KTsKKyAgICAgICAg
ICAgICAgICBjaGlsZFJlY3QubW92ZSgteCwgLXkpOworICAgICAgICAgICAgICAgIHJlcGFpbnRD
b21wb3NpdGluZ0xheWVyUmVjdChjdXJMYXllciwgY2hpbGRSZWN0LCB0cnVlKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgVmVjdG9yPFJlbmRlckxheWVyKj4q
IG92ZXJmbG93TGlzdCA9IGxheWVyLT5vdmVyZmxvd0xpc3QoKTsKKyAgICAgICAgaWYgKG92ZXJm
bG93TGlzdCkgeworICAgICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyTGF5ZXIqPjo6aXRlcmF0
b3IgaXQgPSBvdmVyZmxvd0xpc3QtPmJlZ2luKCk7IGl0ICE9IG92ZXJmbG93TGlzdC0+ZW5kKCk7
ICsraXQpIHsKKyAgICAgICAgICAgICAgICBSZW5kZXJMYXllciogY3VyTGF5ZXIgPSAoKml0KTsK
KyAgICAgICAgICAgICAgICBpbnQgeCA9IDAsIHkgPSAwOworICAgICAgICAgICAgICAgIGN1ckxh
eWVyLT5jb252ZXJ0VG9MYXllckNvb3JkcyhsYXllciwgeCwgeSk7CisgICAgICAgICAgICAgICAg
SW50UmVjdCBjaGlsZFJlY3QoaW5SZWN0KTsKKyAgICAgICAgICAgICAgICBjaGlsZFJlY3QubW92
ZSgteCwgLXkpOworICAgICAgICAgICAgICAgIHJlcGFpbnRDb21wb3NpdGluZ0xheWVyUmVjdChj
dXJMYXllciwgY2hpbGRSZWN0LCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
IH0KK30KKworUmVuZGVyTGF5ZXIqIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6cm9vdFJlbmRlckxh
eWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9yZW5kZXJWaWV3LT5sYXllcigpOworfQorCitH
cmFwaGljc0xheWVyKiBSZW5kZXJMYXllckNvbXBvc2l0b3I6OnJvb3RQbGF0Zm9ybUxheWVyKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gbV9yb290UGxhdGZvcm1MYXllcjsKK30KKwordm9pZCBSZW5k
ZXJMYXllckNvbXBvc2l0b3I6OndpbGxCZURldGFjaGVkKCkKK3sKKyAgICBpZiAoIW1fcm9vdFBs
YXRmb3JtTGF5ZXIgfHwhIG1fcm9vdExheWVyQXR0YWNoZWQpCisgICAgICAgIHJldHVybjsKKwor
ICAgIEZyYW1lKiBmcmFtZSA9IG1fcmVuZGVyVmlldy0+ZnJhbWVWaWV3KCktPmZyYW1lKCk7Cisg
ICAgUGFnZSogcGFnZSA9IGZyYW1lID8gZnJhbWUtPnBhZ2UoKSA6IDA7CisgICAgaWYgKCFwYWdl
KQorICAgICAgICByZXR1cm47CisKKyAgICBwYWdlLT5jaHJvbWUoKS0+Y2xpZW50KCktPmF0dGFj
aFJvb3RHcmFwaGljc0xheWVyKGZyYW1lLCAwKTsKKyAgICBtX3Jvb3RMYXllckF0dGFjaGVkID0g
ZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJDb21wb3NpdG9yOjp3YXNBdHRhY2hlZCgpCit7
CisgICAgaWYgKCFtX3Jvb3RQbGF0Zm9ybUxheWVyKQorICAgICAgICByZXR1cm47CisKKyAgICBG
cmFtZSogZnJhbWUgPSBtX3JlbmRlclZpZXctPmZyYW1lVmlldygpLT5mcmFtZSgpOworICAgIFBh
Z2UqIHBhZ2UgPSBmcmFtZSA/IGZyYW1lLT5wYWdlKCkgOiAwOworICAgIGlmICghcGFnZSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgcGFnZS0+Y2hyb21lKCktPmNsaWVudCgpLT5hdHRhY2hSb290
R3JhcGhpY3NMYXllcihmcmFtZSwgbV9yb290UGxhdGZvcm1MYXllcik7CisgICAgbV9yb290TGF5
ZXJBdHRhY2hlZCA9IHRydWU7Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJDb21wb3NpdG9yOjp1cGRh
dGVSb290TGF5ZXJQb3NpdGlvbigpCit7CisgICAgaWYgKG1fcm9vdFBsYXRmb3JtTGF5ZXIpCisg
ICAgICAgIG1fcm9vdFBsYXRmb3JtTGF5ZXItPnNldFNpemUoRmxvYXRTaXplKG1fcmVuZGVyVmll
dy0+ZG9jV2lkdGgoKSwgbV9yZW5kZXJWaWV3LT5kb2NIZWlnaHQoKSkpOworfQorCitib29sIFJl
bmRlckxheWVyQ29tcG9zaXRvcjo6bmVlZHNUb0JlQ29tcG9zaXRlZChjb25zdCBSZW5kZXJMYXll
ciogbGF5ZXIpIGNvbnN0Cit7CisgICAgcmV0dXJuIHJlcXVpcmVzQ29tcG9zaXRpbmdMYXllcihs
YXllcikgfHwgKGxheWVyLT5iYWNraW5nKCkgJiYgbGF5ZXItPmJhY2tpbmcoKS0+Zm9yY2VkQ29t
cG9zaXRpbmdMYXllcigpKTsKK30KKworc3RhdGljIGJvb2wgcmVxdWlyZXNDb21wb3NpdGluZ0xh
eWVyRm9yVHJhbnNmb3JtKGNvbnN0IFJlbmRlclN0eWxlKikKK3sKKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKKyNkZWZpbmUgVkVSQk9TRV9DT01QT1NJVElOR0xBWUVSICAgIDAKKworLy8gTm90ZTog
dGhpcyBzcGVjaWZpZXMgd2hldGhlciB0aGUgUkwgbmVlZHMgYSBjb21wb3NpdGluZyBsYXllciBm
b3IgaW50cmluc2ljIHJlYXNvbnMuCisvLyBVc2UgbmVlZHNUb0JlQ29tcG9zaXRlZCgpIHRvIGRl
dGVybWluZSBpZiBhIFJMIGFjdHVhbGx5IG5lZWRzIGEgY29tcG9zaXRpbmcgbGF5ZXIuCisvLyBz
dGF0aWMKK2Jvb2wgUmVuZGVyTGF5ZXJDb21wb3NpdG9yOjpyZXF1aXJlc0NvbXBvc2l0aW5nTGF5
ZXIoY29uc3QgUmVuZGVyTGF5ZXIqIGxheWVyKSBjb25zdAoreworICAgIC8vIFRPRE86IGNhY2hl
IHRoZSByZXN1bHQgb2YgdGhlc2UgdGVzdHM/CisgICAgY29uc3QgUmVuZGVyU3R5bGUqIHJlbmRl
clN0eWxlID0gbGF5ZXItPnJlbmRlcmVyKCktPnN0eWxlKCk7CisKKyNpZiBWRVJCT1NFX0NPTVBP
U0lUSU5HTEFZRVIKKyAgICBib29sIGdvdFJlYXNvbiA9IGZhbHNlOworCisgICAgaWYgKCFnb3RS
ZWFzb24gJiYgaW5Db21wb3NpdGluZ01vZGUoKSAmJiBsYXllci0+aXNEb2N1bWVudExheWVyKCkp
IHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJSZW5kZXJMYXllciAlcCByZXF1aXJlcyBjb21w
b3NpdGluZyBsYXllciBiZWNhdXNlOiBpdCdzIHRoZSBkb2N1bWVudCByb290XG4iLCBsYXllcik7
CisgICAgICAgIGdvdFJlYXNvbiA9IHRydWU7CisgICAgfQorICAgIAorICAgIGlmICghZ290UmVh
c29uICYmIHJlcXVpcmVzQ29tcG9zaXRpbmdMYXllckZvclRyYW5zZm9ybShyZW5kZXJTdHlsZSkp
IHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJSZW5kZXJMYXllciAlcCByZXF1aXJlcyBjb21w
b3NpdGluZyBsYXllciBiZWNhdXNlOiBpdCBoYXMgM2QgdHJhbnNmb3JtLCBwZXJzcGVjdGl2ZSwg
YmFja2ZhY2UsIG9yIGFuaW1hdGluZyB0cmFuc2Zvcm1cbiIsIGxheWVyKTsKKyAgICAgICAgZ290
UmVhc29uID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIWdvdFJlYXNvbiAmJiBjbGlwc0NvbXBv
c2l0aW5nRGVzY2VuZGFudHMobGF5ZXIpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVu
ZGVyTGF5ZXIgJXAgcmVxdWlyZXMgY29tcG9zaXRpbmcgbGF5ZXIgYmVjYXVzZTogaXQgaGFzIG92
ZXJmbG93IGNsaXBcbiIsIGxheWVyKTsKKyAgICAgICAgZ290UmVhc29uID0gdHJ1ZTsKKyAgICB9
CisKKyAgICBpZiAoIWdvdFJlYXNvbiAmJiByZXF1aXJlc0NvbXBvc2l0aW5nRm9yQW5pbWF0aW9u
KGxheWVyKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJlbmRlckxheWVyICVwIHJlcXVp
cmVzIGNvbXBvc2l0aW5nIGxheWVyIGJlY2F1c2U6IGl0IGhhcyBhIHJ1bm5pbmcgdHJhbnNpdGlv
biBmb3Igb3BhY2l0eSBvciB0cmFuc2Zvcm1cbiIsIGxheWVyKTsKKyAgICAgICAgZ290UmVhc29u
ID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgaWYgKCFnb3RSZWFzb24pCisgICAgICAgIGZwcmlu
dGYoc3RkZXJyLCAiUmVuZGVyTGF5ZXIgJXAgZG9lcyBub3QgcmVxdWlyZSBjb21wb3NpdGluZyBs
YXllclxuIiwgbGF5ZXIpOworI2VuZGlmCisKKyAgICAvLyB0aGUgcm9vdCBsYXllciBhbHdheXMg
aGFzIGEgY29tcG9zaXRpbmcgbGF5ZXIgKGZvciBub3cpLgorICAgIHJldHVybiAoaW5Db21wb3Np
dGluZ01vZGUoKSAmJiBsYXllci0+aXNEb2N1bWVudExheWVyKCkpIHx8CisgICAgICAgICAgICAg
cmVxdWlyZXNDb21wb3NpdGluZ0xheWVyRm9yVHJhbnNmb3JtKHJlbmRlclN0eWxlKSB8fAorICAg
ICAgICAgICAgIGNsaXBzQ29tcG9zaXRpbmdEZXNjZW5kYW50cyhsYXllcikgfHwKKyAgICAgICAg
ICAgICByZXF1aXJlc0NvbXBvc2l0aW5nRm9yQW5pbWF0aW9uKGxheWVyKTsKK30KKworLy8gUmV0
dXJuIHRydWUgaWYgdGhlIGdpdmVuIGxheWVyIGhhcyBzb21lIGFuY2VzdG9yIGluIHRoZSBSZW5k
ZXJMYXllciBoaWVyYXJjaHkgdGhhdCBjbGlwcywKKy8vIHVwIHRvIHRoZSBlbmNsb3NpbmcgY29t
cG9zaXRpbmcgYW5jZXN0b3IuIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBjb21wb3NpdGluZyBs
YXllcnMgYXJlIHBhcmVudGVkCisvLyBhY2NvcmRpbmcgdG8gdGhlIHotb3JkZXIgaGllcmFyY2h5
LCB5ZXQgY2xpcHBpbmcgZ29lcyBkb3duIHRoZSByZW5kZXJlciBoaWVyYXJjaHkuCisvLyBUaHVz
LCBhIFJlbmRlckxheWVyIGNhbiBiZSBjbGlwcGVkIGJ5IGEgUmVuZGVyTGF5ZXIgdGhhdCBpcyBh
biBhbmNlc3RvciBpbiB0aGUgcmVuZGVyZXIgaGllcmFyY2h5LAorLy8gYnV0IGEgc2libGluZyBp
biB0aGUgei1vcmRlciBoaWVyYXJjaHkuCitib29sIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6Y2xp
cHBlZEJ5QW5jZXN0b3IoUmVuZGVyTGF5ZXIqIGxheWVyKSBjb25zdAoreworICAgIGlmICghbGF5
ZXItPmlzQ29tcG9zaXRlZCgpIHx8ICFsYXllci0+cGFyZW50KCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIFJlbmRlckxheWVyKiBjb21wb3NpdGluZ0FuY2VzdG9yID0gZW5jbG9zaW5n
Q29tcG9zaXRpbmdMYXllcihsYXllciwgZmFsc2UpOworCisgICAgLy8gV2UgbmVlZCBhbmNlc3Rv
ciBjbGlwcGluZyBpZiBzb21ldGhpbmcgY2xpcHMgYmV0d2VlbiB0aGlzIGxheWVyIGFuZCBpdHMg
Y29tcG9zaXRpbmcsIHN0YWNraW5nIGNvbnRleHQgYW5jZXN0b3IKKyAgICBmb3IgKFJlbmRlckxh
eWVyKiBjdXJMYXllciA9IGxheWVyLT5wYXJlbnQoKTsgY3VyTGF5ZXIgJiYgY3VyTGF5ZXIgIT0g
Y29tcG9zaXRpbmdBbmNlc3RvcjsgY3VyTGF5ZXIgPSBjdXJMYXllci0+cGFyZW50KCkpIHsKKyAg
ICAgICAgLy8gRklYTUU6IG5lZWQgdG8gbG9vayBhdCBoYXNDbGlwKCkgdG9vIGV2ZW50dWFsbHkK
KyAgICAgICAgaWYgKGN1ckxheWVyLT5yZW5kZXJlcigpLT5oYXNPdmVyZmxvd0NsaXAoKSkKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgLy8gQ2xpcCBpcyByZXNl
dCBmb3IgYW4gYWJzb2x1dGVseSBwb3NpdGlvbmVkIGVsZW1lbnQuCisgICAgICAgIC8vIEZJWE1F
OiBtYW55IGNhc2VzIGFyZSBicm9rZW4uIFdlIG5lZWQgbW9yZSBvZiB0aGUgbG9naWMgaW4gY2Fs
Y3VsYXRlQ2xpcFJlY3RzKCkgaGVyZQorICAgICAgICBpZiAoY3VyTGF5ZXItPnJlbmRlcmVyKCkt
PnN0eWxlKCktPnBvc2l0aW9uKCkgPT0gQWJzb2x1dGVQb3NpdGlvbikKKyAgICAgICAgICAgIGJy
ZWFrOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gUmV0dXJuIHRydWUgaWYg
dGhlIGdpdmVuIGxheWVyIGlzIGEgc3RhY2tpbmcgY29udGV4dCBhbmQgaGFzIGNvbXBvc2l0aW5n
IGNoaWxkCisvLyBsYXllcnMgdGhhdCBpdCBuZWVkcyB0byBjbGlwLiBJbiB0aGlzIGNhc2Ugd2Ug
aW5zZXJ0IGEgY2xpcHBpbmcgR3JhcGhpY3NMYXllcgorLy8gaW50byB0aGUgaGllcmFyY2h5IGJl
dHdlZW4gdGhpcyBsYXllciBhbmQgaXRzIGNoaWxkcmVuIGluIHRoZSB6LW9yZGVyIGhpZXJhcmNo
eS4KK2Jvb2wgUmVuZGVyTGF5ZXJDb21wb3NpdG9yOjpjbGlwc0NvbXBvc2l0aW5nRGVzY2VuZGFu
dHMoY29uc3QgUmVuZGVyTGF5ZXIqIGxheWVyKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBuZWVk
IHRvIGxvb2sgYXQgaGFzQ2xpcCgpIHRvbyBldmVudHVhbGx5CisgICAgcmV0dXJuIGxheWVyLT5o
YXNDb21wb3NpdGluZ0Rlc2NlbmRhbnQoKSAmJgorICAgICAgICAgICBsYXllci0+aXNTdGFja2lu
Z0NvbnRleHQoKSAmJgorICAgICAgICAgICBsYXllci0+cmVuZGVyZXIoKS0+aGFzT3ZlcmZsb3dD
bGlwKCk7Cit9CisKK2Jvb2wgUmVuZGVyTGF5ZXJDb21wb3NpdG9yOjpyZXF1aXJlc0NvbXBvc2l0
aW5nRm9yQW5pbWF0aW9uKGNvbnN0IFJlbmRlckxheWVyKiBsYXllcikgY29uc3QKK3sKKyAgICBB
bmltYXRpb25Db250cm9sbGVyKiBhbmltQ29udHJvbGxlciA9IGxheWVyLT5yZW5kZXJlcigpLT5h
bmltYXRpb24oKTsKKyAgICBpZiAoYW5pbUNvbnRyb2xsZXIpCisgICAgICAgIHJldHVybiBhbmlt
Q29udHJvbGxlci0+aXNBbmltYXRpbmdQcm9wZXJ0eU9uUmVuZGVyZXIobGF5ZXItPnJlbmRlcmVy
KCksIENTU1Byb3BlcnR5T3BhY2l0eSkgfHwKKyAgICAgICAgICAgICAgIGFuaW1Db250cm9sbGVy
LT5pc0FuaW1hdGluZ1Byb3BlcnR5T25SZW5kZXJlcihsYXllci0+cmVuZGVyZXIoKSwgQ1NTUHJv
cGVydHlXZWJraXRUcmFuc2Zvcm0pOworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gSWYgYW4g
ZWxlbWVudCBoYXMgbmVnYXRpdmUgei1pbmRleCBjaGlsZHJlbiwgdGhvc2UgY2hpbGRyZW4gcmVu
ZGVyIGluIGZyb250IG9mIHRoZSAKKy8vIGxheWVyIGJhY2tncm91bmQsIHNvIHdlIG5lZWQgYW4g
ZXh0cmEgJ2NvbnRlbnRzJyBsYXllciBmb3IgdGhlIGZvcmVncm91bmQgb2YgdGhlIGxheWVyCisv
LyBvYmplY3QuCitib29sIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6bmVlZHNDb250ZW50c0NvbXBv
c2l0aW5nTGF5ZXIoY29uc3QgUmVuZGVyTGF5ZXIqIGxheWVyKSBjb25zdAoreworICAgIHJldHVy
biAobGF5ZXItPm1fbmVnWk9yZGVyTGlzdCAmJiBsYXllci0+bV9uZWdaT3JkZXJMaXN0LT5zaXpl
KCkgPiAwKTsKK30KKwordm9pZCBSZW5kZXJMYXllckNvbXBvc2l0b3I6OmVuc3VyZVJvb3RQbGF0
Zm9ybUxheWVyKCkKK3sKKyAgICBpZiAobV9yb290UGxhdGZvcm1MYXllcikKKyAgICAgICAgcmV0
dXJuOworCisgICAgbV9yb290UGxhdGZvcm1MYXllciA9IEdyYXBoaWNzTGF5ZXI6OmNyZWF0ZUdy
YXBoaWNzTGF5ZXIoMCk7CisgICAgbV9yb290UGxhdGZvcm1MYXllci0+c2V0U2l6ZShGbG9hdFNp
emUobV9yZW5kZXJWaWV3LT5kb2NXaWR0aCgpLCBtX3JlbmRlclZpZXctPmRvY0hlaWdodCgpKSk7
CisgICAgbV9yb290UGxhdGZvcm1MYXllci0+c2V0UG9zaXRpb24oRmxvYXRQb2ludCgwLCAwKSk7
CisKKyAgICBpZiAoR3JhcGhpY3NMYXllcjo6Z3JhcGhpY3NDb250ZXh0c0ZsaXBwZWQoKSkKKyAg
ICAgICAgbV9yb290UGxhdGZvcm1MYXllci0+c2V0Q2hpbGRyZW5UcmFuc2Zvcm0oZmxpcFRyYW5z
Zm9ybSgpKTsKKworICAgIC8vIE5lZWQgdG8gY2xpcCB0byBwcmV2ZW50IHRyYW5zZm9ybWVkIGNv
bnRlbnQgc2hvd2luZyBvdXRzaWRlIHRoaXMgZnJhbWUKKyAgICBtX3Jvb3RQbGF0Zm9ybUxheWVy
LT5zZXRNYXNrc1RvQm91bmRzKHRydWUpOworICAgIAorICAgIHdhc0F0dGFjaGVkKCk7Cit9CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKKwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJDb21w
b3NpdG9yLmggYi9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllckNvbXBvc2l0b3IuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWZjMjU3Ci0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmgKQEAgLTAsMCArMSwx
MzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVS
LCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpZm5kZWYgUmVuZGVyTGF5ZXJDb21wb3NpdG9yX2gKKyNkZWZpbmUgUmVuZGVyTGF5
ZXJDb21wb3NpdG9yX2gKKworI2luY2x1ZGUgIlJlbmRlckxheWVyLmgiCisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworI2RlZmluZSBQUk9GSUxFX0xBWUVSX1JFQlVJTEQgMAorCitjbGFzcyBHcmFw
aGljc0xheWVyOworCisvLyBSZW5kZXJMYXllckNvbXBvc2l0b3IgbWFuYWdlcyB0aGUgaGllcmFy
Y2h5IG9mCisvLyBjb21wb3NpdGVkIFJlbmRlckxheWVycy4gSXQgZGV0ZXJtaW5lcyB3aGljaCBS
ZW5kZXJMYXllcnMKKy8vIGJlY29tZSBjb21wb3NpdGluZywgYW5kIGNyZWF0ZXMgYW5kIG1haW50
YWlucyBhIGhpZXJhcmNoeSBvZgorLy8gR3JhcGhpY3NMYXllcnMgYmFzZWQgb24gdGhlIFJlbmRl
ckxheWVyIHBhaW50aW5nIG9yZGVyLgorLy8gCisvLyBUaGVyZSBpcyBvbmUgUmVuZGVyTGF5ZXJD
b21wb3NpdG9yIHBlciBSZW5kZXJWaWV3LgorCitjbGFzcyBSZW5kZXJMYXllckNvbXBvc2l0b3Ig
eworcHVibGljOgorCisgICAgUmVuZGVyTGF5ZXJDb21wb3NpdG9yKFJlbmRlclZpZXcqKTsKKyAg
ICB+UmVuZGVyTGF5ZXJDb21wb3NpdG9yKCk7CisgICAgCisgICAgLy8gUmV0dXJuIHRydWUgaWYg
dGhpcyBSZW5kZXJWaWV3IGlzIGluICJjb21wb3NpdGluZyBtb2RlIiAoaS5lLiBoYXMgb25lIG9y
IG1vcmUKKyAgICAvLyBjb21wb3NpdGVkIFJlbmRlckxheWVycykKKyAgICBib29sIGluQ29tcG9z
aXRpbmdNb2RlKCkgY29uc3QgeyByZXR1cm4gbV9jb21wb3NpdGluZzsgfQorICAgIC8vIFRoaXMg
d2lsbCBtYWtlIGEgY29tcG9zaXRpbmcgbGF5ZXIgYXQgdGhlIHJvb3QgYXV0b21hdGljYWxseSwg
YW5kIGhvb2sgdXAgdG8KKyAgICAvLyB0aGUgbmF0aXZlIHZpZXcvd2luZG93IHN5c3RlbS4KKyAg
ICB2b2lkIGVuYWJsZUNvbXBvc2l0aW5nTW9kZShib29sIGVuYWJsZSA9IHRydWUpOworCisgICAg
dm9pZCBzZXRDb21wb3NpdGluZ0xheWVyc05lZWRVcGRhdGUoYm9vbCBuZWVkVXBkYXRlID0gdHJ1
ZSk7CisgICAgYm9vbCBjb21wb3NpdGluZ0xheWVyc05lZWRVcGRhdGUoKSBjb25zdCB7IHJldHVy
biBtX2NvbXBvc2l0aW5nTGF5ZXJzTmVlZFVwZGF0ZTsgfQorCisgICAgLy8gUmVidWlsZCB0aGUg
dHJlZSBvZiBjb21wb3NpdGluZyBsYXllcnMKKyAgICB2b2lkIHVwZGF0ZUNvbXBvc2l0aW5nTGF5
ZXJzKFJlbmRlckxheWVyKiB1cGRhdGVSb290ID0gMCk7CisKKyAgICAvLyBVcGRhdGUgdGhlIGNv
bXBvc2l0aW5nIHN0YXRlIG9mIHRoZSBnaXZlbiBsYXllci4gUmV0dXJucyB0cnVlIGlmIHRoYXQg
c3RhdGUgY2hhbmdlZAorICAgIGJvb2wgdXBkYXRlTGF5ZXJDb21wb3NpdGluZ1N0YXRlKFJlbmRl
ckxheWVyKiwgUmVuZGVyU3R5bGU6OkRpZmYpOworCisgICAgLy8gUmV0dXJuIHRoZSBib3VuZGlu
ZyBib3ggcmVxdWlyZWQgZm9yIGNvbXBvc2l0aW5nIGxheWVyIGFuZCBpdHMgY2hpbGRlcm4sIHJl
bGF0aXZlIHRvIGFuY2VzdG9yTGF5ZXIuCisgICAgLy8gSWYgbGF5ZXJCb3VuZGluZ0JveCBpcyBu
b3QgMCwgb24gcmV0dXJuIGl0IGNvbnRhaW5zIHRoZSBib3VuZGluZyBib3ggb2YgdGhpcyBsYXll
ciBvbmx5LgorICAgIEludFJlY3QgY2FsY3VsYXRlQ29tcG9zaXRlZEJvdW5kcyhjb25zdCBSZW5k
ZXJMYXllciogbGF5ZXIsIGNvbnN0IFJlbmRlckxheWVyKiBhbmNlc3RvckxheWVyLCBJbnRSZWN0
KiBsYXllckJvdW5kaW5nQm94ID0gMCk7CisgICAgCisgICAgLy8gTm90aWZ5IHVzIHRoYXQgYSBs
YXllciBoYXMgYmVlbiBhZGRlZCBvciByZW1vdmVkCisgICAgdm9pZCBsYXllcldhc0FkZGVkKFJl
bmRlckxheWVyKiBwYXJlbnQsIFJlbmRlckxheWVyKiBjaGlsZCk7CisgICAgdm9pZCBsYXllcldp
bGxCZVJlbW92ZWQoUmVuZGVyTGF5ZXIqIHBhcmVudCwgUmVuZGVyTGF5ZXIqIGNoaWxkKTsKKwor
ICAgIC8vIEdldHMgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHJlbmRlciBsYXllciB0aGF0IGlzIGNv
bXBvc2l0ZWQgKG9wdGlvbmFsbHkgaW5jbHVkaW5nIHNlbGYpCisgICAgUmVuZGVyTGF5ZXIqIGVu
Y2xvc2luZ0NvbXBvc2l0aW5nTGF5ZXIoUmVuZGVyTGF5ZXIqIGxheWVyLCBib29sIGluY2x1ZGVT
ZWxmID0gdHJ1ZSkgY29uc3Q7CisKKyAgICAvLyBHZXQgdGhlIG5lYXJlc3QgYW5jZXN0b3IgbGF5
ZXIgdGhhdCBoYXMgb3ZlcmZsb3cgb3IgY2xpcCwgYnV0IGlzIG5vdCBhIHN0YWNraW5nIGNvbnRl
eHQKKyAgICBSZW5kZXJMYXllciogZW5jbG9zaW5nTm9uU3RhY2tpbmdDbGlwcGluZ0xheWVyKGNv
bnN0IFJlbmRlckxheWVyKiBsYXllcikgY29uc3Q7CisKKyAgICB2b2lkIHJlcGFpbnRDb21wb3Np
dGluZ0xheWVyUmVjdChSZW5kZXJMYXllciosIGNvbnN0IEludFJlY3QmLCBib29sIGluY2x1ZGVE
ZXNjZW5kYW50cyk7CisKKyAgICBSZW5kZXJMYXllciogcm9vdFJlbmRlckxheWVyKCkgY29uc3Q7
CisgICAgR3JhcGhpY3NMYXllciogcm9vdFBsYXRmb3JtTGF5ZXIoKSBjb25zdDsKKworICAgIHZv
aWQgd2lsbEJlRGV0YWNoZWQoKTsKKyAgICB2b2lkIHdhc0F0dGFjaGVkKCk7CisgICAgdm9pZCB1
cGRhdGVSb290TGF5ZXJQb3NpdGlvbigpOworCitwcml2YXRlOgorICAgIC8vIFdoZXRoZXIgdGhl
IGdpdmVuIFJMIG5lZWRzIGEgY29tcG9zaXRpbmcgbGF5ZXIuCisgICAgYm9vbCBuZWVkc1RvQmVD
b21wb3NpdGVkKGNvbnN0IFJlbmRlckxheWVyKikgY29uc3Q7CisgICAgLy8gV2hldGhlciB0aGUg
bGF5ZXIgaGFzIGFuIGludHJpbnNpYyBuZWVkIGZvciBjb21wb3NpdGluZyBsYXllci4KKyAgICBi
b29sIHJlcXVpcmVzQ29tcG9zaXRpbmdMYXllcihjb25zdCBSZW5kZXJMYXllciopIGNvbnN0Owor
CisgICAgLy8gV2hldGhlciB3ZSBuZWVkIGEgZ3JhcGhpY3MgbGF5ZXIgdG8gZG8gY2xpcHBpbmcg
YnkgYW4gYW5jZXN0b3IgKG5vbi1zdGFja2luZy1jb250ZXh0IHBhcmVudCB3aXRoIG92ZXJmbG93
KS4KKyAgICBib29sIGNsaXBwZWRCeUFuY2VzdG9yKFJlbmRlckxheWVyKikgY29uc3Q7CisgICAg
Ly8gV2hldGhlciB3ZSBuZWVkIGEgZ3JhcGhpY3MgbGF5ZXIgdG8gY2xpcCB6LW9yZGVyIGNoaWxk
cmVuIG9mIHRoZSBnaXZlbiBsYXllci4KKyAgICBib29sIGNsaXBzQ29tcG9zaXRpbmdEZXNjZW5k
YW50cyhjb25zdCBSZW5kZXJMYXllciopIGNvbnN0OworCisgICAgLy8gV2hldGhlciBhIHJ1bm5p
bmcgdHJhbnNpdGlvbiBvciBhbmltYXRpb24gZW5mb3JjZXMgdGhlIG5lZWQgZm9yIGEgY29tcG9z
aXRpbmcgbGF5ZXIuCisgICAgYm9vbCByZXF1aXJlc0NvbXBvc2l0aW5nRm9yQW5pbWF0aW9uKGNv
bnN0IFJlbmRlckxheWVyKikgY29uc3Q7CisgICAgLy8gV2hldGhlciB0aGUgZ2l2ZW4gbGF5ZXIg
bmVlZHMgYW4gZXh0cmEgJ2NvbnRlbnRzJyBsYXllci4KKyAgICBib29sIG5lZWRzQ29udGVudHND
b21wb3NpdGluZ0xheWVyKGNvbnN0IFJlbmRlckxheWVyKikgY29uc3Q7CisKKyAgICAvLyBTZXQg
YSBiaXQgb24gdGhpcyBsYXllciB0byBmb3JjZSBpdCB0byBiZSBjb21wb3Npc3RlZCwgYmVjYXVz
ZSBpdCBoYXMgdG8gcmVuZGVyIG9uIHRvcCBvZgorICAgIC8vIG90aGVyIGNvbXBvc2l0aW5nIGxh
eWVycy4KKyAgICB2b2lkIHNldEZvcmNlZENvbXBvc2l0aW5nTGF5ZXIoUmVuZGVyTGF5ZXIqLCBi
b29sIGZvcmNlKTsKKworICAgIHZvaWQgY29tcHV0ZUNvbXBvc2l0aW5nUmVxdWlyZW1lbnRzKFJl
bmRlckxheWVyKiwgc3RydWN0IENvbXBvc2l0aW5nU3RhdGUmKTsKKyAgICB2b2lkIHJlYnVpbGRD
b21wb3NpdGluZ0xheWVyVHJlZShSZW5kZXJMYXllciogbGF5ZXIsIHN0cnVjdCBDb21wb3NpdGlu
Z1N0YXRlJik7CisKKyAgICAvLyBIb29rIGNvbXBvc2l0aW5nIGxheWVycyB0b2dldGhlcgorICAg
IHZvaWQgc2V0Q29tcG9zaXRpbmdQYXJlbnQoUmVuZGVyTGF5ZXIqIGNoaWxkTGF5ZXIsIFJlbmRl
ckxheWVyKiBwYXJlbnRMYXllcik7CisgICAgdm9pZCByZW1vdmVDb21wb3NpdGVkQ2hpbGRyZW4o
UmVuZGVyTGF5ZXIqKTsKKworICAgIHZvaWQgcGFyZW50SW5Sb290TGF5ZXIoUmVuZGVyTGF5ZXIq
KTsKKworICAgIHZvaWQgZW5zdXJlUm9vdFBsYXRmb3JtTGF5ZXIoKTsKKworcHJpdmF0ZToKKyAg
ICBSZW5kZXJWaWV3KiBtX3JlbmRlclZpZXc7CisgICAgR3JhcGhpY3NMYXllciogbV9yb290UGxh
dGZvcm1MYXllcjsKKyAgICBib29sIG1fY29tcG9zaXRpbmc7CisgICAgYm9vbCBtX3Jvb3RMYXll
ckF0dGFjaGVkOworICAgIGJvb2wgbV9jb21wb3NpdGluZ0xheWVyc05lZWRVcGRhdGU7CisjaWYg
UFJPRklMRV9MQVlFUl9SRUJVSUxECisgICAgaW50IG1fcm9vdExheWVyVXBkYXRlQ291bnQ7Cisj
ZW5kaWYKK307CisKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUmVuZGVy
TGF5ZXJDb21wb3NpdG9yX2gK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26988</attachid>
            <date>2009-01-23 16:25:57 -0800</date>
            <delta_ts>2009-01-29 10:21:15 -0800</delta_ts>
            <desc>Patch, changelog</desc>
            <filename>23357_patch2.txt</filename>
            <type>text/plain</type>
            <size>86710</size>
            <attacher name="Simon Fraser (smfr)">simon.fraser</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YmE1YmM5ZS4uZTIwOTM2ZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyNSBAQAorMjAwOS0wMS0yMyAgU2ltb24gRnJhc2Vy
ICA8c2ltb24uZnJhc2VyQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MjMzNTcKKyAgICAgICAgCisgICAgICAgIE5ldyBmaWxlcyB0byBzdXBwb3J0IGFjY2VsZXJh
dGVkIGNvbXBvc2l0aW5nIGF0IHRoZSBSZW5kZXJMYXllcgorICAgICAgICBsZXZlbC4KKyAgICAg
ICAgCisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAg
ICBOZXcgZmlsZXMgYWRkZWQgdG8gcHJvamVjdC4KKyAgICAgICAgCisgICAgICAgICogcmVuZGVy
aW5nL1JlbmRlckxheWVyQmFja2luZy5jcHA6IEFkZGVkLgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJMYXllckJhY2tpbmcuaDogQWRkZWQuCisgICAgICAgIE5ldyBvYmplY3QgdG8gc3RvcmUg
Y29tcG9zaXRpbmctcmVsYXRlZCBkYXRhIGZvciBhIHNpbmdsZQorICAgICAgICBSZW5kZXJMYXll
ci4KKyAgICAgICAgCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckxheWVyQ29tcG9zaXRvci5j
cHA6IEFkZGVkLgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJMYXllckNvbXBvc2l0b3IuaDog
QWRkZWQuCisgICAgICAgIFBlci1SZW5kZXJWaWV3IGNvbnRyb2xsZXIgb2JqZWN0IGZvciBjb21w
b3NpdGluZyBoaWVyYXJjaHkKKyAgICAgICAgbWFpbnRlbmFuY2UuCisKIDIwMDktMDEtMjMgIERh
dmlkIEh5YXR0ICA8aHlhdHRAYXBwbGUuY29tPgogCiAgICAgICAgIEZpeCBmb3IgPHJkYXI6Ly9w
cm9ibGVtLzY1MTg4NTA+IFJFR1JFU1NJT046IGhvdmVyIGZlZWRiYWNrIG5vdCBzaG93aW5nIG9u
IG1hbnkgc2l0ZXMKZGlmZiAtLWdpdCBhL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVj
dC5wYnhwcm9qIGIvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKaW5k
ZXggZjA4NTdkNy4uYWQzZDNjNCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oKKysrIGIvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0
LnBieHByb2oKQEAgLTEzOSw2ICsxMzksMTAgQEAKIAkJMEY1NjAyOTAwRTRCNzY1ODAwNjVCMDM4
IC8qIFJlbmRlck1hcnF1ZWUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMEY1NjAyOEUwRTRCNzY1ODAwNjVCMDM4IC8qIFJlbmRlck1hcnF1ZWUuY3Bw
ICovOyB9OwogCQkwRjZFQ0Q0NTBGMjUyRjM3MDBCREUyNzEgLyogQ1NTUHJvcGVydHlMb25naGFu
ZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY2RUNE
NDMwRjI1MkYzNzAwQkRFMjcxIC8qIENTU1Byb3BlcnR5TG9uZ2hhbmQuaCAqLzsgfTsKIAkJMEY2
RUNENDYwRjI1MkYzNzAwQkRFMjcxIC8qIENTU1Byb3BlcnR5TG9uZ2hhbmQuY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY2RUNENDQwRjI1MkYzNzAw
QkRFMjcxIC8qIENTU1Byb3BlcnR5TG9uZ2hhbmQuY3BwICovOyB9OworCQkwRkFGRjlBRTBGMkE5
NjkxMDAwN0RCNzUgLyogUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkFGRjlBQTBGMkE5NjkxMDAwN0RCNzUgLyog
UmVuZGVyTGF5ZXJDb21wb3NpdG9yLmggKi87IH07CisJCTBGQUZGOUFGMEYyQTk2OTEwMDA3REI3
NSAvKiBSZW5kZXJMYXllckNvbXBvc2l0b3IuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMEZBRkY5QUIwRjJBOTY5MTAwMDdEQjc1IC8qIFJlbmRlckxh
eWVyQ29tcG9zaXRvci5jcHAgKi87IH07CisJCTBGQUZGOUIwMEYyQTk2OTEwMDA3REI3NSAvKiBS
ZW5kZXJMYXllckJhY2tpbmcuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDBGQUZGOUFDMEYyQTk2OTEwMDA3REI3NSAvKiBSZW5kZXJMYXllckJhY2tpbmcu
aCAqLzsgfTsKKwkJMEZBRkY5QjEwRjJBOTY5MTAwMDdEQjc1IC8qIFJlbmRlckxheWVyQmFja2lu
Zy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkFG
RjlBRDBGMkE5NjkxMDAwN0RCNzUgLyogUmVuZGVyTGF5ZXJCYWNraW5nLmNwcCAqLzsgfTsKIAkJ
MEZDNzA1MjEwRUIxODE1NjAwQjkwQUQ4IC8qIEF0b21pY1N0cmluZ0hhc2guaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGQzcwNTIwMEVCMTgxNTYwMEI5
MEFEOCAvKiBBdG9taWNTdHJpbmdIYXNoLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAo
UHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEZENzIzODIwRUM4QkQ5MzAwQ0E1REQ3IC8qIEZsb2F0UXVh
ZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZENzIz
ODAwRUM4QkQ5MzAwQ0E1REQ3IC8qIEZsb2F0UXVhZC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGRDcyMzgzMEVDOEJEOTMwMENBNURENyAvKiBG
bG9hdFF1YWQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gMEZENzIzODEwRUM4QkQ5MzAwQ0E1REQ3IC8qIEZsb2F0UXVhZC5jcHAgKi87IH07CkBAIC00
OTc1LDYgKzQ5NzksMTAgQEAKIAkJMEY1NjAyOEUwRTRCNzY1ODAwNjVCMDM4IC8qIFJlbmRlck1h
cnF1ZWUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVyTWFy
cXVlZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGNkVDRDQzMEYyNTJGMzcw
MEJERTI3MSAvKiBDU1NQcm9wZXJ0eUxvbmdoYW5kLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IENTU1Byb3BlcnR5TG9uZ2hhbmQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJMEY2RUNENDQwRjI1MkYzNzAwQkRFMjcxIC8qIENTU1Byb3BlcnR5TG9uZ2hhbmQuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQ1NTUHJvcGVydHlMb25naGFu
ZC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGQUZGOUFBMEYyQTk2OTEwMDA3
REI3NSAvKiBSZW5kZXJMYXllckNvbXBvc2l0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CisJCTBGQUZGOUFCMEYyQTk2OTEwMDA3REI3NSAvKiBSZW5kZXJMYXllckNvbXBvc2l0b3Iu
Y3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVyTGF5ZXJDb21w
b3NpdG9yLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEZBRkY5QUMwRjJBOTY5
MTAwMDdEQjc1IC8qIFJlbmRlckxheWVyQmFja2luZy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBSZW5kZXJMYXllckJhY2tpbmcuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJMEZBRkY5QUQwRjJBOTY5MTAwMDdEQjc1IC8qIFJlbmRlckxheWVyQmFja2luZy5jcHAg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBSZW5kZXJMYXllckJhY2tpbmcu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwRkM3MDUyMDBFQjE4MTU2MDBCOTBB
RDggLyogQXRvbWljU3RyaW5nSGFzaC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBBdG9taWNTdHJpbmdIYXNoLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRDcy
MzgwMEVDOEJEOTMwMENBNURENyAvKiBGbG9hdFF1YWQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBwYXRoID0gRmxvYXRRdWFkLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBG
RDcyMzgxMEVDOEJEOTMwMENBNURENyAvKiBGbG9hdFF1YWQuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gRmxvYXRRdWFkLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKQEAgLTE0MDUxLDYgKzE0MDU5LDEwIEBACiAJCQkJQkNFQTQ4MzkwOTdEOTMwMjAwOTRD
OUU0IC8qIFJlbmRlcklubGluZS5oICovLAogCQkJCUJDRUE0ODNBMDk3RDkzMDIwMDk0QzlFNCAv
KiBSZW5kZXJMYXllci5jcHAgKi8sCiAJCQkJQkNFQTQ4M0IwOTdEOTMwMjAwOTRDOUU0IC8qIFJl
bmRlckxheWVyLmggKi8sCisJCQkJMEZBRkY5QUQwRjJBOTY5MTAwMDdEQjc1IC8qIFJlbmRlckxh
eWVyQmFja2luZy5jcHAgKi8sCisJCQkJMEZBRkY5QUMwRjJBOTY5MTAwMDdEQjc1IC8qIFJlbmRl
ckxheWVyQmFja2luZy5oICovLAorCQkJCTBGQUZGOUFCMEYyQTk2OTEwMDA3REI3NSAvKiBSZW5k
ZXJMYXllckNvbXBvc2l0b3IuY3BwICovLAorCQkJCTBGQUZGOUFBMEYyQTk2OTEwMDA3REI3NSAv
KiBSZW5kZXJMYXllckNvbXBvc2l0b3IuaCAqLywKIAkJCQlBOEVBNzNCNjBBMTkwMEUzMDBBOEVG
NUYgLyogUmVuZGVyTGVnZW5kLmNwcCAqLywKIAkJCQlBOEVBNzNCRDBBMTkwMEUzMDBBOEVGNUYg
LyogUmVuZGVyTGVnZW5kLmggKi8sCiAJCQkJQUJCNTQxOUMwQUNEREZFNDAwMjgyMEVCIC8qIFJl
bmRlckxpc3RCb3guY3BwICovLApAQCAtMTY2MjgsNiArMTY2NDAsOCBAQAogCQkJCTFBNTY5RDI1
MEQ3RTJCODIwMDdDMzk4MyAvKiBydW50aW1lX3Jvb3QuaCBpbiBIZWFkZXJzICovLAogCQkJCTkz
MzA5RTFFMDk5RTY0OTIwMDU2RTU4MSAvKiB2aXNpYmxlX3VuaXRzLmggaW4gSGVhZGVycyAqLywK
IAkJCQkxOEEwNTM3RDBGMjY4NTlDMDBBNTE3MDUgLyogV29ya2VyUnVuTG9vcC5oIGluIEhlYWRl
cnMgKi8sCisJCQkJMEZBRkY5QUUwRjJBOTY5MTAwMDdEQjc1IC8qIFJlbmRlckxheWVyQ29tcG9z
aXRvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMEZBRkY5QjAwRjJBOTY5MTAwMDdEQjc1IC8qIFJl
bmRlckxheWVyQmFja2luZy5oIGluIEhlYWRlcnMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRl
cGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkBAIC0xODU5Nyw2ICsxODYxMSw4IEBA
CiAJCQkJMUE1NjlEMjIwRDdFMkI4MjAwN0MzOTgzIC8qIHJ1bnRpbWVfb2JqZWN0LmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCTFBNTY5RDI0MEQ3RTJCODIwMDdDMzk4MyAvKiBydW50aW1lX3Jvb3Qu
Y3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTMzMDlFMUQwOTlFNjQ5MjAwNTZFNTgxIC8qIHZpc2li
bGVfdW5pdHMuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMEZBRkY5QUYwRjJBOTY5MTAwMDdEQjc1
IC8qIFJlbmRlckxheWVyQ29tcG9zaXRvci5jcHAgaW4gU291cmNlcyAqLywKKwkJCQkwRkFGRjlC
MTBGMkE5NjkxMDAwN0RCNzUgLyogUmVuZGVyTGF5ZXJCYWNraW5nLmNwcCBpbiBTb3VyY2VzICov
LAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9
OwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJCYWNraW5nLmNwcCBi
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5jcHAKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2NzEzZgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5jcHAKQEAgLTAsMCArMSw5MzUgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2lu
Y2x1ZGUgIkFuaW1hdGlvbkNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJDU1NTdHlsZVNlbGVjdG9y
LmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0Lmgi
CisjaW5jbHVkZSAiR3JhcGhpY3NMYXllci5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXF1ZXN0Lmgi
CisjaW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2lu
Y2x1ZGUgIlJlbmRlckJveC5oIgorI2luY2x1ZGUgIlJlbmRlckltYWdlLmgiCisjaW5jbHVkZSAi
UmVuZGVyTGF5ZXJDb21wb3NpdG9yLmgiCisjaW5jbHVkZSAiUmVuZGVyVmlkZW8uaCIKKyNpbmNs
dWRlICJSZW5kZXJWaWV3LmgiCisKKyNpbmNsdWRlICJSZW5kZXJMYXllckJhY2tpbmcuaCIKKwor
dXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitSZW5kZXJMYXll
ckJhY2tpbmc6OlJlbmRlckxheWVyQmFja2luZyhSZW5kZXJMYXllciogbGF5ZXIpCisgICAgOiBt
X293bmluZ0xheWVyKGxheWVyKQorICAgICwgbV9hbmNlc3RvckNsaXBwaW5nTGF5ZXIoMCkKKyAg
ICAsIG1fZ3JhcGhpY3NMYXllcigwKQorICAgICwgbV9jb250ZW50c0xheWVyKDApCisgICAgLCBt
X2NsaXBwaW5nTGF5ZXIoMCkKKyAgICAsIG1fZm9yY2VDb21wb3NpdGluZ0xheWVyKGZhbHNlKQor
ICAgICwgbV9pc1NpbXBsZUNvbnRhaW5lckNvbXBvc2l0aW5nTGF5ZXIoZmFsc2UpCisgICAgLCBt
X3NpbXBsZUNvbXBvc2l0aW5nTGF5ZXJTdGF0dXNEaXJ0eSh0cnVlKQorICAgICwgbV9jb21wb3Np
dGluZ0NvbnRlbnRPZmZzZXREaXJ0eSh0cnVlKQoreworICAgIGNyZWF0ZUdyYXBoaWNzTGF5ZXIo
KTsKK30KKworUmVuZGVyTGF5ZXJCYWNraW5nOjp+UmVuZGVyTGF5ZXJCYWNraW5nKCkKK3sKKyAg
ICB1cGRhdGVDbGlwcGluZ0xheWVycyhmYWxzZSwgZmFsc2UpOworICAgIHVwZGF0ZUNvbnRlbnRz
TGF5ZXIoZmFsc2UpOworICAgIGRlc3Ryb3lHcmFwaGljc0xheWVyKCk7Cit9CisKK3ZvaWQgUmVu
ZGVyTGF5ZXJCYWNraW5nOjpjcmVhdGVHcmFwaGljc0xheWVyKCkKK3sKKyAgICBtX2dyYXBoaWNz
TGF5ZXIgPSBHcmFwaGljc0xheWVyOjpjcmVhdGVHcmFwaGljc0xheWVyKHRoaXMpOworICAgIAor
I2lmbmRlZiBOREVCVUcKKyAgICBpZiAocmVuZGVyZXIoKS0+bm9kZSgpLT5pc0RvY3VtZW50Tm9k
ZSgpKQorICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPnNldE5hbWUoIkRvY3VtZW50IE5vZGUiKTsK
KyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHJlbmRlcmVyKCktPm5vZGUoKS0+aXNIVE1MRWxlbWVu
dCgpICYmIHJlbmRlcmVyKCktPm5vZGUoKS0+aGFzSUQoKSkKKyAgICAgICAgICAgIG1fZ3JhcGhp
Y3NMYXllci0+c2V0TmFtZShyZW5kZXJlcigpLT5yZW5kZXJOYW1lKCkgKyBTdHJpbmcoIiAiKSAr
IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50Kj4ocmVuZGVyZXIoKS0+ZWxlbWVudCgpKS0+aWQoKSk7
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0TmFtZShyZW5k
ZXJlcigpLT5yZW5kZXJOYW1lKCkpOworICAgIH0KKyNlbmRpZiAgLy8gTkRFQlVHCisKKyAgICB1
cGRhdGVMYXllck9wYWNpdHkoKTsKKyAgICB1cGRhdGVMYXllclRyYW5zZm9ybSgpOworfQorCit2
b2lkIFJlbmRlckxheWVyQmFja2luZzo6ZGVzdHJveUdyYXBoaWNzTGF5ZXIoKQoreworICAgIGlm
IChtX2dyYXBoaWNzTGF5ZXIpCisgICAgICAgIG1fZ3JhcGhpY3NMYXllci0+cmVtb3ZlRnJvbVBh
cmVudCgpOworCisgICAgZGVsZXRlIG1fZ3JhcGhpY3NMYXllcjsKKyAgICBtX2dyYXBoaWNzTGF5
ZXIgPSAwOworCisgICAgZGVsZXRlIG1fY29udGVudHNMYXllcjsKKyAgICBtX2NvbnRlbnRzTGF5
ZXIgPSAwOworCisgICAgZGVsZXRlIG1fY2xpcHBpbmdMYXllcjsKKyAgICBtX2NsaXBwaW5nTGF5
ZXIgPSAwOworfQorCit2b2lkIFJlbmRlckxheWVyQmFja2luZzo6dXBkYXRlTGF5ZXJPcGFjaXR5
KCkKK3sKKyAgICBtX2dyYXBoaWNzTGF5ZXItPnNldE9wYWNpdHkoY29tcG9zaXRpbmdPcGFjaXR5
KHJlbmRlcmVyKCktPm9wYWNpdHkoKSksIDAsIDApOworfQorCit2b2lkIFJlbmRlckxheWVyQmFj
a2luZzo6dXBkYXRlTGF5ZXJUcmFuc2Zvcm0oKQoreworICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9
IHJlbmRlcmVyKCktPnN0eWxlKCk7CisgICAgY29uc3QgSW50UmVjdCBib3JkZXJCb3ggPSByZW5k
ZXJlcigpLT5ib3JkZXJCb3hSZWN0KCk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgdXNl
IG1fb3duaW5nTGF5ZXItPnRyYW5zZm9ybSgpLCBidXQgdGhhdCBjdXJyZW50bHkgaGFzIHRyYW5z
Zm9ybS1vcmlnaW4KKyAgICAvLyBiYWtlZCBpbnRvIGl0LCBhbmQgd2UgZG9uJ3Qgd2FudCB0aGF0
LgorICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHQ7CisgICAgc3R5bGUtPmFwcGx5VHJhbnNmb3Jt
KHQsIGJvcmRlckJveC5zaXplKCksIGZhbHNlKTsKKworICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0
VHJhbnNmb3JtKHQpOworfQorCit2b2lkIFJlbmRlckxheWVyQmFja2luZzo6dXBkYXRlQWZ0ZXJM
YXlvdXQoKQoreworICAgIGludmFsaWRhdGVEcmF3aW5nT3B0aW1pemF0aW9ucygpOworICAgIGRl
dGVjdERyYXdpbmdPcHRpbWl6YXRpb25zKCk7CisKKyAgICB1cGRhdGVHcmFwaGljc0xheWVyR2Vv
bWV0cnkoKTsKK30KKworYm9vbCBSZW5kZXJMYXllckJhY2tpbmc6OnVwZGF0ZUdyYXBoaWNzTGF5
ZXJzKGJvb2wgbmVlZHNDb250ZW50c0xheWVyLCBib29sIG5lZWRzVXBwZXJDbGlwcGluZ0xheWVy
LCBib29sIG5lZWRzTG93ZXJDbGlwcGluZ0xheWVyLCBib29sIG5lZWRzUmVwYWludCkKK3sKKyAg
ICBib29sIGxheWVyQ29uZmlnQ2hhbmdlZCA9IGZhbHNlOworICAgIGlmICh1cGRhdGVDb250ZW50
c0xheWVyKG5lZWRzQ29udGVudHNMYXllcikpCisgICAgICAgIGxheWVyQ29uZmlnQ2hhbmdlZCA9
IHRydWU7CisgICAgCisgICAgaWYgKHVwZGF0ZUNsaXBwaW5nTGF5ZXJzKG5lZWRzVXBwZXJDbGlw
cGluZ0xheWVyLCBuZWVkc0xvd2VyQ2xpcHBpbmdMYXllcikpCisgICAgICAgIGxheWVyQ29uZmln
Q2hhbmdlZCA9IHRydWU7CisKKyAgICAvLyBTZWUgaWYgd2UgY2FuIG5vdyB1c2UgYW55IGRyYXdp
bmcgb3B0aW1pemF0aW9ucy4KKyAgICBib29sIGRpZERyYXdDb250ZW50ID0gZ3JhcGhpY3NMYXll
cigpLT5kcmF3c0NvbnRlbnQoKTsKKyAgICBpbnZhbGlkYXRlRHJhd2luZ09wdGltaXphdGlvbnMo
KTsKKyAgICBkZXRlY3REcmF3aW5nT3B0aW1pemF0aW9ucygpOworICAgIGlmICghZGlkRHJhd0Nv
bnRlbnQgJiYgZ3JhcGhpY3NMYXllcigpLT5kcmF3c0NvbnRlbnQoKSkKKyAgICAgICAgbmVlZHNS
ZXBhaW50ID0gdHJ1ZTsKKworICAgIC8vIFNldCBvcGFjaXR5LCBpZiBpdCBpcyBub3QgYW5pbWF0
aW5nLgorICAgIGlmICghcmVuZGVyZXIoKS0+YW5pbWF0aW9uKCktPmlzQW5pbWF0aW5nUHJvcGVy
dHlPblJlbmRlcmVyKHJlbmRlcmVyKCksIENTU1Byb3BlcnR5T3BhY2l0eSkpCisgICAgICAgIHVw
ZGF0ZUxheWVyT3BhY2l0eSgpOworICAgIAorICAgIHVwZGF0ZUdyYXBoaWNzTGF5ZXJHZW9tZXRy
eSgpOworICAgIAorICAgIG1fZ3JhcGhpY3NMYXllci0+dXBkYXRlQ29udGVudHNSZWN0KCk7Cisg
ICAgCisgICAgaWYgKG5lZWRzUmVwYWludCkgeworICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPnNl
dE5lZWRzRGlzcGxheSgpOworICAgICAgICBpZiAobV9jb250ZW50c0xheWVyKQorICAgICAgICAg
ICAgbV9jb250ZW50c0xheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKKyAgICB9CisgICAgCisgICAg
cmV0dXJuIGxheWVyQ29uZmlnQ2hhbmdlZDsKK30KKwordm9pZCBSZW5kZXJMYXllckJhY2tpbmc6
OnVwZGF0ZUdyYXBoaWNzTGF5ZXJHZW9tZXRyeSgpCit7CisgICAgLy8gSWYgd2UgaGF2ZW4ndCBi
dWlsdCB6LW9yZGVyIGxpc3RzIHlldCwgd2FpdCB1bnRpbCBsYXRlci4KKyAgICBpZiAobV9vd25p
bmdMYXllci0+aXNTdGFja2luZ0NvbnRleHQoKSAmJiBtX293bmluZ0xheWVyLT5tX3pPcmRlckxp
c3RzRGlydHkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFNldCB0cmFuc2Zvcm0gcHJvcGVy
dHksIGlmIGl0IGlzIG5vdCBhbmltYXRpbmcuIFdlIGhhdmUgdG8gZG8gdGhpcyBoZXJlIGJlY2F1
c2UgdGhlIHRyYW5zZm9ybQorICAgIC8vIGlzIGFmZmVjdGVkIGJ5IHRoZSBsYXllciBkaW1lbnNp
b25zLgorICAgIGlmICghcmVuZGVyZXIoKS0+YW5pbWF0aW9uKCktPmlzQW5pbWF0aW5nUHJvcGVy
dHlPblJlbmRlcmVyKHJlbmRlcmVyKCksIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtKSkKKyAg
ICAgICAgdXBkYXRlTGF5ZXJUcmFuc2Zvcm0oKTsKKworICAgIG1fY29tcG9zaXRpbmdDb250ZW50
T2Zmc2V0RGlydHkgPSB0cnVlOworICAgIAorICAgIFJlbmRlckxheWVyKiBjb21wQW5jZXN0b3Ig
PSBjb21wb3NpdG9yKCktPmVuY2xvc2luZ0NvbXBvc2l0aW5nTGF5ZXIobV9vd25pbmdMYXllciwg
ZmFsc2UpOworICAgIAorICAgIC8vIFdlIGNvbXB1dGUgZXZlcnl0aGluZyByZWxhdGl2ZSB0byB0
aGUgZW5jbG9zaW5nIGNvbXBvc2l0aW5nIGxheWVyLgorICAgIEludFJlY3QgYW5jZXN0b3JDb21w
b3NpdGluZ0JvdW5kczsKKyAgICBpZiAoY29tcEFuY2VzdG9yKQorICAgICAgICBhbmNlc3RvckNv
bXBvc2l0aW5nQm91bmRzID0gY29tcG9zaXRvcigpLT5jYWxjdWxhdGVDb21wb3NpdGVkQm91bmRz
KGNvbXBBbmNlc3RvciwgY29tcEFuY2VzdG9yKTsKKyAgICAKKyAgICBJbnRSZWN0IGxvY2FsQ29t
cG9zaXRpbmdCb3VuZHMgPSBjb21wb3NpdG9yKCktPmNhbGN1bGF0ZUNvbXBvc2l0ZWRCb3VuZHMo
bV9vd25pbmdMYXllciwgbV9vd25pbmdMYXllcik7CisKKyAgICBJbnRSZWN0IHJlbGF0aXZlQ29t
cG9zaXRpbmdCb3VuZHMobG9jYWxDb21wb3NpdGluZ0JvdW5kcyk7CisgICAgaW50IGRlbHRhWCA9
IDAsIGRlbHRhWSA9IDA7CisgICAgbV9vd25pbmdMYXllci0+Y29udmVydFRvTGF5ZXJDb29yZHMo
Y29tcEFuY2VzdG9yLCBkZWx0YVgsIGRlbHRhWSk7CisgICAgcmVsYXRpdmVDb21wb3NpdGluZ0Jv
dW5kcy5tb3ZlKGRlbHRhWCwgZGVsdGFZKTsKKworICAgIEludFBvaW50IGdyYXBoaWNzTGF5ZXJQ
YXJlbnRMb2NhdGlvbjsKKyAgICBpZiAoY29tcEFuY2VzdG9yICYmIGNvbXBBbmNlc3Rvci0+YmFj
a2luZygpLT5oYXNDbGlwcGluZ0xheWVyKCkpIHsKKyAgICAgICAgLy8gSWYgdGhlIGNvbXBvc2l0
aW5nIGFuY2VzdG9yIGhhcyBhIGxheWVyIHRvIGNsaXAgY2hpbGRyZW4sIHdlIHBhcmVudCBpbiB0
aGF0LCBhbmQgdGhlcmVmb3JlCisgICAgICAgIC8vIHBvc2l0aW9uIHJlbGF0aXZlIHRvIGl0Lgor
ICAgICAgICBncmFwaGljc0xheWVyUGFyZW50TG9jYXRpb24gPSBjb21wQW5jZXN0b3ItPnJlbmRl
cmVyKCktPmdldE92ZXJmbG93Q2xpcFJlY3QoMCwgMCkubG9jYXRpb24oKTsKKyAgICB9IGVsc2UK
KyAgICAgICAgZ3JhcGhpY3NMYXllclBhcmVudExvY2F0aW9uID0gYW5jZXN0b3JDb21wb3NpdGlu
Z0JvdW5kcy5sb2NhdGlvbigpOworICAgIAorICAgIGlmIChjb21wQW5jZXN0b3IgJiYgbV9hbmNl
c3RvckNsaXBwaW5nTGF5ZXIpIHsKKyAgICAgICAgLy8gQ2FsbCBjYWxjdWxhdGVSZWN0cyB0byBn
ZXQgdGhlIGJhY2tncm91bmRSZWN0IHdoaWNoIGlzIHdoYXQgaXMgdXNlZCB0byBjbGlwIHRoZSBj
b250ZW50cyBvZiB0aGlzCisgICAgICAgIC8vIGxheWVyLiBOb3RlIHRoYXQgd2UgY2FsbCBpdCB3
aXRoIHRlbXBvcmFyeUNsaXBSZWN0cyA9IHRydWUgYmVjYXVzZSBub3JtYWxseSB3aGVuIGNvbXB1
dGluZyBjbGlwIHJlY3RzCisgICAgICAgIC8vIGZvciBhIGNvbXBvc2l0aW5nIGxheWVyLCByb290
TGF5ZXIgaXMgdGhlIGxheWVyIGl0c2VsZi4KKyAgICAgICAgSW50UmVjdCBpbmZpbml0ZVJlY3Qo
SU5UX01JTi8yLCBJTlRfTUlOLzIsIElOVF9NQVgsIElOVF9NQVgpOworICAgICAgICBJbnRSZWN0
IGxheWVyQm91bmRzLCBiYWNrZ3JvdW5kUmVjdCwgZm9yZWdyb3VuZFJlY3QsIG91dGxpbmVSZWN0
OworICAgICAgICBtX293bmluZ0xheWVyLT5jYWxjdWxhdGVSZWN0cyhjb21wQW5jZXN0b3IsIGlu
ZmluaXRlUmVjdCwgbGF5ZXJCb3VuZHMsIGJhY2tncm91bmRSZWN0LCBmb3JlZ3JvdW5kUmVjdCwg
b3V0bGluZVJlY3QsIHRydWUpOworICAgICAgICAKKyAgICAgICAgbV9hbmNlc3RvckNsaXBwaW5n
TGF5ZXItPnNldFBvc2l0aW9uKEZsb2F0UG9pbnQoKSArIChiYWNrZ3JvdW5kUmVjdC5sb2NhdGlv
bigpIC0gZ3JhcGhpY3NMYXllclBhcmVudExvY2F0aW9uKSk7CisgICAgICAgIG1fYW5jZXN0b3JD
bGlwcGluZ0xheWVyLT5zZXRTaXplKGJhY2tncm91bmRSZWN0LnNpemUoKSk7CisKKyAgICAgICAg
Ly8gYmFja2dyb3VuZFJlY3QgaXMgcmVsYXRpdmUgdG8gY29tcEFuY2VzdG9yLCBzbyBzdWJ0cmFj
dCBkZWx0YVgvZGVsdGFZIHRvIGdldCBiYWNrIHRvIGxvY2FsIGNvb3Jkcy4KKyAgICAgICAgSW50
U2l6ZSByZW5kZXJlck9mZnNldChiYWNrZ3JvdW5kUmVjdC5sb2NhdGlvbigpLngoKSAtIGRlbHRh
WCwgYmFja2dyb3VuZFJlY3QubG9jYXRpb24oKS55KCkgLSBkZWx0YVkpOworICAgICAgICBtX2Fu
Y2VzdG9yQ2xpcHBpbmdMYXllci0+c2V0T2Zmc2V0RnJvbVJlbmRlcmVyKHJlbmRlcmVyT2Zmc2V0
KTsKKworICAgICAgICAvLyBUaGUgcHJpbWFyeSBsYXllciBpcyB0aGVuIHBhcmVudGVkIGluLCBh
bmQgcG9zaXRpb25lZCByZWxhdGl2ZSB0byB0aGlzIGNsaXBwaW5nIGxheWVyLgorICAgICAgICBn
cmFwaGljc0xheWVyUGFyZW50TG9jYXRpb24gPSBiYWNrZ3JvdW5kUmVjdC5sb2NhdGlvbigpOwor
ICAgIH0KKworICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0UG9zaXRpb24oRmxvYXRQb2ludCgpICsg
KHJlbGF0aXZlQ29tcG9zaXRpbmdCb3VuZHMubG9jYXRpb24oKSAtIGdyYXBoaWNzTGF5ZXJQYXJl
bnRMb2NhdGlvbikpOworICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0T2Zmc2V0RnJvbVJlbmRlcmVy
KGxvY2FsQ29tcG9zaXRpbmdCb3VuZHMubG9jYXRpb24oKSAtIEludFBvaW50KCkpOworICAgIAor
ICAgIEZsb2F0U2l6ZSBvbGRTaXplID0gbV9ncmFwaGljc0xheWVyLT5zaXplKCk7CisgICAgRmxv
YXRTaXplIG5ld1NpemUgPSByZWxhdGl2ZUNvbXBvc2l0aW5nQm91bmRzLnNpemUoKTsKKyAgICBp
ZiAob2xkU2l6ZSAhPSBuZXdTaXplKSB7CisgICAgICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0U2l6
ZShuZXdTaXplKTsKKyAgICAgICAgLy8gQSBib3VuZHMgY2hhbmdlIHdpbGwgYWxtb3N0IGFsd2F5
cyByZXF1aXJlIHJlZGlzcGxheS4gVXN1YWxseSB0aGF0IHJlZGlzcGxheQorICAgICAgICAvLyB3
aWxsIGhhcHBlbiBiZWNhdXNlIG9mIGEgcmVwYWludCBlbHNld2hlcmUsIGJ1dCBub3QgYWx3YXlz
OgorICAgICAgICAvLyBlLmcuIHNlZSBSZW5kZXJWaWV3OjpzZXRNYXhpbWFsT3V0bGluZVNpemUo
KQorICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPnNldE5lZWRzRGlzcGxheSgpOworICAgIH0KKwor
ICAgIC8vIElmIHdlIGhhdmUgYSBsYXllciB0aGF0IGNsaXBzIGNoaWxkcmVuLCBwb3NpdGlvbiBp
dC4KKyAgICBpZiAobV9jbGlwcGluZ0xheWVyKSB7CisgICAgICAgIEludFJlY3QgY2xpcHBpbmdC
b3ggPSByZW5kZXJlcigpLT5nZXRPdmVyZmxvd0NsaXBSZWN0KDAsIDApOworICAgICAgICBtX2Ns
aXBwaW5nTGF5ZXItPnNldFBvc2l0aW9uKEZsb2F0UG9pbnQoKSArIChjbGlwcGluZ0JveC5sb2Nh
dGlvbigpIC0gbG9jYWxDb21wb3NpdGluZ0JvdW5kcy5sb2NhdGlvbigpKSk7CisgICAgICAgIG1f
Y2xpcHBpbmdMYXllci0+c2V0U2l6ZShjbGlwcGluZ0JveC5zaXplKCkpOworICAgICAgICBtX2Ns
aXBwaW5nTGF5ZXItPnNldE9mZnNldEZyb21SZW5kZXJlcihjbGlwcGluZ0JveC5sb2NhdGlvbigp
IC0gSW50UG9pbnQoKSk7CisgICAgfQorICAgIAorICAgIEludFJlY3QgbGF5ZXJCb3VuZHMgPSBJ
bnRSZWN0KG1fb3duaW5nTGF5ZXItPnhQb3MoKSwgbV9vd25pbmdMYXllci0+eVBvcygpLCByZW5k
ZXJlcigpLT53aWR0aCgpLCByZW5kZXJlcigpLT5oZWlnaHQoKSk7CisKKyAgICAvLyBDb252ZXJ0
IHRvIGFic29sdXRlIGNvb3JkcyB0byBtYXRjaCBiYm94LgorICAgIGludCB4ID0gMCwgeSA9IDA7
CisgICAgbV9vd25pbmdMYXllci0+Y29udmVydFRvTGF5ZXJDb29yZHMoY29tcEFuY2VzdG9yLCB4
LCB5KTsKKyAgICBsYXllckJvdW5kcy5tb3ZlKHggLSBtX293bmluZ0xheWVyLT54UG9zKCksIHkg
LSBtX293bmluZ0xheWVyLT55UG9zKCkpOworCisgICAgLy8gVXBkYXRlIHByb3BlcnRpZXMgdGhh
dCBkZXBlbmQgb24gbGF5ZXIgZGltZW5zaW9ucworICAgIGNvbnN0IEludFJlY3QgYm9yZGVyQm94
ID0gcmVuZGVyZXIoKS0+Ym9yZGVyQm94UmVjdCgpOworCisgICAgRmxvYXRQb2ludDNEIHRyYW5z
Zm9ybU9yaWdpbiA9IGNvbXB1dGVUcmFuc2Zvcm1PcmlnaW4oYm9yZGVyQm94KTsKKyAgICAvLyBD
b21wdXRlIHRoZSBhbmNob3IgcG9pbnQsIHdoaWNoIGlzIGluIHRoZSBjZW50ZXIgb2YgdGhlIHJl
bmRlcmVyIGJveCB1bmxlc3MgdHJhbnNmb3JtLW9yaWdpbiBpcyBzZXQuCisgICAgRmxvYXRQb2lu
dCAgYW5jaG9yKHJlbGF0aXZlQ29tcG9zaXRpbmdCb3VuZHMud2lkdGgoKSAgIT0gMC4wZiA/ICgo
bGF5ZXJCb3VuZHMueCgpIC0gcmVsYXRpdmVDb21wb3NpdGluZ0JvdW5kcy54KCkpICsgdHJhbnNm
b3JtT3JpZ2luLngoKSkgLyByZWxhdGl2ZUNvbXBvc2l0aW5nQm91bmRzLndpZHRoKCkgIDogMC41
ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVDb21wb3NpdGluZ0JvdW5kcy5oZWln
aHQoKSAhPSAwLjBmID8gKChsYXllckJvdW5kcy55KCkgLSByZWxhdGl2ZUNvbXBvc2l0aW5nQm91
bmRzLnkoKSkgKyB0cmFuc2Zvcm1PcmlnaW4ueSgpKSAvIHJlbGF0aXZlQ29tcG9zaXRpbmdCb3Vu
ZHMuaGVpZ2h0KCkgOiAwLjVmKTsKKyAgICBtX2dyYXBoaWNzTGF5ZXItPnNldEFuY2hvclBvaW50
KGFuY2hvciwgdHJhbnNmb3JtT3JpZ2luLnooKSk7CisKKyAgICBpZiAobV9jb250ZW50c0xheWVy
KSB7CisgICAgICAgIC8vIFRoZSBjb250ZW50cyBsYXllciBpcyBhbHdheXMgY29pbmNpZGVudGFs
IHdpdGggdGhlIGdyYXBoaWNzTGF5ZXIgZm9yIG5vdy4KKyAgICAgICAgbV9jb250ZW50c0xheWVy
LT5zZXRQb3NpdGlvbihJbnRQb2ludCgwLCAwKSk7CisgICAgICAgIG1fY29udGVudHNMYXllci0+
c2V0U2l6ZShuZXdTaXplKTsKKyAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXRPZmZzZXRGcm9t
UmVuZGVyZXIobV9ncmFwaGljc0xheWVyLT5vZmZzZXRGcm9tUmVuZGVyZXIoKSk7CisgICAgfQor
CisgICAgbV9ncmFwaGljc0xheWVyLT51cGRhdGVDb250ZW50c1JlY3QoKTsKK30KKwordm9pZCBS
ZW5kZXJMYXllckJhY2tpbmc6OnVwZGF0ZUludGVybmFsSGllcmFyY2h5KCkKK3sKKyAgICAvLyBt
X2NvbnRlbnRzTGF5ZXIgaGFzIHRvIGJlIGluc2VydGVkIGluIHRoZSBjb3JyZWN0IG9yZGVyIHdp
dGggY2hpbGQgbGF5ZXJzLAorICAgIC8vIHNvIGl0J3Mgbm90IGluc2VydGVkIGhlcmUuCisgICAg
aWYgKG1fYW5jZXN0b3JDbGlwcGluZ0xheWVyKSB7CisgICAgICAgIG1fYW5jZXN0b3JDbGlwcGlu
Z0xheWVyLT5yZW1vdmVBbGxDaGlsZHJlbigpOworICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPnJl
bW92ZUZyb21QYXJlbnQoKTsKKyAgICAgICAgbV9hbmNlc3RvckNsaXBwaW5nTGF5ZXItPmFkZENo
aWxkKG1fZ3JhcGhpY3NMYXllcik7CisgICAgfQorCisgICAgaWYgKG1fY2xpcHBpbmdMYXllcikg
eworICAgICAgICBtX2NsaXBwaW5nTGF5ZXItPnJlbW92ZUZyb21QYXJlbnQoKTsKKyAgICAgICAg
bV9ncmFwaGljc0xheWVyLT5hZGRDaGlsZChtX2NsaXBwaW5nTGF5ZXIpOworICAgIH0KK30KKwor
Ly8gUmV0dXJuIHRydWUgaWYgdGhlIGxheWVycyBjaGFuZ2VkLgorYm9vbCBSZW5kZXJMYXllckJh
Y2tpbmc6OnVwZGF0ZUNsaXBwaW5nTGF5ZXJzKGJvb2wgbmVlZHNBbmNlc3RvckNsaXAsIGJvb2wg
bmVlZHNEZXNjZW5kYW50Q2xpcCkKK3sKKyAgICBib29sIGxheWVyc0NoYW5nZWQgPSBmYWxzZTsK
KworICAgIGlmIChuZWVkc0FuY2VzdG9yQ2xpcCkgeworICAgICAgICBpZiAoIW1fYW5jZXN0b3JD
bGlwcGluZ0xheWVyKSB7CisgICAgICAgICAgICBtX2FuY2VzdG9yQ2xpcHBpbmdMYXllciA9IEdy
YXBoaWNzTGF5ZXI6OmNyZWF0ZUdyYXBoaWNzTGF5ZXIodGhpcyk7CisjaWZuZGVmIE5ERUJVRwor
ICAgICAgICAgICAgbV9hbmNlc3RvckNsaXBwaW5nTGF5ZXItPnNldE5hbWUoIkFuY2VzdG9yIGNs
aXBwaW5nIExheWVyIik7CisjZW5kaWYKKyAgICAgICAgICAgIG1fYW5jZXN0b3JDbGlwcGluZ0xh
eWVyLT5zZXRNYXNrc1RvQm91bmRzKHRydWUpOworICAgICAgICAgICAgbGF5ZXJzQ2hhbmdlZCA9
IHRydWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1fYW5jZXN0b3JDbGlwcGluZ0xheWVy
KSB7CisgICAgICAgIG1fYW5jZXN0b3JDbGlwcGluZ0xheWVyLT5yZW1vdmVGcm9tUGFyZW50KCk7
CisgICAgICAgIGRlbGV0ZSBtX2FuY2VzdG9yQ2xpcHBpbmdMYXllcjsKKyAgICAgICAgbV9hbmNl
c3RvckNsaXBwaW5nTGF5ZXIgPSAwOworICAgICAgICBsYXllcnNDaGFuZ2VkID0gdHJ1ZTsKKyAg
ICB9CisgICAgCisgICAgaWYgKG5lZWRzRGVzY2VuZGFudENsaXApIHsKKyAgICAgICAgaWYgKCFt
X2NsaXBwaW5nTGF5ZXIpIHsKKyAgICAgICAgICAgIG1fY2xpcHBpbmdMYXllciA9IEdyYXBoaWNz
TGF5ZXI6OmNyZWF0ZUdyYXBoaWNzTGF5ZXIoMCk7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAg
ICAgbV9jbGlwcGluZ0xheWVyLT5zZXROYW1lKCJDaGlsZCBjbGlwcGluZyBMYXllciIpOworI2Vu
ZGlmCisgICAgICAgICAgICBtX2NsaXBwaW5nTGF5ZXItPnNldE1hc2tzVG9Cb3VuZHModHJ1ZSk7
CisgICAgICAgICAgICBsYXllcnNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxz
ZSBpZiAobV9jbGlwcGluZ0xheWVyKSB7CisgICAgICAgIG1fY2xpcHBpbmdMYXllci0+cmVtb3Zl
RnJvbVBhcmVudCgpOworICAgICAgICBkZWxldGUgbV9jbGlwcGluZ0xheWVyOworICAgICAgICBt
X2NsaXBwaW5nTGF5ZXIgPSAwOworICAgICAgICBsYXllcnNDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9
CisgICAgCisgICAgaWYgKGxheWVyc0NoYW5nZWQpCisgICAgICAgIHVwZGF0ZUludGVybmFsSGll
cmFyY2h5KCk7CisKKyAgICByZXR1cm4gbGF5ZXJzQ2hhbmdlZDsKK30KKworYm9vbCBSZW5kZXJM
YXllckJhY2tpbmc6OnVwZGF0ZUNvbnRlbnRzTGF5ZXIoYm9vbCBuZWVkc0NvbnRlbnRzTGF5ZXIp
Cit7CisgICAgYm9vbCBsYXllckNoYW5nZWQgPSBmYWxzZTsKKyAgICBpZiAobmVlZHNDb250ZW50
c0xheWVyKSB7CisgICAgICAgIGlmICghbV9jb250ZW50c0xheWVyKSB7CisgICAgICAgICAgICBt
X2NvbnRlbnRzTGF5ZXIgPSBHcmFwaGljc0xheWVyOjpjcmVhdGVHcmFwaGljc0xheWVyKHRoaXMp
OworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICAgIG1fY29udGVudHNMYXllci0+c2V0TmFtZSgi
Q29udGVudHMiKTsKKyNlbmRpZgorICAgICAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXREcmF3
c0NvbnRlbnQodHJ1ZSk7CisgICAgICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldERyYXdpbmdQ
aGFzZShHcmFwaGljc0xheWVyUGFpbnRGb3JlZ3JvdW5kTWFzayk7CisgICAgICAgICAgICBtX2dy
YXBoaWNzTGF5ZXItPnNldERyYXdpbmdQaGFzZShHcmFwaGljc0xheWVyUGFpbnRCYWNrZ3JvdW5k
TWFzayk7CisgICAgICAgICAgICBsYXllckNoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAg
fSBlbHNlIGlmIChtX2NvbnRlbnRzTGF5ZXIpIHsKKyAgICAgICAgbV9jb250ZW50c0xheWVyLT5y
ZW1vdmVGcm9tUGFyZW50KCk7CisgICAgICAgIGRlbGV0ZSBtX2NvbnRlbnRzTGF5ZXI7CisgICAg
ICAgIG1fY29udGVudHNMYXllciA9IDA7CisgICAgICAgIG1fZ3JhcGhpY3NMYXllci0+c2V0RHJh
d2luZ1BoYXNlKEdyYXBoaWNzTGF5ZXJQYWludEFsbE1hc2spOworICAgICAgICBsYXllckNoYW5n
ZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gbGF5ZXJDaGFuZ2VkOworfQorCitmbG9hdCBS
ZW5kZXJMYXllckJhY2tpbmc6OmNvbXBvc2l0aW5nT3BhY2l0eShmbG9hdCByZW5kZXJlck9wYWNp
dHkpIGNvbnN0Cit7CisgICAgZmxvYXQgZmluYWxPcGFjaXR5ID0gcmVuZGVyZXJPcGFjaXR5Owor
ICAgIAorICAgIGZvciAoUmVuZGVyTGF5ZXIqIGN1cnIgPSBtX293bmluZ0xheWVyLT5wYXJlbnQo
KTsgY3VycjsgY3VyciA9IGN1cnItPnBhcmVudCgpKSB7CisgICAgICAgIC8vIFdlIG9ubHkgY2Fy
ZSBhYm91dCBwYXJlbnRzIHRoYXQgYXJlIHN0YWNraW5nIGNvbnRleHRzLgorICAgICAgICAvLyBS
ZWNhbGwgdGhhdCBvcGFjaXR5IGNyZWF0ZXMgc3RhY2tpbmcgY29udGV4dC4KKyAgICAgICAgaWYg
KCFjdXJyLT5pc1N0YWNraW5nQ29udGV4dCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgIAorICAgICAgICAvLyBJZiB3ZSBmb3VuZCBhIGNvbXBvc2l0aW5nIGxheWVyLCB3ZSB3YW50
IHRvIGNvbXB1dGUgb3BhY2l0eQorICAgICAgICAvLyByZWxhdGl2ZSB0byBpdC4gU28gd2UgY2Fu
IGJyZWFrIGhlcmUuCisgICAgICAgIGlmIChjdXJyLT5pc0NvbXBvc2l0ZWQoKSkKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgZmluYWxPcGFjaXR5ICo9IGN1cnItPnJlbmRl
cmVyKCktPm9wYWNpdHkoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmluYWxPcGFjaXR5OworfQor
CisvLyBBIHNpbXBsZSBiYWNrZ3JvdW5kIGlzIGVpdGhlciBub25lIG9yIGEgc29saWQgY29sb3Iu
CitzdGF0aWMgYm9vbCBoYXNTaW1wbGVCYWNrZ3JvdW5kKFJlbmRlclN0eWxlKiBzdHlsZSkKK3sK
KyAgICByZXR1cm4gIXN0eWxlLT5oYXNCYWNrZ3JvdW5kSW1hZ2UoKTsKK30KKworc3RhdGljIGJv
b2wgaGFzQm9yZGVyT3V0bGluZU9yU2hhZG93KFJlbmRlclN0eWxlKiBzdHlsZSkKK3sKKyAgICBy
ZXR1cm4gKHN0eWxlLT5oYXNCb3JkZXIoKSB8fCBzdHlsZS0+aGFzQm9yZGVyUmFkaXVzKCkgfHwg
c3R5bGUtPmhhc091dGxpbmUoKSB8fCAoc3R5bGUtPmJveFNoYWRvdygpICE9IDApKTsKK30KKwor
Ym9vbCBSZW5kZXJMYXllckJhY2tpbmc6OnJlbmRlcmVySGFzQmFja2dyb3VuZCgpIGNvbnN0Cit7
CisgICAgLy8gRklYTUU6IHNoYXJlIG1vcmUgY29kZSBoZXJlCisgICAgaWYgKHJlbmRlcmVyKCkt
Pm5vZGUoKS0+aXNEb2N1bWVudE5vZGUoKSkgeworICAgICAgICBSZW5kZXJPYmplY3QqIGh0bWxP
YmplY3QgPSByZW5kZXJlcigpLT5maXJzdENoaWxkKCk7CisgICAgICAgIGlmICghaHRtbE9iamVj
dCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIFJlbmRlclN0
eWxlKiBzdHlsZSA9IGh0bWxPYmplY3QtPnN0eWxlKCk7CisgICAgICAgIGlmIChzdHlsZS0+aGFz
QmFja2dyb3VuZCgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIAorICAgICAg
ICBSZW5kZXJPYmplY3QqIGJvZHlPYmplY3QgPSBodG1sT2JqZWN0LT5maXJzdENoaWxkKCk7Cisg
ICAgICAgIGlmICghYm9keU9iamVjdCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgCisgICAgICAgIHN0eWxlID0gYm9keU9iamVjdC0+c3R5bGUoKTsKKyAgICAgICAgcmV0dXJu
IHN0eWxlLT5oYXNCYWNrZ3JvdW5kKCk7CisgICAgfQorICAgIAorICAgIHJldHVybiByZW5kZXJl
cigpLT5zdHlsZSgpLT5oYXNCYWNrZ3JvdW5kKCk7Cit9CisKK2NvbnN0IENvbG9yJiBSZW5kZXJM
YXllckJhY2tpbmc6OnJlbmRlcmVyQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICAvLyBG
SVhNRTogc2hhcmUgbW9yZSBjb2RlIGhlcmUKKyAgICBpZiAocmVuZGVyZXIoKS0+bm9kZSgpLT5p
c0RvY3VtZW50Tm9kZSgpKSB7CisgICAgICAgIFJlbmRlck9iamVjdCogaHRtbE9iamVjdCA9IHJl
bmRlcmVyKCktPmZpcnN0Q2hpbGQoKTsKKyAgICAgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gaHRt
bE9iamVjdC0+c3R5bGUoKTsKKyAgICAgICAgaWYgKHN0eWxlLT5oYXNCYWNrZ3JvdW5kKCkpCisg
ICAgICAgICAgICByZXR1cm4gc3R5bGUtPmJhY2tncm91bmRDb2xvcigpOworCisgICAgICAgIFJl
bmRlck9iamVjdCogYm9keU9iamVjdCA9IGh0bWxPYmplY3QtPmZpcnN0Q2hpbGQoKTsKKyAgICAg
ICAgc3R5bGUgPSBib2R5T2JqZWN0LT5zdHlsZSgpOworICAgICAgICByZXR1cm4gc3R5bGUtPmJh
Y2tncm91bmRDb2xvcigpOworICAgIH0KKworICAgIHJldHVybiByZW5kZXJlcigpLT5zdHlsZSgp
LT5iYWNrZ3JvdW5kQ29sb3IoKTsKK30KKworYm9vbCBSZW5kZXJMYXllckJhY2tpbmc6OmNhbkJl
U2ltcGxlQ29udGFpbmVyQ29tcG9zaXRpbmdMYXllcigpIGNvbnN0Cit7CisgICAgUmVuZGVyT2Jq
ZWN0KiByZW5kZXJPYmplY3QgPSByZW5kZXJlcigpOworICAgIGlmIChyZW5kZXJPYmplY3QtPmlz
UmVwbGFjZWQoKSB8fCAgICAgICAvLyByZXBsYWNlZCBvYmplY3RzIGFyZSBub3QgY29udGFpbmVy
cworICAgICAgICByZW5kZXJPYmplY3QtPmhhc01hc2soKSkgICAgICAgICAgICAvLyBtYXNrcyBy
ZXF1aXJlIHNwZWNpYWwgdHJlYXRtZW50CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFJl
bmRlclN0eWxlKiBzdHlsZSA9IHJlbmRlck9iamVjdC0+c3R5bGUoKTsKKworICAgIC8vIFJlamVj
dCBhbnl0aGluZyB0aGF0IGhhcyBhIGJvcmRlciwgYSBib3JkZXItcmFkaXVzIG9yIG91dGxpbmUs
CisgICAgLy8gb3IgYW55IGJhY2tncm91bmQgKGNvbG9yIG9yIGltYWdlKS4KKyAgICAvLyBGSVhN
RTogd2UgY291bGQgb3B0aW1pemUgbGF5ZXJzIGZvciBzaW1wbGUgYmFja2dyb3VuZHMuCisgICAg
aWYgKGhhc0JvcmRlck91dGxpbmVPclNoYWRvdyhzdHlsZSkgfHwKKyAgICAgICAgc3R5bGUtPmhh
c0JhY2tncm91bmQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWYgd2UgaGF2
ZSBnb3QgdGhpcyBmYXIgYW5kIHRoZSByZW5kZXJlciBoYXMgbm8gY2hpbGRyZW4sIHRoZW4gd2Un
cmUgb2suCisgICAgaWYgKCFyZW5kZXJPYmplY3QtPmZpcnN0Q2hpbGQoKSkKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgCisgICAgaWYgKHJlbmRlck9iamVjdC0+bm9kZSgpLT5pc0RvY3VtZW50
Tm9kZSgpKSB7CisgICAgICAgIC8vIExvb2sgdG8gc2VlIGlmIHRoZSByb290IG9iamVjdCBoYXMg
YSBub24tc2ltcGxlIGJhY2tnb3VuZAorICAgICAgICBSZW5kZXJPYmplY3QqIHJvb3RPYmplY3Qg
PSByZW5kZXJPYmplY3QtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpLT5yZW5kZXJlcigp
OworICAgICAgICBpZiAoIXJvb3RPYmplY3QpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIAorICAgICAgICBzdHlsZSA9IHJvb3RPYmplY3QtPnN0eWxlKCk7CisgICAgICAgIAor
ICAgICAgICAvLyBSZWplY3QgYW55dGhpbmcgdGhhdCBoYXMgYSBib3JkZXIsIGEgYm9yZGVyLXJh
ZGl1cyBvciBvdXRsaW5lLAorICAgICAgICAvLyBvciBpcyBub3QgYSBzaW1wbGUgYmFja2dyb3Vu
ZCAobm8gYmFja2dyb3VuZCwgb3Igc29saWQgY29sb3IpLgorICAgICAgICBpZiAoaGFzQm9yZGVy
T3V0bGluZU9yU2hhZG93KHN0eWxlKSB8fAorICAgICAgICAgICAgIWhhc1NpbXBsZUJhY2tncm91
bmQoc3R5bGUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAg
Ly8gTm93IGxvb2sgYXQgdGhlIGJvZHkncyByZW5kZXJlci4KKyAgICAgICAgSFRNTEVsZW1lbnQq
IGJvZHkgPSByZW5kZXJPYmplY3QtPmRvY3VtZW50KCktPmJvZHkoKTsKKyAgICAgICAgUmVuZGVy
T2JqZWN0KiBib2R5T2JqZWN0ID0gKGJvZHkgJiYgYm9keS0+aGFzTG9jYWxOYW1lKEhUTUxOYW1l
czo6Ym9keVRhZykpID8gYm9keS0+cmVuZGVyZXIoKSA6IDA7CisgICAgICAgIGlmICghYm9keU9i
amVjdCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIHN0eWxl
ID0gYm9keU9iamVjdC0+c3R5bGUoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChoYXNCb3JkZXJP
dXRsaW5lT3JTaGFkb3coc3R5bGUpIHx8CisgICAgICAgICAgICAhaGFzU2ltcGxlQmFja2dyb3Vu
ZChzdHlsZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gQ2VjayB0
byBzZWUgaWYgYWxsIHRoZSBib2R5J3MgY2hpbGRyZW4gYXJlIGNvbXBvc2l0aW5nIGxheWVycy4K
KyAgICAgICAgaWYgKGhhc05vbkNvbXBvc2l0aW5nQ29udGVudCgpKQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAg
Ly8gQ2hlY2sgdG8gc2VlIGlmIGFsbCB0aGUgcmVuZGVyZXIncyBjaGlsZHJlbiBhcmUgY29tcG9z
aXRpbmcgbGF5ZXJzLgorICAgIGlmIChoYXNOb25Db21wb3NpdGluZ0NvbnRlbnQoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFJlbmRl
ckxheWVyQmFja2luZzo6aGFzTm9uQ29tcG9zaXRpbmdDb250ZW50KCkgY29uc3QKK3sKKyAgICAv
LyBDb25zZXJ2YXRpdmUgdGVzdCBmb3IgaGF2aW5nIG5vIHJlbmRlcmVkIGNoaWxkcmVuLgorICAg
IAorICAgIC8vIFNvbWUgSFRNTCBjYW4gY2F1c2Ugd2hpdGVzcGFjZSB0ZXh0IG5vZGVzIHRvIGhh
dmUgcmVuZGVyZXJzLCBsaWtlOgorICAgIC8vIDxkaXY+CisgICAgLy8gPGltZyBzcmM9Li4uPgor
ICAgIC8vIDwvZGl2PgorICAgIC8vIHNvIHRlc3QgZm9yIDB4MCBSZW5kZXJUZXh0cyBoZXJlCisg
ICAgZm9yIChSZW5kZXJPYmplY3QqIGNoaWxkID0gcmVuZGVyZXIoKS0+Zmlyc3RDaGlsZCgpOyBj
aGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgeworICAgICAgICBpZiAoIWNoaWxk
LT5oYXNMYXllcigpICYmIGNoaWxkLT5pc0JveCgpICYmIChSZW5kZXJCb3g6OnRvUmVuZGVyQm94
KGNoaWxkKS0+d2lkdGgoKSA+IDAgfHwgUmVuZGVyQm94Ojp0b1JlbmRlckJveChjaGlsZCktPmhl
aWdodCgpID4gMCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBG
SVhNRTogdGVzdCBmb3Igb3ZlcmZsb3cgY29udHJvbHMuCisgICAgaWYgKG1fb3duaW5nTGF5ZXIt
PmlzU3RhY2tpbmdDb250ZXh0KCkpIHsKKyAgICAgICAgLy8gVXNlIHRoZSBtX2hhc0NvbXBvc2l0
aW5nRGVzY2VuZGFudCBiaXQgdG8gb3B0aW1pemU/CisgICAgICAgIFZlY3RvcjxSZW5kZXJMYXll
cio+KiBuZWdaT3JkZXJMaXN0ID0gbV9vd25pbmdMYXllci0+bmVnWk9yZGVyTGlzdCgpOworICAg
ICAgICBpZiAobmVnWk9yZGVyTGlzdCAmJiBuZWdaT3JkZXJMaXN0LT5zaXplKCkgPiAwKSB7Cisg
ICAgICAgICAgICBmb3IgKFZlY3RvcjxSZW5kZXJMYXllcio+Ojpjb25zdF9pdGVyYXRvciBpdCA9
IG5lZ1pPcmRlckxpc3QtPmJlZ2luKCk7IGl0ICE9IG5lZ1pPcmRlckxpc3QtPmVuZCgpOyArK2l0
KSB7CisgICAgICAgICAgICAgICAgUmVuZGVyTGF5ZXIqIGN1ckxheWVyID0gKCppdCk7CisgICAg
ICAgICAgICAgICAgaWYgKCFjdXJMYXllci0+aXNDb21wb3NpdGVkKCkpCisgICAgICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg
VmVjdG9yPFJlbmRlckxheWVyKj4qIHBvc1pPcmRlckxpc3QgPSBtX293bmluZ0xheWVyLT5wb3Na
T3JkZXJMaXN0KCk7CisgICAgICAgIGlmIChwb3NaT3JkZXJMaXN0ICYmIHBvc1pPcmRlckxpc3Qt
PnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoVmVjdG9yPFJlbmRlckxheWVyKj46OmNv
bnN0X2l0ZXJhdG9yIGl0ID0gcG9zWk9yZGVyTGlzdC0+YmVnaW4oKTsgaXQgIT0gcG9zWk9yZGVy
TGlzdC0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBSZW5kZXJMYXllciogY3VyTGF5
ZXIgPSAoKml0KTsKKyAgICAgICAgICAgICAgICBpZiAoIWN1ckxheWVyLT5pc0NvbXBvc2l0ZWQo
KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICBWZWN0b3I8UmVuZGVyTGF5ZXIqPiogb3ZlcmZsb3dMaXN0ID0g
bV9vd25pbmdMYXllci0+b3ZlcmZsb3dMaXN0KCk7CisgICAgaWYgKG92ZXJmbG93TGlzdCAmJiBv
dmVyZmxvd0xpc3QtPnNpemUoKSA+IDApIHsKKyAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyTGF5
ZXIqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBvdmVyZmxvd0xpc3QtPmJlZ2luKCk7IGl0ICE9IG92
ZXJmbG93TGlzdC0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIFJlbmRlckxheWVyKiBjdXJM
YXllciA9ICgqaXQpOworICAgICAgICAgICAgaWYgKCFjdXJMYXllci0+aXNDb21wb3NpdGVkKCkp
CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKKy8vIEEgInNpbXBsZSBjb250YWluZXIgbGF5ZXIiIGlzIGEgUmVu
ZGVyTGF5ZXIgd2hpY2ggaGFzIG5vIHZpc2libGUgY29udGVudCB0byByZW5kZXIuCisvLyBJdCBt
YXkgaGF2ZSBubyBjaGlsZHJlbiwgb3IgYWxsIGl0cyBjaGlsZHJlbiBtYXkgYmUgdGhlbXNlbHZl
cyBjb21wb3NpdGVkLgorLy8gVGhpcyBpcyBhIHVzZWZ1bCBvcHRpbWl6YXRpb24sIGJlY2F1c2Ug
aXQgYWxsb3dzIHVzIHRvIGF2b2lkIGFsbG9jYXRpbmcgYmFja2luZyBzdG9yZS4KK2Jvb2wgUmVu
ZGVyTGF5ZXJCYWNraW5nOjppc1NpbXBsZUNvbnRhaW5lckNvbXBvc2l0aW5nTGF5ZXIoKQorewor
ICAgIGlmIChtX3NpbXBsZUNvbXBvc2l0aW5nTGF5ZXJTdGF0dXNEaXJ0eSkgeworICAgICAgICBt
X2lzU2ltcGxlQ29udGFpbmVyQ29tcG9zaXRpbmdMYXllciA9IGNhbkJlU2ltcGxlQ29udGFpbmVy
Q29tcG9zaXRpbmdMYXllcigpOworICAgICAgICBtX3NpbXBsZUNvbXBvc2l0aW5nTGF5ZXJTdGF0
dXNEaXJ0eSA9IGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBtX2lzU2ltcGxlQ29udGFpbmVy
Q29tcG9zaXRpbmdMYXllcjsKK30KKwordm9pZCBSZW5kZXJMYXllckJhY2tpbmc6OmRldGVjdERy
YXdpbmdPcHRpbWl6YXRpb25zKCkKK3sKKyAgICBib29sIGRyYXdzQ29udGVudCA9IHRydWU7CisK
KyAgICBpZiAoaXNTaW1wbGVDb250YWluZXJDb21wb3NpdGluZ0xheWVyKCkgfHwgcGFpbnRpbmdH
b2VzVG9XaW5kb3coKSkKKyAgICAgICAgZHJhd3NDb250ZW50ID0gZmFsc2U7CisKKyAgICBtX2dy
YXBoaWNzTGF5ZXItPnNldERyYXdzQ29udGVudChkcmF3c0NvbnRlbnQpOworfQorCit2b2lkIFJl
bmRlckxheWVyQmFja2luZzo6aW52YWxpZGF0ZURyYXdpbmdPcHRpbWl6YXRpb25zKCkKK3sKKyAg
ICBtX3NpbXBsZUNvbXBvc2l0aW5nTGF5ZXJTdGF0dXNEaXJ0eSA9IHRydWU7Cit9CisKK3ZvaWQg
UmVuZGVyTGF5ZXJCYWNraW5nOjpmb3JjZUNvbXBvc2l0aW5nTGF5ZXIoYm9vbCBmb3JjZSkKK3sK
KyAgICBtX2ZvcmNlQ29tcG9zaXRpbmdMYXllciA9IGZvcmNlOworfQorCitGbG9hdFBvaW50IFJl
bmRlckxheWVyQmFja2luZzo6Y29tcHV0ZVRyYW5zZm9ybU9yaWdpbihjb25zdCBJbnRSZWN0JiBi
b3JkZXJCb3gpIGNvbnN0Cit7CisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gcmVuZGVyZXIoKS0+
c3R5bGUoKTsKKworICAgIEZsb2F0UG9pbnQgb3JpZ2luOworICAgIG9yaWdpbi5zZXRYKHN0eWxl
LT50cmFuc2Zvcm1PcmlnaW5YKCkuY2FsY0Zsb2F0VmFsdWUoYm9yZGVyQm94LndpZHRoKCkpKTsK
KyAgICBvcmlnaW4uc2V0WShzdHlsZS0+dHJhbnNmb3JtT3JpZ2luWSgpLmNhbGNGbG9hdFZhbHVl
KGJvcmRlckJveC5oZWlnaHQoKSkpOworCisgICAgcmV0dXJuIG9yaWdpbjsKK30KKworLy8gUmV0
dXJuIHRoZSBvZmZzZXQgZnJvbSB0aGUgdG9wLWxlZnQgb2YgdGhpcyBjb21wb3NpdGluZyBsYXll
ciBhdCB3aGljaCB0aGUgcmVuZGVyZXIncyBjb250ZW50cyBhcmUgcGFpbnRlZC4KK0ludFNpemUg
UmVuZGVyTGF5ZXJCYWNraW5nOjpjb250ZW50T2Zmc2V0SW5Db21wb3N0aW5nTGF5ZXIoKQorewor
ICAgIGlmICghbV9jb21wb3NpdGluZ0NvbnRlbnRPZmZzZXREaXJ0eSkKKyAgICAgICAgcmV0dXJu
IG1fY29tcG9zaXRpbmdDb250ZW50T2Zmc2V0OworCisgICAgSW50UmVjdCByZWxhdGl2ZUNvbXBv
c2l0aW5nQm91bmRzID0gY29tcG9zaXRvcigpLT5jYWxjdWxhdGVDb21wb3NpdGVkQm91bmRzKG1f
b3duaW5nTGF5ZXIsIG1fb3duaW5nTGF5ZXIpOworICAgIG1fY29tcG9zaXRpbmdDb250ZW50T2Zm
c2V0ID0gSW50U2l6ZSgtcmVsYXRpdmVDb21wb3NpdGluZ0JvdW5kcy54KCksIC1yZWxhdGl2ZUNv
bXBvc2l0aW5nQm91bmRzLnkoKSk7CisgICAgbV9jb21wb3NpdGluZ0NvbnRlbnRPZmZzZXREaXJ0
eSA9IGZhbHNlOworCisgICAgcmV0dXJuIG1fY29tcG9zaXRpbmdDb250ZW50T2Zmc2V0OworfQor
CitJbnRSZWN0IFJlbmRlckxheWVyQmFja2luZzo6Y29udGVudHNCb3goY29uc3QgR3JhcGhpY3NM
YXllciopCit7CisgICAgSW50UmVjdCBjb250ZW50c1JlY3QgPSByZW5kZXJlcigpLT5jb250ZW50
Qm94UmVjdCgpOworICAgIEludFNpemUgY29udGVudE9mZnNldCA9IGNvbnRlbnRPZmZzZXRJbkNv
bXBvc3RpbmdMYXllcigpOworICAgIGNvbnRlbnRzUmVjdC5tb3ZlKGNvbnRlbnRPZmZzZXQpOwor
ICAgIHJldHVybiBjb250ZW50c1JlY3Q7Cit9CisKKy8vIE1hcCB0aGUgZ2l2ZW4gcG9pbnQgZnJv
bSBjb29yZGluYXRlcyBpbiB0aGUgR3JhcGhpY3NMYXllciB0byBSZW5kZXJMYXllciBjb29yZGlu
YXRlcy4KK0Zsb2F0UG9pbnQgUmVuZGVyTGF5ZXJCYWNraW5nOjpncmFwaGljc0xheWVyVG9Db250
ZW50c0Nvb3JkaW5hdGVzKGNvbnN0IEdyYXBoaWNzTGF5ZXIqIGdyYXBoaWNzTGF5ZXIsIGNvbnN0
IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIHJldHVybiBwb2ludCArIEZsb2F0U2l6ZShncmFw
aGljc0xheWVyLT5vZmZzZXRGcm9tUmVuZGVyZXIoKSk7Cit9CisKKy8vIE1hcCB0aGUgZ2l2ZW4g
cG9pbnQgZnJvbSBjb29yZGluYXRlcyBpbiB0aGUgUmVuZGVyTGF5ZXIgdG8gR3JhcGhpY3NMYXll
ciBjb29yZGluYXRlcy4KK0Zsb2F0UG9pbnQgUmVuZGVyTGF5ZXJCYWNraW5nOjpjb250ZW50c1Rv
R3JhcGhpY3NMYXllckNvb3JkaW5hdGVzKGNvbnN0IEdyYXBoaWNzTGF5ZXIqIGdyYXBoaWNzTGF5
ZXIsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIHJldHVybiBwb2ludCAtIEZsb2F0
U2l6ZShncmFwaGljc0xheWVyLT5vZmZzZXRGcm9tUmVuZGVyZXIoKSk7Cit9CisKK2Jvb2wgUmVu
ZGVyTGF5ZXJCYWNraW5nOjpwYWludGluZ0dvZXNUb1dpbmRvdygpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fb3duaW5nTGF5ZXItPmlzRG9jdW1lbnRMYXllcigpOworfQorCit2b2lkIFJlbmRlckxh
eWVyQmFja2luZzo6c2V0Q29udGVudHNOZWVkRGlzcGxheSgpCit7CisgICAgaWYgKG1fZ3JhcGhp
Y3NMYXllcikKKyAgICAgICAgbV9ncmFwaGljc0xheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKKyAg
ICBpZiAobV9jb250ZW50c0xheWVyKQorICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldE5lZWRz
RGlzcGxheSgpOworfQorCisvLyByIGlzIGluIHRoZSBjb29yZGluYXRlIHNwYWNlIG9mIHRoZSBs
YXllcidzIHJlbmRlciBvYmplY3QKK3ZvaWQgUmVuZGVyTGF5ZXJCYWNraW5nOjpzZXRDb250ZW50
c05lZWREaXNwbGF5SW5SZWN0KGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgaWYgKG1fZ3JhcGhp
Y3NMYXllcikgeworICAgICAgICBGbG9hdFBvaW50IGRpcnR5T3JpZ2luID0gY29udGVudHNUb0dy
YXBoaWNzTGF5ZXJDb29yZGluYXRlcyhtX2dyYXBoaWNzTGF5ZXIsIEZsb2F0UG9pbnQoci54KCks
IHIueSgpKSk7CisgICAgICAgIEZsb2F0UmVjdCBkaXJ0eVJlY3QoZGlydHlPcmlnaW4sIHIuc2l6
ZSgpKTsKKyAgICAgICAgRmxvYXRSZWN0IGJvdW5kcyhGbG9hdFBvaW50KCksIG1fZ3JhcGhpY3NM
YXllci0+c2l6ZSgpKTsKKyAgICAgICAgaWYgKGJvdW5kcy5pbnRlcnNlY3RzKGRpcnR5UmVjdCkp
CisgICAgICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPnNldE5lZWRzRGlzcGxheUluUmVjdChkaXJ0
eVJlY3QpOworICAgIH0KKworICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpIHsKKyAgICAgICAgLy8g
RklYTUU6IGRvIGluY3JlbWVudGFsIHJlcGFpbnQKKyAgICAgICAgbV9jb250ZW50c0xheWVyLT5z
ZXROZWVkc0Rpc3BsYXkoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNldENsaXAoR3JhcGhp
Y3NDb250ZXh0KiBwLCBjb25zdCBJbnRSZWN0JiBwYWludERpcnR5UmVjdCwgY29uc3QgSW50UmVj
dCYgY2xpcFJlY3QpCit7CisgICAgaWYgKHBhaW50RGlydHlSZWN0ID09IGNsaXBSZWN0KQorICAg
ICAgICByZXR1cm47CisgICAgcC0+c2F2ZSgpOworICAgIHAtPmNsaXAoY2xpcFJlY3QpOworfQor
CitzdGF0aWMgdm9pZCByZXN0b3JlQ2xpcChHcmFwaGljc0NvbnRleHQqIHAsIGNvbnN0IEludFJl
Y3QmIHBhaW50RGlydHlSZWN0LCBjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCkKK3sKKyAgICBpZiAo
cGFpbnREaXJ0eVJlY3QgPT0gY2xpcFJlY3QpCisgICAgICAgIHJldHVybjsKKyAgICBwLT5yZXN0
b3JlKCk7Cit9CisKKy8vIFNoYXJlIHRoaXMgd2l0aCBSZW5kZXJMYXllcjo6cGFpbnRMYXllciwg
d2hpY2ggd291bGQgaGF2ZSB0byBiZSBlZHVjYXRlZCBhYm91dCBHcmFwaGljc0xheWVyUGFpbnRp
bmdQaGFzZT8KK3ZvaWQgUmVuZGVyTGF5ZXJCYWNraW5nOjpwYWludEludG9MYXllcihSZW5kZXJM
YXllciogcm9vdExheWVyLCBHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IEludFJlY3QmIHBhaW50RGlydHlSZWN0LCAgICAgIC8vIGluIHRoZSBjb29y
ZHMgb2Ygcm9vdExheWVyCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaGF2ZVRyYW5zcGFyZW5j
eSwgUGFpbnRSZXN0cmljdGlvbiBwYWludFJlc3RyaWN0aW9uLCBHcmFwaGljc0xheWVyUGFpbnRp
bmdQaGFzZSBwYWludGluZ1BoYXNlLAorICAgICAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3Qq
IHBhaW50aW5nUm9vdCkKK3sKKyAgICBpZiAocGFpbnRpbmdHb2VzVG9XaW5kb3coKSkgeworICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAK
KyAgICBpZiAobV9vd25pbmdMYXllci0+aXNTdGFja2luZ0NvbnRleHQoKSAmJiAobV9vd25pbmdM
YXllci0+bV96T3JkZXJMaXN0c0RpcnR5IHx8IG1fb3duaW5nTGF5ZXItPm1fb3ZlcmZsb3dMaXN0
RGlydHkpKQorICAgICAgICBjb21wb3NpdG9yKCktPnVwZGF0ZUNvbXBvc2l0aW5nTGF5ZXJzKG1f
b3duaW5nTGF5ZXIpOworICAgIAorICAgIC8vIENhbGN1bGF0ZSB0aGUgY2xpcCByZWN0cyB3ZSBz
aG91bGQgdXNlLgorICAgIEludFJlY3QgbGF5ZXJCb3VuZHMsIGRhbWFnZVJlY3QsIGNsaXBSZWN0
VG9BcHBseSwgb3V0bGluZVJlY3Q7CisgICAgbV9vd25pbmdMYXllci0+Y2FsY3VsYXRlUmVjdHMo
cm9vdExheWVyLCBwYWludERpcnR5UmVjdCwgbGF5ZXJCb3VuZHMsIGRhbWFnZVJlY3QsIGNsaXBS
ZWN0VG9BcHBseSwgb3V0bGluZVJlY3QpOworICAgIAorICAgIGludCB4ID0gbGF5ZXJCb3VuZHMu
eCgpOyAgICAgICAgLy8gbGF5ZXJCb3VuZHMgaXMgY29tcHV0ZWQgcmVsYXRpdmUgdG8gcm9vdExh
eWVyCisgICAgaW50IHkgPSBsYXllckJvdW5kcy55KCk7CisgICAgaW50IHR4ID0geCAtIHJlbmRl
cmVyKCktPngoKTsKKyAgICBpbnQgdHkgPSB5IC0gcmVuZGVyZXIoKS0+eSgpICsgcmVuZGVyZXIo
KS0+Ym9yZGVyVG9wRXh0cmEoKTsKKworICAgIC8vIElmIHRoaXMgbGF5ZXIncyByZW5kZXJlciBp
cyBhIGNoaWxkIG9mIHRoZSBwYWludGluZ1Jvb3QsIHdlIHJlbmRlciB1bmNvbmRpdGlvbmFsbHks
IHdoaWNoCisgICAgLy8gaXMgZG9uZSBieSBwYXNzaW5nIGEgbmlsIHBhaW50aW5nUm9vdCBkb3du
IHRvIG91ciByZW5kZXJlciAoYXMgaWYgbm8gcGFpbnRpbmdSb290IHdhcyBldmVyIHNldCkuCisg
ICAgLy8gRWxzZSwgb3VyIHJlbmRlcmVyIHRyZWUgbWF5IG9yIG1heSBub3QgY29udGFpbiB0aGUg
cGFpbnRpbmcgcm9vdCwgc28gd2UgcGFzcyB0aGF0IHJvb3QgYWxvbmcKKyAgICAvLyBzbyBpdCB3
aWxsIGJlIHRlc3RlZCBhZ2FpbnN0IGFzIHdlIGRlY2VuZCB0aHJvdWdoIHRoZSByZW5kZXJlcnMu
CisgICAgUmVuZGVyT2JqZWN0ICpwYWludGluZ1Jvb3RGb3JSZW5kZXJlciA9IDA7CisgICAgaWYg
KHBhaW50aW5nUm9vdCAmJiAhcmVuZGVyZXIoKS0+aXNEZXNjZW5kYW50T2YocGFpbnRpbmdSb290
KSkKKyAgICAgICAgcGFpbnRpbmdSb290Rm9yUmVuZGVyZXIgPSBwYWludGluZ1Jvb3Q7CisKKyAg
ICBpZiAocGFpbnRpbmdQaGFzZSAmIEdyYXBoaWNzTGF5ZXJQYWludEJhY2tncm91bmRNYXNrKSB7
CisgICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIHJvb3QgdGhlbiB3ZSBuZWVkIHRvIHNlbmQgaW4g
YSBiaWdnZXIgYm91bmRpbmcgYm94CisgICAgICAgIC8vIGJlY2F1c2Ugd2UnbGwgYmUgcGFpbnRp
bmcgdGhlIGJhY2tncm91bmQgYXMgd2VsbCAoc2VlIFJlbmRlckJveDo6cGFpbnRSb290Qm94RGVj
b3JhdGlvbnMoKSkuCisgICAgICAgIEludFJlY3QgcGFpbnRCb3ggPSBjbGlwUmVjdFRvQXBwbHk7
CisgICAgICAgIAorICAgICAgICBpZiAocmVuZGVyZXIoKS0+bm9kZSgpLT5pc0RvY3VtZW50Tm9k
ZSgpICYmIHJlbmRlcmVyKCktPmRvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkpIHsKKyAgICAg
ICAgICAgIGludCB3ID0gcmVuZGVyZXIoKS0+d2lkdGgoKTsKKyAgICAgICAgICAgIGludCBoID0g
cmVuZGVyZXIoKS0+aGVpZ2h0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBydzsK
KyAgICAgICAgICAgIGludCByaDsKKyAgICAgICAgICAgIGlmIChyZW5kZXJlcigpLT52aWV3KCkt
PmZyYW1lVmlldygpKSB7CisgICAgICAgICAgICAgICAgcncgPSByZW5kZXJlcigpLT52aWV3KCkt
PmZyYW1lVmlldygpLT5jb250ZW50c1dpZHRoKCk7CisgICAgICAgICAgICAgICAgcmggPSByZW5k
ZXJlcigpLT52aWV3KCktPmZyYW1lVmlldygpLT5jb250ZW50c0hlaWdodCgpOworICAgICAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBydyA9IHJlbmRlcmVyKCktPnZpZXcoKS0+d2lk
dGgoKTsKKyAgICAgICAgICAgICAgICByaCA9IHJlbmRlcmVyKCktPnZpZXcoKS0+aGVpZ2h0KCk7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBieCA9IHR4IC0g
cmVuZGVyZXIoKS0+bWFyZ2luTGVmdCgpOworICAgICAgICAgICAgaW50IGJ5ID0gdHkgLSByZW5k
ZXJlcigpLT5tYXJnaW5Ub3AoKTsKKyAgICAgICAgICAgIGludCBidyA9IG1heCh3ICsgcmVuZGVy
ZXIoKS0+bWFyZ2luTGVmdCgpICsgcmVuZGVyZXIoKS0+bWFyZ2luUmlnaHQoKSArIHJlbmRlcmVy
KCktPmJvcmRlckxlZnQoKSArIHJlbmRlcmVyKCktPmJvcmRlclJpZ2h0KCksIHJ3KTsKKyAgICAg
ICAgICAgIGludCBiaCA9IG1heChoICsgcmVuZGVyZXIoKS0+bWFyZ2luVG9wKCkgKyByZW5kZXJl
cigpLT5tYXJnaW5Cb3R0b20oKSArIHJlbmRlcmVyKCktPmJvcmRlclRvcCgpICsgcmVuZGVyZXIo
KS0+Ym9yZGVyQm90dG9tKCksIHJoKTsKKyAgICAgICAgICAgIHBhaW50Qm94ID0gSW50UmVjdChi
eCwgYnksIGJ3LCBiaCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQYWludCBvdXIgYmFja2dy
b3VuZCBmaXJzdCwgYmVmb3JlIHBhaW50aW5nIGFueSBjaGlsZCBsYXllcnMuCisgICAgICAgIC8v
IEVzdGFibGlzaCB0aGUgY2xpcCB1c2VkIHRvIHBhaW50IG91ciBiYWNrZ3JvdW5kLgorICAgICAg
ICBzZXRDbGlwKGNvbnRleHQsIHBhaW50RGlydHlSZWN0LCBkYW1hZ2VSZWN0KTsKKyAgICAgICAg
CisgICAgICAgIFJlbmRlck9iamVjdDo6UGFpbnRJbmZvIGluZm8oY29udGV4dCwgcGFpbnRCb3gs
IFBhaW50UGhhc2VCbG9ja0JhY2tncm91bmQsIGZhbHNlLCBwYWludGluZ1Jvb3RGb3JSZW5kZXJl
ciwgMCk7CisgICAgICAgIHJlbmRlcmVyKCktPnBhaW50KGluZm8sIHR4LCB0eSk7CisKKyAgICAg
ICAgLy8gT3VyIHNjcm9sbGJhciB3aWRnZXRzIHBhaW50IGV4YWN0bHkgd2hlbiB3ZSB0ZWxsIHRo
ZW0gdG8sIHNvIHRoYXQgdGhleSB3b3JrIHByb3Blcmx5IHdpdGgKKyAgICAgICAgLy8gei1pbmRl
eC4gIFdlIHBhaW50IGFmdGVyIHdlIHBhaW50ZWQgdGhlIGJhY2tncm91bmQvYm9yZGVyLCBzbyB0
aGF0IHRoZSBzY3JvbGxiYXJzIHdpbGwKKyAgICAgICAgLy8gc2l0IGFib3ZlIHRoZSBiYWNrZ3Jv
dW5kL2JvcmRlci4KKyAgICAgICAgbV9vd25pbmdMYXllci0+cGFpbnRPdmVyZmxvd0NvbnRyb2xz
KGNvbnRleHQsIHgsIHksIGRhbWFnZVJlY3QpOworICAgICAgICAKKyAgICAgICAgLy8gUmVzdG9y
ZSB0aGUgY2xpcC4KKyAgICAgICAgcmVzdG9yZUNsaXAoY29udGV4dCwgcGFpbnREaXJ0eVJlY3Qs
IGRhbWFnZVJlY3QpOworICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICBpZiAocGFpbnRpbmdQ
aGFzZSAmIEdyYXBoaWNzTGF5ZXJQYWludEZvcmVncm91bmRNYXNrKSB7CisgICAgICAgIC8vIE5v
dyB3YWxrIHRoZSBzb3J0ZWQgbGlzdCBvZiBjaGlsZHJlbiB3aXRoIG5lZ2F0aXZlIHotaW5kaWNl
cy4gT25seSBSZW5kZXJMYXllcnMgd2l0aG91dCBjb21wb3NpdGluZyBsYXllcnMgd2lsbCBwYWlu
dC4KKyAgICAgICAgLy8gRklYTUU6IHNob3VsZCB0aGVzZSBiZSBwYWludGVkIGFzIGJhY2tncm91
bmQ/CisgICAgICAgIFZlY3RvcjxSZW5kZXJMYXllcio+KiBuZWdaT3JkZXJMaXN0ID0gbV9vd25p
bmdMYXllci0+bmVnWk9yZGVyTGlzdCgpOworICAgICAgICBpZiAobmVnWk9yZGVyTGlzdCkgewor
ICAgICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyTGF5ZXIqPjo6aXRlcmF0b3IgaXQgPSBuZWda
T3JkZXJMaXN0LT5iZWdpbigpOyBpdCAhPSBuZWdaT3JkZXJMaXN0LT5lbmQoKTsgKytpdCkKKyAg
ICAgICAgICAgICAgICBpdFswXS0+cGFpbnRMYXllcihyb290TGF5ZXIsIGNvbnRleHQsIHBhaW50
RGlydHlSZWN0LCBoYXZlVHJhbnNwYXJlbmN5LCBwYWludFJlc3RyaWN0aW9uLCBwYWludGluZ1Jv
b3QpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBmb3JjZUJsYWNrVGV4dCA9IHBhaW50UmVz
dHJpY3Rpb24gPT0gUGFpbnRSZXN0cmljdGlvblNlbGVjdGlvbk9ubHlCbGFja1RleHQ7CisgICAg
ICAgIGJvb2wgc2VsZWN0aW9uT25seSAgPSBwYWludFJlc3RyaWN0aW9uID09IFBhaW50UmVzdHJp
Y3Rpb25TZWxlY3Rpb25Pbmx5IHx8IHBhaW50UmVzdHJpY3Rpb24gPT0gUGFpbnRSZXN0cmljdGlv
blNlbGVjdGlvbk9ubHlCbGFja1RleHQ7CisKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBjbGlwIHVz
ZWQgd2hlbiBwYWludGluZyBvdXIgY2hpbGRyZW4uCisgICAgICAgIHNldENsaXAoY29udGV4dCwg
cGFpbnREaXJ0eVJlY3QsIGNsaXBSZWN0VG9BcHBseSk7CisgICAgICAgIFJlbmRlck9iamVjdDo6
UGFpbnRJbmZvIHBhaW50SW5mbyhjb250ZXh0LCBjbGlwUmVjdFRvQXBwbHksIAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uT25seSA/IFBhaW50UGhh
c2VTZWxlY3Rpb24gOiBQYWludFBoYXNlQ2hpbGRCbG9ja0JhY2tncm91bmRzLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VCbGFja1RleHQsIHBhaW50aW5n
Um9vdEZvclJlbmRlcmVyLCAwKTsKKyAgICAgICAgcmVuZGVyZXIoKS0+cGFpbnQocGFpbnRJbmZv
LCB0eCwgdHkpOworCisgICAgICAgIGlmICghc2VsZWN0aW9uT25seSkgeworICAgICAgICAgICAg
cGFpbnRJbmZvLnBoYXNlID0gUGFpbnRQaGFzZUZsb2F0OworICAgICAgICAgICAgcmVuZGVyZXIo
KS0+cGFpbnQocGFpbnRJbmZvLCB0eCwgdHkpOworCisgICAgICAgICAgICBwYWludEluZm8ucGhh
c2UgPSBQYWludFBoYXNlRm9yZWdyb3VuZDsKKyAgICAgICAgICAgIHJlbmRlcmVyKCktPnBhaW50
KHBhaW50SW5mbywgdHgsIHR5KTsKKworICAgICAgICAgICAgcGFpbnRJbmZvLnBoYXNlID0gUGFp
bnRQaGFzZUNoaWxkT3V0bGluZXM7CisgICAgICAgICAgICByZW5kZXJlcigpLT5wYWludChwYWlu
dEluZm8sIHR4LCB0eSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgcmVzdG9yZSBvdXIg
Y2xpcC4KKyAgICAgICAgcmVzdG9yZUNsaXAoY29udGV4dCwgcGFpbnREaXJ0eVJlY3QsIGNsaXBS
ZWN0VG9BcHBseSk7CisKKyAgICAgICAgaWYgKCFvdXRsaW5lUmVjdC5pc0VtcHR5KCkpIHsKKyAg
ICAgICAgICAgIC8vIFBhaW50IG91ciBvd24gb3V0bGluZQorICAgICAgICAgICAgUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8gcGFpbnRJbmZvKGNvbnRleHQsIG91dGxpbmVSZWN0LCBQYWludFBoYXNl
U2VsZk91dGxpbmUsIGZhbHNlLCBwYWludGluZ1Jvb3RGb3JSZW5kZXJlciwgMCk7CisgICAgICAg
ICAgICBzZXRDbGlwKGNvbnRleHQsIHBhaW50RGlydHlSZWN0LCBvdXRsaW5lUmVjdCk7CisgICAg
ICAgICAgICByZW5kZXJlcigpLT5wYWludChwYWludEluZm8sIHR4LCB0eSk7CisgICAgICAgICAg
ICByZXN0b3JlQ2xpcChjb250ZXh0LCBwYWludERpcnR5UmVjdCwgb3V0bGluZVJlY3QpOworICAg
ICAgICB9CisKKyAgICAgICAgLy8gUGFpbnQgYW55IGNoaWxkIGxheWVycyB0aGF0IGhhdmUgb3Zl
cmZsb3cuCisgICAgICAgIFZlY3RvcjxSZW5kZXJMYXllcio+KiBvdmVyZmxvd0xpc3QgPSBtX293
bmluZ0xheWVyLT5vdmVyZmxvd0xpc3QoKTsKKyAgICAgICAgaWYgKG92ZXJmbG93TGlzdCkgewor
ICAgICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyTGF5ZXIqPjo6aXRlcmF0b3IgaXQgPSBvdmVy
Zmxvd0xpc3QtPmJlZ2luKCk7IGl0ICE9IG92ZXJmbG93TGlzdC0+ZW5kKCk7ICsraXQpCisgICAg
ICAgICAgICAgICAgaXRbMF0tPnBhaW50TGF5ZXIocm9vdExheWVyLCBjb250ZXh0LCBwYWludERp
cnR5UmVjdCwgaGF2ZVRyYW5zcGFyZW5jeSwgcGFpbnRSZXN0cmljdGlvbiwgcGFpbnRpbmdSb290
KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdyB3YWxrIHRoZSBzb3J0ZWQgbGlzdCBvZiBj
aGlsZHJlbiB3aXRoIHBvc2l0aXZlIHotaW5kaWNlcy4KKyAgICAgICAgVmVjdG9yPFJlbmRlckxh
eWVyKj4qIHBvc1pPcmRlckxpc3QgPSBtX293bmluZ0xheWVyLT5wb3NaT3JkZXJMaXN0KCk7Cisg
ICAgICAgIGlmIChwb3NaT3JkZXJMaXN0KSB7CisgICAgICAgICAgICBmb3IgKFZlY3RvcjxSZW5k
ZXJMYXllcio+OjppdGVyYXRvciBpdCA9IHBvc1pPcmRlckxpc3QtPmJlZ2luKCk7IGl0ICE9IHBv
c1pPcmRlckxpc3QtPmVuZCgpOyArK2l0KQorICAgICAgICAgICAgICAgIGl0WzBdLT5wYWludExh
eWVyKHJvb3RMYXllciwgY29udGV4dCwgcGFpbnREaXJ0eVJlY3QsIGhhdmVUcmFuc3BhcmVuY3ks
IHBhaW50UmVzdHJpY3Rpb24sIHBhaW50aW5nUm9vdCk7CisgICAgICAgIH0KKyAgICAgICAgCisg
ICAgICAgIGlmIChyZW5kZXJlcigpLT5oYXNNYXNrKCkgJiYgIXNlbGVjdGlvbk9ubHkgJiYgIWRh
bWFnZVJlY3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzZXRDbGlwKGNvbnRleHQsIHBhaW50
RGlydHlSZWN0LCBkYW1hZ2VSZWN0KTsKKworICAgICAgICAgICAgLy8gUGFpbnQgdGhlIG1hc2su
CisgICAgICAgICAgICBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyBwYWludEluZm8oY29udGV4dCwg
ZGFtYWdlUmVjdCwgUGFpbnRQaGFzZU1hc2ssIGZhbHNlLCBwYWludGluZ1Jvb3RGb3JSZW5kZXJl
ciwgMCk7CisgICAgICAgICAgICByZW5kZXJlcigpLT5wYWludChwYWludEluZm8sIHR4LCB0eSk7
CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGNsaXAuCisgICAgICAg
ICAgICByZXN0b3JlQ2xpcChjb250ZXh0LCBwYWludERpcnR5UmVjdCwgZGFtYWdlUmVjdCk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBBU1NFUlQoIW1fb3duaW5nTGF5ZXItPm1fdXNlZFRyYW5z
cGFyZW5jeSk7Cit9CisKKy8vIFVwLWNhbGwgZnJvbSBjb21wb3NpdGluZyBsYXllciBkcmF3aW5n
IGNhbGxiYWNrLgordm9pZCBSZW5kZXJMYXllckJhY2tpbmc6OnBhaW50Q29udGVudHMoY29uc3Qg
R3JhcGhpY3NMYXllciosIEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCwgR3JhcGhpY3NMYXllclBh
aW50aW5nUGhhc2UgZHJhd2luZ1BoYXNlLCBjb25zdCBJbnRSZWN0JiBjbGlwKQoreworICAgIC8v
IFdlIGhhdmUgdG8gdXNlIHRoZSBzYW1lIHJvb3QgYXMgZm9yIGhpdCB0ZXN0aW5nLCBiZWNhdXNl
IGJvdGggbWV0aG9kcworICAgIC8vIGNhbiBjb21wdXRlIGFuZCBjYWNoZSBjbGlwUmVjdHMuCisg
ICAgSW50UmVjdCBlbmNsb3NpbmdCQm94ID0gY29tcG9zaXRvcigpLT5jYWxjdWxhdGVDb21wb3Np
dGVkQm91bmRzKG1fb3duaW5nTGF5ZXIsIG1fb3duaW5nTGF5ZXIpOworCisgICAgSW50UmVjdCBj
bGlwUmVjdChjbGlwKTsKKyAgICAKKyAgICAvLyBTZXQgdXAgdGhlIGNvb3JkaW5hdGUgc3BhY2Ug
dG8gYmUgaW4gdGhlIGxheWVyJ3MgcmVuZGVyaW5nIGNvb3JkaW5hdGVzLgorICAgIGNvbnRleHQu
dHJhbnNsYXRlKC1lbmNsb3NpbmdCQm94LngoKSwgLWVuY2xvc2luZ0JCb3gueSgpKTsKKworICAg
IC8vIE9mZnNldCB0aGUgY2xpcC4KKyAgICBjbGlwUmVjdC5tb3ZlKGVuY2xvc2luZ0JCb3gueCgp
LCBlbmNsb3NpbmdCQm94LnkoKSk7CisgICAgCisgICAgLy8gVGhlIGRpcnR5UmVjdCBpcyBpbiB0
aGUgY29vcmRzIG9mIHRoZSBwYWludGluZyByb290LgorICAgIEludFJlY3QgZGlydHlSZWN0ID0g
ZW5jbG9zaW5nQkJveDsKKyAgICBkaXJ0eVJlY3QuaW50ZXJzZWN0KGNsaXBSZWN0KTsKKworICAg
IHBhaW50SW50b0xheWVyKG1fb3duaW5nTGF5ZXIsICZjb250ZXh0LCBkaXJ0eVJlY3QsIGZhbHNl
LCBQYWludFJlc3RyaWN0aW9uTm9uZSwgZHJhd2luZ1BoYXNlLCByZW5kZXJlcigpKTsKK30KKwor
Ym9vbCBSZW5kZXJMYXllckJhY2tpbmc6OnN0YXJ0QW5pbWF0aW9uKGRvdWJsZSBiZWdpblRpbWUs
IGNvbnN0IEFuaW1hdGlvbiogYW5pbSwgY29uc3QgS2V5ZnJhbWVMaXN0JiBrZXlmcmFtZXMpCit7
CisgICAgYm9vbCBoYXNPcGFjaXR5ID0ga2V5ZnJhbWVzLmNvbnRhaW5zUHJvcGVydHkoQ1NTUHJv
cGVydHlPcGFjaXR5KTsKKyAgICBib29sIGhhc1RyYW5zZm9ybSA9IGtleWZyYW1lcy5jb250YWlu
c1Byb3BlcnR5KENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtKTsKKyAgICAKKyAgICBpZiAoIWhh
c09wYWNpdHkgJiYgIWhhc1RyYW5zZm9ybSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAor
ICAgIEdyYXBoaWNzTGF5ZXI6OlRyYW5zZm9ybVZhbHVlTGlzdCB0cmFuc2Zvcm1WZWN0b3I7Cisg
ICAgR3JhcGhpY3NMYXllcjo6RmxvYXRWYWx1ZUxpc3Qgb3BhY2l0eVZlY3RvcjsKKworICAgIGZv
ciAoVmVjdG9yPEtleWZyYW1lVmFsdWU+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGtleWZyYW1lcy5i
ZWdpbktleWZyYW1lcygpOyBpdCAhPSBrZXlmcmFtZXMuZW5kS2V5ZnJhbWVzKCk7ICsraXQpIHsK
KyAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUqIGtleWZyYW1lU3R5bGUgPSBpdC0+c3R5bGUoKTsK
KyAgICAgICAgZmxvYXQga2V5ID0gaXQtPmtleSgpOworCisgICAgICAgIGlmICgha2V5ZnJhbWVT
dHlsZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgCisgICAgICAgIC8vIGdl
dCB0aW1pbmcgZnVuY3Rpb24KKyAgICAgICAgY29uc3QgVGltaW5nRnVuY3Rpb24qIHRmID0ga2V5
ZnJhbWVTdHlsZS0+aGFzQW5pbWF0aW9ucygpID8gJigoKmtleWZyYW1lU3R5bGUtPmFuaW1hdGlv
bnMoKSkuYW5pbWF0aW9uKDApLT50aW1pbmdGdW5jdGlvbigpKSA6IDA7CisgICAgICAgIAorICAg
ICAgICBpZiAoaGFzVHJhbnNmb3JtKQorICAgICAgICAgICAgdHJhbnNmb3JtVmVjdG9yLmluc2Vy
dChrZXksICYoa2V5ZnJhbWVTdHlsZS0+dHJhbnNmb3JtKCkpLCB0Zik7CisKKyAgICAgICAgaWYg
KGhhc09wYWNpdHkpCisgICAgICAgICAgICBvcGFjaXR5VmVjdG9yLmluc2VydChrZXksIGtleWZy
YW1lU3R5bGUtPm9wYWNpdHkoKSwgdGYpOworICAgIH0KKworICAgIGJvb2wgZGlkQW5pbWF0ZVRy
YW5zZm9ybSA9ICFoYXNUcmFuc2Zvcm07CisgICAgYm9vbCBkaWRBbmltYXRlT3BhY2l0eSA9ICFo
YXNPcGFjaXR5OworICAgIAorICAgIGlmIChoYXNUcmFuc2Zvcm0gJiYgbV9ncmFwaGljc0xheWVy
LT5hbmltYXRlVHJhbnNmb3JtKHRyYW5zZm9ybVZlY3RvciwgcmVuZGVyZXIoKS0+Ym9yZGVyQm94
UmVjdCgpLnNpemUoKSwgYW5pbSwgYmVnaW5UaW1lLCBmYWxzZSkpCisgICAgICAgIGRpZEFuaW1h
dGVUcmFuc2Zvcm0gPSB0cnVlOworCisgICAgaWYgKGhhc09wYWNpdHkgJiYgbV9ncmFwaGljc0xh
eWVyLT5hbmltYXRlRmxvYXQoQW5pbWF0ZWRQcm9wZXJ0eU9wYWNpdHksIG9wYWNpdHlWZWN0b3Is
IGFuaW0sIGJlZ2luVGltZSkpCisgICAgICAgIGRpZEFuaW1hdGVPcGFjaXR5ID0gdHJ1ZTsKKyAg
ICAKKyAgICByZXR1cm4gZGlkQW5pbWF0ZVRyYW5zZm9ybSAmJiBkaWRBbmltYXRlT3BhY2l0eTsK
K30KKworYm9vbCBSZW5kZXJMYXllckJhY2tpbmc6OnN0YXJ0VHJhbnNpdGlvbihkb3VibGUgYmVn
aW5UaW1lLCBpbnQgcHJvcGVydHksIGNvbnN0IFJlbmRlclN0eWxlKiBmcm9tU3R5bGUsIGNvbnN0
IFJlbmRlclN0eWxlKiB0b1N0eWxlKQoreworICAgIGJvb2wgZGlkQW5pbWF0ZSA9IGZhbHNlOwor
ICAgIAorICAgIGlmIChwcm9wZXJ0eSA9PSBjQW5pbWF0ZUFsbCB8fCBwcm9wZXJ0eSA9PSAoaW50
KUNTU1Byb3BlcnR5T3BhY2l0eSkgeworICAgICAgICBjb25zdCBBbmltYXRpb24qIG9wYWNpdHlB
bmltID0gdG9TdHlsZS0+dHJhbnNpdGlvbkZvclByb3BlcnR5KENTU1Byb3BlcnR5T3BhY2l0eSk7
CisgICAgICAgIGlmIChvcGFjaXR5QW5pbSAmJiAhb3BhY2l0eUFuaW0tPmlzRW1wdHlPclplcm9E
dXJhdGlvbigpKSB7CisgICAgICAgICAgICAvLyBJZiBiZWdpblRpbWUgaXMgbm90IDAsIHdlIGFy
ZSByZXN0YXJ0aW5nIHRoaXMgdHJhbnNpdGlvbiwgc28gZmlyc3Qgc2V0IHRoZSBmcm9tIHZhbHVl
CisgICAgICAgICAgICAvLyBpbiBjYXNlIGl0IHdhcyBzbWFzaGVkIGJ5IGEgcHJldmlvdXMgYW5p
bWF0aW9uLgorICAgICAgICAgICAgaWYgKGJlZ2luVGltZSA+IDApCisgICAgICAgICAgICAgICAg
bV9ncmFwaGljc0xheWVyLT5zZXRPcGFjaXR5KGNvbXBvc2l0aW5nT3BhY2l0eShmcm9tU3R5bGUt
Pm9wYWNpdHkoKSksIDAsIDApOworCisgICAgICAgICAgICBpZiAobV9ncmFwaGljc0xheWVyLT5z
ZXRPcGFjaXR5KGNvbXBvc2l0aW5nT3BhY2l0eSh0b1N0eWxlLT5vcGFjaXR5KCkpLCBvcGFjaXR5
QW5pbSwgYmVnaW5UaW1lKSkKKyAgICAgICAgICAgICAgICBkaWRBbmltYXRlID0gdHJ1ZTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICBpZiAocHJvcGVydHkgPT0gY0FuaW1hdGVBbGwgfHwgcHJvcGVy
dHkgPT0gKGludClDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybSkgeworICAgICAgICAvLyBXZSBn
ZXQgYSBUcmFuc2Zvcm1PcGVyYXRpb24sIHdoaWNoIGlzIGEgbGlua2VkIGxpc3Qgb2YgcHJpbWl0
aXZlIG9wZXJhdGlvbnMgYW5kIHRoZWlyIGFyZ3VtZW50cy4KKyAgICAgICAgLy8gQXJndW1lbnRz
IGNhbiBiZSBmbG9hdHMgb3IgTGVuZ3RoIHZhbHVlcywgd2hpY2ggbmVlZCB0byBiZSBjb252ZXJ0
ZWQgdG8gbnVtYmVycyB1c2luZworICAgICAgICAvLyB2YWwuY2FsY0Zsb2F0VmFsdWUocmVuZGVy
ZXIoKS0+d2lkdGgoKSkgKG9yIGhlaWdodCgpKS4KKyAgICAgICAgY29uc3QgQW5pbWF0aW9uKiB0
cmFuc2Zvcm1BbmltID0gdG9TdHlsZS0+dHJhbnNpdGlvbkZvclByb3BlcnR5KENTU1Byb3BlcnR5
V2Via2l0VHJhbnNmb3JtKTsKKyAgICAgICAgaWYgKHRyYW5zZm9ybUFuaW0gJiYgIXRyYW5zZm9y
bUFuaW0tPmlzRW1wdHlPclplcm9EdXJhdGlvbigpKSB7CisgICAgICAgICAgICBHcmFwaGljc0xh
eWVyOjpUcmFuc2Zvcm1WYWx1ZUxpc3QgdHJhbnNmb3JtVmVjdG9yOworICAgICAgICAgICAgdHJh
bnNmb3JtVmVjdG9yLmluc2VydCgwLCAmZnJvbVN0eWxlLT50cmFuc2Zvcm0oKSwgMCk7ICAgICAg
ICAKKyAgICAgICAgICAgIHRyYW5zZm9ybVZlY3Rvci5pbnNlcnQoMSwgJnRvU3R5bGUtPnRyYW5z
Zm9ybSgpLCAwKTsgICAgICAgIAorICAgICAgICAgICAgaWYgKG1fZ3JhcGhpY3NMYXllci0+YW5p
bWF0ZVRyYW5zZm9ybSh0cmFuc2Zvcm1WZWN0b3IsIHJlbmRlcmVyKCktPmJvcmRlckJveFJlY3Qo
KS5zaXplKCksIHRyYW5zZm9ybUFuaW0sIGJlZ2luVGltZSwgdHJ1ZSkpCisgICAgICAgICAgICAg
ICAgZGlkQW5pbWF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJu
IGRpZEFuaW1hdGU7Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJCYWNraW5nOjpub3RpZnlUcmFuc2l0
aW9uU3RhcnRlZChjb25zdCBHcmFwaGljc0xheWVyKiwgQW5pbWF0ZWRQcm9wZXJ0eUlEIHByb3Bl
cnR5LCBkb3VibGUgdGltZSkKK3sKKyAgICBpbnQgY3NzUHJvcGVydHkgPSBDU1NQcm9wZXJ0eUlu
dmFsaWQ7CisgICAgc3dpdGNoIChwcm9wZXJ0eSkgeworICAgICAgICBjYXNlIEFuaW1hdGVkUHJv
cGVydHlJbnZhbGlkOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQW5pbWF0ZWRQ
cm9wZXJ0eVdlYmtpdFRyYW5zZm9ybToKKyAgICAgICAgICAgIGNzc1Byb3BlcnR5ID0gQ1NTUHJv
cGVydHlXZWJraXRUcmFuc2Zvcm07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBB
bmltYXRlZFByb3BlcnR5T3BhY2l0eToKKyAgICAgICAgICAgIGNzc1Byb3BlcnR5ID0gQ1NTUHJv
cGVydHlPcGFjaXR5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQW5pbWF0ZWRQ
cm9wZXJ0eUJhY2tncm91bmRDb2xvcjoKKyAgICAgICAgICAgIGNzc1Byb3BlcnR5ID0gQ1NTUHJv
cGVydHlCYWNrZ3JvdW5kQ29sb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisg
ICAgcmVuZGVyZXIoKS0+bm90aWZ5VHJhbnNpdGlvblN0YXJ0ZWQoY3NzUHJvcGVydHksIHRpbWUp
OworfQorCit2b2lkIFJlbmRlckxheWVyQmFja2luZzo6bm90aWZ5QW5pbWF0aW9uU3RhcnRlZChj
b25zdCBHcmFwaGljc0xheWVyKiwgZG91YmxlIHRpbWUpCit7CisgICAgcmVuZGVyZXIoKS0+bm90
aWZ5QW5pbWF0aW9uU3RhcnRlZCh0aW1lKTsKK30KKwordm9pZCBSZW5kZXJMYXllckJhY2tpbmc6
OmFuaW1hdGlvbkZpbmlzaGVkKGNvbnN0IFN0cmluZyYgbmFtZSwgaW50IGluZGV4LCBib29sIHJl
c2V0KQoreworICAgIG1fZ3JhcGhpY3NMYXllci0+cmVtb3ZlRmluaXNoZWRBbmltYXRpb25zKG5h
bWUsIGluZGV4LCByZXNldCk7Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJCYWNraW5nOjp0cmFuc2l0
aW9uRmluaXNoZWQoaW50IHByb3BlcnR5KQoreworICAgIG1fZ3JhcGhpY3NMYXllci0+cmVtb3Zl
RmluaXNoZWRUcmFuc2l0aW9ucyhwcm9wZXJ0eSk7Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJCYWNr
aW5nOjpzdXNwZW5kQW5pbWF0aW9ucygpCit7CisgICAgbV9ncmFwaGljc0xheWVyLT5zdXNwZW5k
QW5pbWF0aW9ucygpOworfQorCit2b2lkIFJlbmRlckxheWVyQmFja2luZzo6cmVzdW1lQW5pbWF0
aW9ucygpCit7CisgICAgbV9ncmFwaGljc0xheWVyLT5yZXN1bWVBbmltYXRpb25zKCk7Cit9CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2lu
Zy5oIGIvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJCYWNraW5nLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1OWQ0MAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5oCkBAIC0wLDAgKzEsMTcwIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZu
ZGVmIFJlbmRlckxheWVyQmFja2luZ19oCisjZGVmaW5lIFJlbmRlckxheWVyQmFja2luZ19oCisK
KyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJGbG9hdFBvaW50
LmgiCisjaW5jbHVkZSAiRmxvYXRQb2ludDNELmgiCisjaW5jbHVkZSAiR3JhcGhpY3NMYXllci5o
IjsKKyNpbmNsdWRlICJHcmFwaGljc0xheWVyQ2xpZW50LmgiOworI2luY2x1ZGUgIlJlbmRlckxh
eWVyLmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitjbGFzcyBSZW5kZXJMYXllckNvbXBvc2l0b3I7CisKKy8vIFJlbmRlckxheWVy
QmFja2luZyBjb250cm9scyB0aGUgY29tcG9zaXRpbmcgYmVoYXZpb3IgZm9yIGEgc2luZ2xlIFJl
bmRlckxheWVyLgorLy8gSXQgaG9sZHMgdGhlIHZhcmlvdXMgR3JhcGhpY3NMYXllcnMsIGFuZCBt
YWtlcyBkZWNpc2lvbnMgYWJvdXQgaW50cmEtbGF5ZXIgcmVuZGVyaW5nCisvLyBvcHRpbWl6YXRp
b25zLgorLy8gCisvLyBUaGVyZSBpcyBvbmUgUmVuZGVyTGF5ZXJCYWNraW5nIGZvciBlYWNoIFJl
bmRlckxheWVyIHRoYXQgaXMgY29tcG9zaXRlZC4KKworY2xhc3MgUmVuZGVyTGF5ZXJCYWNraW5n
IDogcHVibGljIEdyYXBoaWNzTGF5ZXJDbGllbnQgeworcHVibGljOgorICAgIFJlbmRlckxheWVy
QmFja2luZyhSZW5kZXJMYXllciopOworICAgIH5SZW5kZXJMYXllckJhY2tpbmcoKTsKKworICAg
IFJlbmRlckxheWVyKiBvd25pbmdMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fb3duaW5nTGF5ZXI7
IH0KKworICAgIHZvaWQgdXBkYXRlQWZ0ZXJMYXlvdXQoKTsKKyAgICAKKyAgICAvLyBSZXR1cm5z
IHRydWUgaWYgbGF5ZXIgY29uZmlndXJhdGlvbiBjaGFuZ2VkLgorICAgIGJvb2wgdXBkYXRlR3Jh
cGhpY3NMYXllcnMoYm9vbCBuZWVkc0NvbnRlbnRzTGF5ZXIsIGJvb2wgbmVlZHNVcHBlckNsaXBw
aW5nTGF5ZXIsIGJvb2wgbmVlZHNMb3dlckNsaXBwaW5nTGF5ZXIsIGJvb2wgbmVlZHNSZXBhaW50
KTsKKyAgICB2b2lkIHVwZGF0ZUdyYXBoaWNzTGF5ZXJHZW9tZXRyeSgpOworICAgIHZvaWQgdXBk
YXRlSW50ZXJuYWxIaWVyYXJjaHkoKTsKKyAgICAKKyAgICBHcmFwaGljc0xheWVyKiBncmFwaGlj
c0xheWVyKCkgY29uc3QgeyByZXR1cm4gbV9ncmFwaGljc0xheWVyOyB9CisKKyAgICAvLyBMYXll
ciB0byBjbGlwIGNoaWxkcmVuCisgICAgYm9vbCBoYXNDbGlwcGluZ0xheWVyKCkgY29uc3QgeyBy
ZXR1cm4gbV9jbGlwcGluZ0xheWVyICE9IDA7IH0KKyAgICBHcmFwaGljc0xheWVyKiBjbGlwcGlu
Z0xheWVyKCkgY29uc3QgeyByZXR1cm4gbV9jbGlwcGluZ0xheWVyOyB9CisKKyAgICAvLyBMYXll
ciB0byBnZXQgY2xpcHBlZCBieSBhbmNlc3RvcgorICAgIGJvb2wgaGFzQW5jZXN0b3JDbGlwcGlu
Z0xheWVyKCkgY29uc3QgeyByZXR1cm4gbV9hbmNlc3RvckNsaXBwaW5nTGF5ZXIgIT0gMDsgfQor
ICAgIEdyYXBoaWNzTGF5ZXIqIGFuY2VzdG9yQ2xpcHBpbmdMYXllcigpIGNvbnN0IHsgcmV0dXJu
IG1fYW5jZXN0b3JDbGlwcGluZ0xheWVyOyB9CisKKyAgICBib29sIGhhc0NvbnRlbnRzTGF5ZXIo
KSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRzTGF5ZXIgIT0gMDsgfQorICAgIEdyYXBoaWNzTGF5
ZXIqIGNvbnRlbnRzTGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRzTGF5ZXI7IH0KKyAg
ICAKKyAgICBHcmFwaGljc0xheWVyKiBwYXJlbnRGb3JTdWJsYXllcnMoKSBjb25zdCB7IHJldHVy
biBtX2NsaXBwaW5nTGF5ZXIgPyBtX2NsaXBwaW5nTGF5ZXIgOiBtX2dyYXBoaWNzTGF5ZXI7IH0K
KyAgICBHcmFwaGljc0xheWVyKiBjaGlsZEZvclN1cGVybGF5ZXJzKCkgY29uc3QgeyByZXR1cm4g
bV9hbmNlc3RvckNsaXBwaW5nTGF5ZXIgPyBtX2FuY2VzdG9yQ2xpcHBpbmdMYXllciA6IG1fZ3Jh
cGhpY3NMYXllcjsgfQorCisgICAgLy8gUmVuZGVyTGF5ZXJzIHdpdGggYmFja2luZyBub3JtYWxs
eSBzaG9ydC1jaXJjdWl0IHBhaW50TGF5ZXIoKSBiZWNhdXNlCisgICAgLy8gdGhlaXIgY29udGVu
dCBpcyByZW5kZXJlZCB2aWEgY2FsbGJhY2tzIGZyb20gR3JhcGhpY3NMYXllci4gSG93ZXZlciwg
dGhlIGRvY3VtZW50CisgICAgLy8gbGF5ZXIgaXMgc3BlY2lhbCwgYmVjYXVzZSBpdCBoYXMgYSBH
cmFwaGljc0xheWVyIHRvIGFjdCBhcyBhIGNvbnRhaW5lciBmb3IgdGhlIEdyYXBoaWNzTGF5ZXJz
CisgICAgLy8gZm9yIGRlc2NlbmRhbnRzLCBidXQgaXRzIGNvbnRlbnRzIHVzdWFsbHkgcmVuZGVy
IGludG8gdGhlIHdpbmRvdyAoaW4gd2hpY2ggY2FzZSB0aGlzIHJldHVybnMgdHJ1ZSkuCisgICAg
Ly8gVGhpcyByZXR1cm5zIGZhbHNlIGZvciBvdGhlciBsYXllcnMsIGFuZCB3aGVuIHRoZSBkb2N1
bWVudCBsYXllciBhY3R1YWxseSBuZWVkcyB0byBwYWludCBpbnRvIGl0cyBiYWNraW5nIHN0b3Jl
CisgICAgLy8gZm9yIHNvbWUgcmVhc29uLgorICAgIGJvb2wgcGFpbnRpbmdHb2VzVG9XaW5kb3co
KSBjb25zdDsKKworICAgIHZvaWQgc2V0Q29udGVudHNOZWVkRGlzcGxheSgpOworICAgIC8vIHIg
aXMgaW4gdGhlIGNvb3JkaW5hdGUgc3BhY2Ugb2YgdGhlIGxheWVyJ3MgcmVuZGVyIG9iamVjdAor
ICAgIHZvaWQgc2V0Q29udGVudHNOZWVkRGlzcGxheUluUmVjdChjb25zdCBJbnRSZWN0JiByKTsK
KworICAgIC8vIEludGVyZmFjZSB0byBzdGFydCwgZmluaXNoLCBzdXNwZW5kIGFuZCByZXN1bWUg
YW5pbWF0aW9ucyBhbmQgdHJhbnNpdGlvbnMKKyAgICBib29sIHN0YXJ0QW5pbWF0aW9uKGRvdWJs
ZSBiZWdpblRpbWUsIGNvbnN0IEFuaW1hdGlvbiogYW5pbSwgY29uc3QgS2V5ZnJhbWVMaXN0JiBr
ZXlmcmFtZXMpOworICAgIGJvb2wgc3RhcnRUcmFuc2l0aW9uKGRvdWJsZSBiZWdpblRpbWUsIGlu
dCBwcm9wZXJ0eSwgY29uc3QgUmVuZGVyU3R5bGUqIGZyb21TdHlsZSwgY29uc3QgUmVuZGVyU3R5
bGUqIHRvU3R5bGUpOworICAgIHZvaWQgYW5pbWF0aW9uRmluaXNoZWQoY29uc3QgU3RyaW5nJiBu
YW1lLCBpbnQgaW5kZXgsIGJvb2wgcmVzZXQpOworICAgIHZvaWQgdHJhbnNpdGlvbkZpbmlzaGVk
KGludCBwcm9wZXJ0eSk7CisKKyAgICB2b2lkIHN1c3BlbmRBbmltYXRpb25zKCk7CisgICAgdm9p
ZCByZXN1bWVBbmltYXRpb25zKCk7CisKKyAgICBGbG9hdFBvaW50IGdyYXBoaWNzTGF5ZXJUb0Nv
bnRlbnRzQ29vcmRpbmF0ZXMoY29uc3QgR3JhcGhpY3NMYXllciosIGNvbnN0IEZsb2F0UG9pbnQm
KTsKKyAgICBGbG9hdFBvaW50IGNvbnRlbnRzVG9HcmFwaGljc0xheWVyQ29vcmRpbmF0ZXMoY29u
c3QgR3JhcGhpY3NMYXllciosIGNvbnN0IEZsb2F0UG9pbnQmKTsKKworICAgIHZvaWQgZm9yY2VD
b21wb3NpdGluZ0xheWVyKGJvb2wgZm9yY2UgPSB0cnVlKTsKKyAgICBib29sIGZvcmNlZENvbXBv
c2l0aW5nTGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2ZvcmNlQ29tcG9zaXRpbmdMYXllcjsgfQor
CisgICAgdm9pZCBkZXRlY3REcmF3aW5nT3B0aW1pemF0aW9ucygpOworICAgIHZvaWQgaW52YWxp
ZGF0ZURyYXdpbmdPcHRpbWl6YXRpb25zKCk7CisKKyAgICAvLyBHcmFwaGljc0xheWVyQ2xpZW50
IGludGVyZmFjZQorICAgIHZpcnR1YWwgdm9pZCBub3RpZnlUcmFuc2l0aW9uU3RhcnRlZChjb25z
dCBHcmFwaGljc0xheWVyKiwgQW5pbWF0ZWRQcm9wZXJ0eUlELCBkb3VibGUgc3RhcnRUaW1lKTsK
KyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5QW5pbWF0aW9uU3RhcnRlZChjb25zdCBHcmFwaGljc0xh
eWVyKiwgZG91YmxlIHN0YXJ0VGltZSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnRDb250ZW50
cyhjb25zdCBHcmFwaGljc0xheWVyKiwgR3JhcGhpY3NDb250ZXh0JiwgR3JhcGhpY3NMYXllclBh
aW50aW5nUGhhc2UsIGNvbnN0IEludFJlY3QmIGNsaXApOworCisgICAgdmlydHVhbCBJbnRSZWN0
IGNvbnRlbnRzQm94KGNvbnN0IEdyYXBoaWNzTGF5ZXIqKTsKKyAgICAKK3ByaXZhdGU6CisgICAg
dm9pZCBjcmVhdGVHcmFwaGljc0xheWVyKCk7CisgICAgdm9pZCBkZXN0cm95R3JhcGhpY3NMYXll
cigpOworCisgICAgUmVuZGVyQm94KiByZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIG1fb3duaW5n
TGF5ZXItPnJlbmRlcmVyKCk7IH0KKyAgICBSZW5kZXJMYXllckNvbXBvc2l0b3IqIGNvbXBvc2l0
b3IoKSBjb25zdCB7IHJldHVybiBtX293bmluZ0xheWVyLT5jb21wb3NpdG9yKCk7IH0KKworICAg
IGJvb2wgdXBkYXRlQ2xpcHBpbmdMYXllcnMoYm9vbCBuZWVkc0FuY2VzdG9yQ2xpcCwgYm9vbCBu
ZWVkc0Rlc2NlbmRhbnRDbGlwKTsKKyAgICBib29sIHVwZGF0ZUNvbnRlbnRzTGF5ZXIoYm9vbCBu
ZWVkc0NvbnRlbnRzTGF5ZXIpOworCisgICAgSW50U2l6ZSBjb250ZW50T2Zmc2V0SW5Db21wb3N0
aW5nTGF5ZXIoKTsKKyAgICAvLyBSZXN1bHQgaXMgdHJhbnNmb3JtIG9yaWdpbiBpbiBwaXhlbHMu
CisgICAgRmxvYXRQb2ludCBjb21wdXRlVHJhbnNmb3JtT3JpZ2luKGNvbnN0IEludFJlY3QmIGJv
cmRlckJveCkgY29uc3Q7CisKKyAgICB2b2lkIHVwZGF0ZUxheWVyT3BhY2l0eSgpOworICAgIHZv
aWQgdXBkYXRlTGF5ZXJUcmFuc2Zvcm0oKTsKKworICAgIC8vIFJldHVybiB0aGUgb3BhY2l0eSB2
YWx1ZSB0aGF0IHRoaXMgbGF5ZXIgc2hvdWxkIHVzZSBmb3IgY29tcG9zaXRpbmcuCisgICAgZmxv
YXQgY29tcG9zaXRpbmdPcGFjaXR5KGZsb2F0IHJlbmRlcmVyT3BhY2l0eSkgY29uc3Q7CisgICAg
CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgUmVuZGVyTGF5ZXIgb25seSBoYXMgY29udGVu
dCB0aGF0IGNhbiBiZSByZW5kZXJlZCBkaXJlY3RseQorICAgIC8vIGJ5IHRoZSBjb21wb3NpdGlu
ZyBsYXllciwgd2l0aG91dCBkcmF3aW5nIChlLmcuIHNvbGlkIGJhY2tncm91bmQgY29sb3IpLgor
ICAgIGJvb2wgaXNTaW1wbGVDb250YWluZXJDb21wb3NpdGluZ0xheWVyKCk7CisKKyAgICBib29s
IHJlbmRlcmVySGFzQmFja2dyb3VuZCgpIGNvbnN0OworICAgIGNvbnN0IENvbG9yJiByZW5kZXJl
ckJhY2tncm91bmRDb2xvcigpIGNvbnN0OworCisgICAgYm9vbCBjYW5CZVNpbXBsZUNvbnRhaW5l
ckNvbXBvc2l0aW5nTGF5ZXIoKSBjb25zdDsKKyAgICBib29sIGhhc05vbkNvbXBvc2l0aW5nQ29u
dGVudCgpIGNvbnN0OworICAgIAorICAgIHZvaWQgcGFpbnRJbnRvTGF5ZXIoUmVuZGVyTGF5ZXIq
IHJvb3RMYXllciwgR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYgcGFpbnREaXJ0eVJl
Y3QsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaGF2ZVRyYW5zcGFyZW5jeSwgUGFpbnRSZXN0
cmljdGlvbiBwYWludFJlc3RyaWN0aW9uLCBHcmFwaGljc0xheWVyUGFpbnRpbmdQaGFzZSwgUmVu
ZGVyT2JqZWN0KiBwYWludGluZ1Jvb3QpOworCitwcml2YXRlOgorICAgIFJlbmRlckxheWVyKiBt
X293bmluZ0xheWVyOworCisgICAgR3JhcGhpY3NMYXllciogbV9hbmNlc3RvckNsaXBwaW5nTGF5
ZXI7IC8vIG9ubHkgdXNlZCBpZiB3ZSBhcmUgY2xpcHBlZCBieSBhbiBhbmNlc3RvciB3aGljaCBp
cyBub3QgYSBzdGFja2luZyBjb250ZXh0CisgICAgR3JhcGhpY3NMYXllciogbV9ncmFwaGljc0xh
eWVyOworICAgIEdyYXBoaWNzTGF5ZXIqIG1fY29udGVudHNMYXllcjsgICAgICAgICAvLyBvbmx5
IHVzZWQgaW4gY2FzZXMgd2hlcmUgd2UgbmVlZCB0byBkcmF3IHRoZSBmb3JlZ3JvdW5kIHNlcGFy
YXRlbHkKKyAgICBHcmFwaGljc0xheWVyKiBtX2NsaXBwaW5nTGF5ZXI7ICAgICAgICAgLy8gb25s
eSB1c2VkIGlmIHdlIGhhdmUgY2xpcHBpbmcgb24gYSBzdGFja2luZyBjb250ZXh0LCB3aXRoIGNv
bXBvc2l0aW5nIGNoaWxkcmVuCisKKyAgICBJbnRTaXplIG1fY29tcG9zaXRpbmdDb250ZW50T2Zm
c2V0OworCisgICAgYm9vbCBtX2ZvcmNlQ29tcG9zaXRpbmdMYXllciA6IDE7ICAgLy8gc2V0IGlm
IHdlIG5lZWQgYSBjb21wb3NpdGluZyBsYXllciBiZWNhdXNlIG9mIHNvbWUgZXh0ZXJuYWwgcmVx
dWlyZW1lbnQKKyAgICBib29sIG1faXNTaW1wbGVDb250YWluZXJDb21wb3NpdGluZ0xheWVyIDog
MTsgIC8vIGlzIHRoaXMgY29tcG9zaXRpbmcgbGF5ZXIgYWJsZSB0byBiZSBzaW1wbGlmaWVkCisg
ICAgYm9vbCBtX3NpbXBsZUNvbXBvc2l0aW5nTGF5ZXJTdGF0dXNEaXJ0eSA6IDE7IC8vIHNldCBp
ZiB0aGUgdGVzdCBmb3Igc2ltcGxlIGxheWVycyBuZWVkcyB0byBiZSByZWRvbmUKKworICAgIGJv
b2wgbV9jb21wb3NpdGluZ0NvbnRlbnRPZmZzZXREaXJ0eTogMTsKK307CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKwor
I2VuZGlmIC8vIFJlbmRlckxheWVyQmFja2luZ19oCmRpZmYgLS1naXQgYS9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJMYXllckNvbXBvc2l0b3IuY3BwIGIvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
TGF5ZXJDb21wb3NpdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40
MTNkNmVhCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJD
b21wb3NpdG9yLmNwcApAQCAtMCwwICsxLDc0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisj
aWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorI2luY2x1ZGUgIlJlbmRlckxheWVyQ29t
cG9zaXRvci5oIgorCisjaW5jbHVkZSAiQW5pbWF0aW9uQ29udHJvbGxlci5oIgorI2luY2x1ZGUg
IkNocm9tZUNsaWVudC5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkdyYXBo
aWNzTGF5ZXIuaCIKKyNpbmNsdWRlICJIaXRUZXN0UmVxdWVzdC5oIgorI2luY2x1ZGUgIkhpdFRl
c3RSZXN1bHQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUmVuZGVyTGF5ZXJCYWNr
aW5nLmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgorCisjaWYgUFJPRklMRV9MQVlFUl9SRUJV
SUxECisjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+CisjZW5kaWYKKworI2lmbmRlZiBOREVC
VUcKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiUmVuZGVyVHJlZUFzVGV4dC5oIgor
I2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RydWN0IENvbXBvc2l0aW5nU3RhdGUg
eworICAgIENvbXBvc2l0aW5nU3RhdGUoUmVuZGVyTGF5ZXIqIGNvbXBBbmNlc3RvcikKKyAgICAg
ICAgOiBtX3N1YnRyZWVJc0NvbXBvc2l0aW5nKGZhbHNlKQorICAgICAgICAsIG1fY29tcG9zaXRp
bmdBbmNlc3Rvcihjb21wQW5jZXN0b3IpCisjaWZuZGVmIE5ERUJVRworICAgICAgICAsIG1fZGVw
dGgoMCkKKyNlbmRpZgorICAgIHsKKyAgICB9CisgICAgCisgICAgYm9vbCBtX3N1YnRyZWVJc0Nv
bXBvc2l0aW5nOworICAgIFJlbmRlckxheWVyKiBtX2NvbXBvc2l0aW5nQW5jZXN0b3I7CisjaWZu
ZGVmIE5ERUJVRworICAgIGludCBtX2RlcHRoOworI2VuZGlmCit9OworCitzdGF0aWMgVHJhbnNm
b3JtYXRpb25NYXRyaXggZmxpcFRyYW5zZm9ybSgpCit7CisgICAgVHJhbnNmb3JtYXRpb25NYXRy
aXggZmxpcHBlcjsKKyAgICBmbGlwcGVyLmZsaXBZKCk7CisgICAgcmV0dXJuIGZsaXBwZXI7Cit9
CisKK1JlbmRlckxheWVyQ29tcG9zaXRvcjo6UmVuZGVyTGF5ZXJDb21wb3NpdG9yKFJlbmRlclZp
ZXcqIHJlbmRlclZpZXcpCisgICAgOiBtX3JlbmRlclZpZXcocmVuZGVyVmlldykKKyAgICAsIG1f
cm9vdFBsYXRmb3JtTGF5ZXIoMCkKKyAgICAsIG1fY29tcG9zaXRpbmcoZmFsc2UpCisgICAgLCBt
X3Jvb3RMYXllckF0dGFjaGVkKGZhbHNlKQorICAgICwgbV9jb21wb3NpdGluZ0xheWVyc05lZWRV
cGRhdGUoZmFsc2UpCisjaWYgUFJPRklMRV9MQVlFUl9SRUJVSUxECisgICAgLCBtX3Jvb3RMYXll
clVwZGF0ZUNvdW50KDApCisjZW5kaWYgLy8gUFJPRklMRV9MQVlFUl9SRUJVSUxECit7Cit9CisK
K1JlbmRlckxheWVyQ29tcG9zaXRvcjo6flJlbmRlckxheWVyQ29tcG9zaXRvcigpCit7CisgICAg
QVNTRVJUKCFtX3Jvb3RMYXllckF0dGFjaGVkKTsKKyAgICBkZWxldGUgbV9yb290UGxhdGZvcm1M
YXllcjsKK30KKwordm9pZCBSZW5kZXJMYXllckNvbXBvc2l0b3I6OmVuYWJsZUNvbXBvc2l0aW5n
TW9kZShib29sIGVuYWJsZSAvKiA9IHRydWUgKi8pCit7CisgICAgaWYgKGVuYWJsZSAhPSBtX2Nv
bXBvc2l0aW5nKSB7CisgICAgICAgIG1fY29tcG9zaXRpbmcgPSBlbmFibGU7CisgICAgICAgIAor
ICAgICAgICAvLyBXZSBuZXZlciBnbyBvdXQgb2YgY29tcG9zaXRpbmcgbW9kZSBmb3IgYSBnaXZl
biBwYWdlLAorICAgICAgICAvLyBidXQgaWYgYWxsIHRoZSBsYXllcnMgZGlzYXBwZWFyLCB3ZSds
bCBqdXN0IGJlIGxlZnQgd2l0aAorICAgICAgICAvLyB0aGUgZW1wdHkgcm9vdCBsYXllciwgd2hp
Y2ggaGFzIG1pbmltYWwgb3ZlcmhlYWQuCisgICAgICAgIGlmIChtX2NvbXBvc2l0aW5nKQorICAg
ICAgICAgICAgZW5zdXJlUm9vdFBsYXRmb3JtTGF5ZXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVu
ZGVyTGF5ZXJDb21wb3NpdG9yOjpzZXRDb21wb3NpdGluZ0xheWVyc05lZWRVcGRhdGUoYm9vbCBu
ZWVkVXBkYXRlKQoreworICAgIGlmIChpbkNvbXBvc2l0aW5nTW9kZSgpKQorICAgICAgICBtX2Nv
bXBvc2l0aW5nTGF5ZXJzTmVlZFVwZGF0ZSA9IG5lZWRVcGRhdGU7Cit9CisKK3ZvaWQgUmVuZGVy
TGF5ZXJDb21wb3NpdG9yOjp1cGRhdGVDb21wb3NpdGluZ0xheWVycyhSZW5kZXJMYXllciogdXBk
YXRlUm9vdCkKK3sKKyAgICBpZiAoIW1fY29tcG9zaXRpbmdMYXllcnNOZWVkVXBkYXRlKQorICAg
ICAgICByZXR1cm47CisKKyAgICBtX2NvbXBvc2l0aW5nTGF5ZXJzTmVlZFVwZGF0ZSA9IGZhbHNl
OworCisgICAgQVNTRVJUKGluQ29tcG9zaXRpbmdNb2RlKCkpOworCisgICAgaWYgKCF1cGRhdGVS
b290KQorICAgICAgICB1cGRhdGVSb290ID0gcm9vdFJlbmRlckxheWVyKCk7CisKKyNpZiBQUk9G
SUxFX0xBWUVSX1JFQlVJTEQKKyAgICArK21fcm9vdExheWVyVXBkYXRlQ291bnQ7CisgICAgCisg
ICAgZG91YmxlIHN0YXJ0VGltZSA9IFdURjo6Y3VycmVudFRpbWUoKTsKKyNlbmRpZiAgICAgICAg
CisKKyAgICAvLyBHbyB0aHJvdWdoIHRoZSBsYXllcnMgaW4gcHJlc2VudGF0aW9uIG9yZGVyLCBz
byB0aGF0IHdlIGNhbiBjb21wdXRlIHdoaWNoCisgICAgLy8gUkxzIG5lZWQgY29tcG9zaXRpbmcg
bGF5ZXJzLgorICAgIC8vIEZJWE1FOiB3ZSBjb3VsZCBtYXliZSBkbyB0aGlzIGluIG9uZSBwYXNz
LCBidXQgdGhlIHBhcmVudGluZyBsb2dpYyB3b3VsZCBiZSBtb3JlCisgICAgLy8gY29tcGxleC4K
KyAgICB7CisgICAgICAgIENvbXBvc2l0aW5nU3RhdGUgY29tcFN0YXRlKHVwZGF0ZVJvb3QpOwor
ICAgICAgICBjb21wdXRlQ29tcG9zaXRpbmdSZXF1aXJlbWVudHModXBkYXRlUm9vdCwgY29tcFN0
YXRlKTsKKyAgICB9CisKKyAgICAvLyBOb3cgY3JlYXRlIGFuZCBwYXJlbnQgdGhlIGNvbXBvc2l0
aW5nIGxheWVycy4KKyAgICB7CisgICAgICAgIENvbXBvc2l0aW5nU3RhdGUgY29tcFN0YXRlKHVw
ZGF0ZVJvb3QpOworICAgICAgICByZWJ1aWxkQ29tcG9zaXRpbmdMYXllclRyZWUodXBkYXRlUm9v
dCwgY29tcFN0YXRlKTsKKyAgICB9CisgICAgCisjaWYgUFJPRklMRV9MQVlFUl9SRUJVSUxECisg
ICAgZG91YmxlIGVuZFRpbWUgPSBXVEY6OmN1cnJlbnRUaW1lKCk7CisgICAgaWYgKCF1cGRhdGVS
b290KQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVwZGF0ZSAlZDogY29tcHV0ZUNvbXBvc2l0
aW5nUmVxdWlyZW1lbnRzIGZvciB0aGUgd29ybGQgdG9vayAlZm1zXG4iCisgICAgICAgICAgICAg
ICAgICAgIG1fcm9vdExheWVyVXBkYXRlQ291bnQsIDEwMDAuMCAqIChlbmRUaW1lIC0gc3RhcnRU
aW1lKSk7CisjZW5kaWYKKyAgICBBU1NFUlQoIW1fY29tcG9zaXRpbmdMYXllcnNOZWVkVXBkYXRl
KTsKK30KKworYm9vbCBSZW5kZXJMYXllckNvbXBvc2l0b3I6OnVwZGF0ZUxheWVyQ29tcG9zaXRp
bmdTdGF0ZShSZW5kZXJMYXllciogbGF5ZXIsIFJlbmRlclN0eWxlOjpEaWZmIGRpZmYpCit7Cisg
ICAgYm9vbCBuZWVkc0xheWVyID0gbmVlZHNUb0JlQ29tcG9zaXRlZChsYXllcik7CisgICAgYm9v
bCBsYXllckNoYW5nZWQgPSBmYWxzZTsKKyAgICBpZiAobmVlZHNMYXllcikgeworICAgICAgICBl
bmFibGVDb21wb3NpdGluZ01vZGUoKTsKKyAgICAgICAgaWYgKCFsYXllci0+YmFja2luZygpKSB7
CisgICAgICAgICAgICBsYXllci0+ZW5zdXJlQmFja2luZygpOworICAgICAgICAgICAgbGF5ZXJD
aGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChsYXll
ci0+YmFja2luZygpKSB7CisgICAgICAgICAgICBsYXllci0+Y2xlYXJCYWNraW5nKCk7CisgICAg
ICAgICAgICBsYXllckNoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIAorICAg
IGlmIChsYXllckNoYW5nZWQpIHsKKyAgICAgICAgLy8gaW52YWxpZGF0ZSB0aGUgcGFyZW50IGlu
IHRoaXMgcmVnaW9uCisgICAgICAgIFJlbmRlckxheWVyKiBjb21wTGF5ZXIgPSBlbmNsb3NpbmdD
b21wb3NpdGluZ0xheWVyKGxheWVyLCBmYWxzZSk7CisgICAgICAgIGlmIChjb21wTGF5ZXIpIHsK
KyAgICAgICAgICAgIC8vIFdlIGNhbid0IHJlbGlhYmx5IGNvbXB1dGUgYSBkaXJ0eSByZWN0LCBi
ZWNhdXNlIHN0eWxlIG1heSBoYXZlIGNoYW5nZWQgYWxyZWFkeSwgCisgICAgICAgICAgICAvLyBz
byBqdXN0IGRpcnR5IHRoZSB3aG9sZSBwYXJlbnQgbGF5ZXIKKyAgICAgICAgICAgIGNvbXBMYXll
ci0+c2V0TmVlZHNSZXBhaW50KCk7CisgICAgICAgICAgICAvLyBUaGUgY29udGVudHMgb2YgdGhp
cyBsYXllciBtYXkgYmUgbW92aW5nIGJldHdlZW4gdGhlIHdpbmRvdworICAgICAgICAgICAgLy8g
YW5kIGEgR3JhcGhpY3NMYXllciwgc28gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIHdpbmRvdyBz
eXN0ZW0KKyAgICAgICAgICAgIC8vIHN5bmNocm9uaXplcyB0aG9zZSBjaGFuZ2VzIG9uIHRoZSBz
Y3JlZW4uCisgICAgICAgICAgICBtX3JlbmRlclZpZXctPmZyYW1lVmlldygpLT5zZXROZWVkc1N5
bmNocm9uaXplZEdyYXBoaWNzRmx1c2goKTsKKyAgICAgICAgfQorCisgICAgICAgIGxheWVyLT5y
ZW5kZXJlcigpLT5jb21wb3NpdGluZ1N0YXRlQ2hhbmdlZCgpOworICAgIH0KKworICAgIGlmICgh
bmVlZHNMYXllcikKKyAgICAgICAgcmV0dXJuIGxheWVyQ2hhbmdlZDsKKworICAgIGlmIChsYXll
ci0+YmFja2luZygpLT51cGRhdGVHcmFwaGljc0xheWVycyhuZWVkc0NvbnRlbnRzQ29tcG9zaXRp
bmdMYXllcihsYXllciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNsaXBwZWRCeUFuY2VzdG9yKGxheWVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY2xpcHNDb21wb3NpdGluZ0Rlc2NlbmRhbnRzKGxheWVy
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiA+
PSBSZW5kZXJTdHlsZTo6UmVwYWludCkpCisgICAgICAgIGxheWVyQ2hhbmdlZCA9IHRydWU7CisK
KyAgICByZXR1cm4gbGF5ZXJDaGFuZ2VkOworfQorCisvLyBUaGUgYm91bmRzIG9mIHRoZSBHcmFw
aGljc0xheWVyIGNyZWF0ZWQgZm9yIGEgY29tcG9zaXRpbmcgbGF5ZXIgaXMgdGhlIHVuaW9uIG9m
IHRoZSBib3VuZHMgb2YgYWxsIHRoZSBkZXNjZW5kYW50CisvLyBSZW5kZXJMYXllcnMgdGhhdCBh
cmUgcmVuZGVyZWQgYnkgdGhlIGNvbXBvc2l0ZWQgUmVuZGVyTGF5ZXIuCitJbnRSZWN0IFJlbmRl
ckxheWVyQ29tcG9zaXRvcjo6Y2FsY3VsYXRlQ29tcG9zaXRlZEJvdW5kcyhjb25zdCBSZW5kZXJM
YXllciogbGF5ZXIsIGNvbnN0IFJlbmRlckxheWVyKiBhbmNlc3RvckxheWVyLCBJbnRSZWN0KiBs
YXllckJvdW5kaW5nQm94KQoreworICAgIEludFJlY3QgYm91bmRpbmdCb3hSZWN0LCB1bmlvbkJv
dW5kczsKKyAgICBib3VuZGluZ0JveFJlY3QgPSB1bmlvbkJvdW5kcyA9IGxheWVyLT5ib3VuZGlu
Z0JveChsYXllcik7CisgICAgCisgICAgQVNTRVJUKGxheWVyLT5pc1N0YWNraW5nQ29udGV4dCgp
IHx8ICghbGF5ZXItPm1fcG9zWk9yZGVyTGlzdCB8fCBsYXllci0+bV9wb3NaT3JkZXJMaXN0LT5z
aXplKCkgPT0gMCkpOworCisgICAgVmVjdG9yPFJlbmRlckxheWVyKj4qIG5lZ1pPcmRlckxpc3Qg
PSBsYXllci0+bmVnWk9yZGVyTGlzdCgpOworICAgIGlmIChuZWdaT3JkZXJMaXN0KSB7CisgICAg
ICAgIGZvciAoVmVjdG9yPFJlbmRlckxheWVyKj46Oml0ZXJhdG9yIGl0ID0gbmVnWk9yZGVyTGlz
dC0+YmVnaW4oKTsgaXQgIT0gbmVnWk9yZGVyTGlzdC0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAg
ICAgIFJlbmRlckxheWVyKiBjdXJMYXllciA9ICgqaXQpOworICAgICAgICAgICAgaWYgKCFjdXJM
YXllci0+aXNDb21wb3NpdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBJbnRSZWN0IGNoaWxkVW5p
b25Cb3VuZHMgPSBjYWxjdWxhdGVDb21wb3NpdGVkQm91bmRzKGN1ckxheWVyLCBsYXllcik7Cisg
ICAgICAgICAgICAgICAgdW5pb25Cb3VuZHMudW5pdGUoY2hpbGRVbmlvbkJvdW5kcyk7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWZWN0b3I8UmVuZGVyTGF5ZXIqPiog
cG9zWk9yZGVyTGlzdCA9IGxheWVyLT5wb3NaT3JkZXJMaXN0KCk7CisgICAgaWYgKHBvc1pPcmRl
ckxpc3QpIHsKKyAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyTGF5ZXIqPjo6aXRlcmF0b3IgaXQg
PSBwb3NaT3JkZXJMaXN0LT5iZWdpbigpOyBpdCAhPSBwb3NaT3JkZXJMaXN0LT5lbmQoKTsgKytp
dCkgeworICAgICAgICAgICAgUmVuZGVyTGF5ZXIqIGN1ckxheWVyID0gKCppdCk7CisgICAgICAg
ICAgICBpZiAoIWN1ckxheWVyLT5pc0NvbXBvc2l0ZWQoKSkgeworICAgICAgICAgICAgICAgIElu
dFJlY3QgY2hpbGRVbmlvbkJvdW5kcyA9IGNhbGN1bGF0ZUNvbXBvc2l0ZWRCb3VuZHMoY3VyTGF5
ZXIsIGxheWVyKTsKKyAgICAgICAgICAgICAgICB1bmlvbkJvdW5kcy51bml0ZShjaGlsZFVuaW9u
Qm91bmRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFZlY3RvcjxS
ZW5kZXJMYXllcio+KiBvdmVyZmxvd0xpc3QgPSBsYXllci0+b3ZlcmZsb3dMaXN0KCk7CisgICAg
aWYgKG92ZXJmbG93TGlzdCkgeworICAgICAgICBmb3IgKFZlY3RvcjxSZW5kZXJMYXllcio+Ojpp
dGVyYXRvciBpdCA9IG92ZXJmbG93TGlzdC0+YmVnaW4oKTsgaXQgIT0gb3ZlcmZsb3dMaXN0LT5l
bmQoKTsgKytpdCkgeworICAgICAgICAgICAgUmVuZGVyTGF5ZXIqIGN1ckxheWVyID0gKCppdCk7
CisgICAgICAgICAgICBpZiAoIWN1ckxheWVyLT5pc0NvbXBvc2l0ZWQoKSkgeworICAgICAgICAg
ICAgICAgIEludFJlY3QgY3VyQWJzQm91bmRzID0gY2FsY3VsYXRlQ29tcG9zaXRlZEJvdW5kcyhj
dXJMYXllciwgbGF5ZXIpOworICAgICAgICAgICAgICAgIHVuaW9uQm91bmRzLnVuaXRlKGN1ckFi
c0JvdW5kcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWxh
eWVyLT5pc0NvbXBvc2l0ZWQoKSAmJiBsYXllci0+dHJhbnNmb3JtKCkpIHsKKyAgICAgICAgVHJh
bnNmb3JtYXRpb25NYXRyaXgqIGFmZmluZVRyYW5zID0gbGF5ZXItPnRyYW5zZm9ybSgpOworICAg
ICAgICBib3VuZGluZ0JveFJlY3QgPSBhZmZpbmVUcmFucy0+bWFwUmVjdChib3VuZGluZ0JveFJl
Y3QpOworICAgICAgICB1bmlvbkJvdW5kcyA9IGFmZmluZVRyYW5zLT5tYXBSZWN0KHVuaW9uQm91
bmRzKTsKKyAgICB9CisKKyAgICBpbnQgYW5jZXN0b3JSZWxYID0gMCwgYW5jZXN0b3JSZWxZID0g
MDsKKyAgICBsYXllci0+Y29udmVydFRvTGF5ZXJDb29yZHMoYW5jZXN0b3JMYXllciwgYW5jZXN0
b3JSZWxYLCBhbmNlc3RvclJlbFkpOworICAgIHVuaW9uQm91bmRzLm1vdmUoYW5jZXN0b3JSZWxY
LCBhbmNlc3RvclJlbFkpOworCisgICAgaWYgKGxheWVyQm91bmRpbmdCb3gpIHsKKyAgICAgICAg
Ym91bmRpbmdCb3hSZWN0Lm1vdmUoYW5jZXN0b3JSZWxYLCBhbmNlc3RvclJlbFkpOworICAgICAg
ICAqbGF5ZXJCb3VuZGluZ0JveCA9IGJvdW5kaW5nQm94UmVjdDsKKyAgICB9CisgICAgCisgICAg
cmV0dXJuIHVuaW9uQm91bmRzOworfQorCit2b2lkIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6bGF5
ZXJXYXNBZGRlZChSZW5kZXJMYXllciogLypwYXJlbnQqLywgUmVuZGVyTGF5ZXIqIC8qY2hpbGQq
LykKK3sKKyAgICBzZXRDb21wb3NpdGluZ0xheWVyc05lZWRVcGRhdGUoKTsKK30KKwordm9pZCBS
ZW5kZXJMYXllckNvbXBvc2l0b3I6OmxheWVyV2lsbEJlUmVtb3ZlZChSZW5kZXJMYXllciogcGFy
ZW50LCBSZW5kZXJMYXllciogY2hpbGQpCit7CisgICAgaWYgKGNoaWxkLT5pc0NvbXBvc2l0ZWQo
KSkKKyAgICAgICAgc2V0Q29tcG9zaXRpbmdQYXJlbnQoY2hpbGQsIDApOworICAgIAorICAgIFJl
bmRlckxheWVyKiBjb21wTGF5ZXIgPSBlbmNsb3NpbmdDb21wb3NpdGluZ0xheWVyKHBhcmVudCwg
ZmFsc2UpOworICAgIGlmIChjb21wTGF5ZXIpIHsKKyAgICAgICAgSW50UmVjdCBhbmNlc3RvclJl
Y3QgPSBjYWxjdWxhdGVDb21wb3NpdGVkQm91bmRzKGNoaWxkLCBjb21wTGF5ZXIpOworICAgICAg
ICBjb21wTGF5ZXItPnNldE5lZWRzUmVwYWludEluUmVjdChhbmNlc3RvclJlY3QpOworICAgICAg
ICAvLyBUaGUgY29udGVudHMgb2YgdGhpcyBsYXllciBtYXkgYmUgbW92aW5nIGZyb20gYSBHcmFw
aGljc0xheWVyIHRvIHRoZSB3aW5kb3csCisgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gbWFrZSBz
dXJlIHRoZSB3aW5kb3cgc3lzdGVtIHN5bmNocm9uaXplcyB0aG9zZSBjaGFuZ2VzIG9uIHRoZSBz
Y3JlZW4uCisgICAgICAgIG1fcmVuZGVyVmlldy0+ZnJhbWVWaWV3KCktPnNldE5lZWRzU3luY2hy
b25pemVkR3JhcGhpY3NGbHVzaCgpOworICAgIH0KKworICAgIHNldENvbXBvc2l0aW5nTGF5ZXJz
TmVlZFVwZGF0ZSgpOworfQorCitSZW5kZXJMYXllciogUmVuZGVyTGF5ZXJDb21wb3NpdG9yOjpl
bmNsb3NpbmdDb21wb3NpdGluZ0xheWVyKFJlbmRlckxheWVyKiBsYXllciwgYm9vbCBpbmNsdWRl
U2VsZikgY29uc3QKK3sKKyAgICBpZiAoaW5jbHVkZVNlbGYgJiYgbGF5ZXItPmlzQ29tcG9zaXRl
ZCgpKQorICAgICAgICByZXR1cm4gbGF5ZXI7CisKKyAgICBib29sIGNoaWxkT3ZlcmZsb3dPbmx5
ID0gbGF5ZXItPmlzT3ZlcmZsb3dPbmx5KCk7CisgICAgZm9yIChSZW5kZXJMYXllciogY3VyciA9
IGxheWVyLT5wYXJlbnQoKTsgY3VycjsgY3VyciA9IGN1cnItPnBhcmVudCgpKSB7CisgICAgICAg
IC8vIENvbXBvc2l0aW5nIGxheWVycyBhcmUgcGFyZW50ZWQgYWNjb3JkaW5nIHRvIHN0YWNraW5n
IG9yZGVyIGFuZCBvdmVyZmxvdyBsaXN0LAorICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNoZWNr
IHdoZXRoZXIgdGhlIHBhcmVudCBpcyBhIHN0YWNraW5nIGNvbnRleHQsIG9yIHdoZXRoZXIgCisg
ICAgICAgIC8vIHRoZSBjaGlsZCBpcyBvdmVyZmxvdy1vbmx5LgorICAgICAgICBpZiAoY3Vyci0+
aXNDb21wb3NpdGVkKCkgJiYgKGNoaWxkT3ZlcmZsb3dPbmx5IHx8IGN1cnItPmlzU3RhY2tpbmdD
b250ZXh0KCkpKQorICAgICAgICAgICAgcmV0dXJuIGN1cnI7CisgICAgICAgIAorICAgICAgICBj
aGlsZE92ZXJmbG93T25seSA9IGN1cnItPmlzT3ZlcmZsb3dPbmx5KCk7CisgICAgfQorICAgICAg
ICAgCisgICAgcmV0dXJuIDA7Cit9CisKK1JlbmRlckxheWVyKiBSZW5kZXJMYXllckNvbXBvc2l0
b3I6OmVuY2xvc2luZ05vblN0YWNraW5nQ2xpcHBpbmdMYXllcihjb25zdCBSZW5kZXJMYXllciog
bGF5ZXIpIGNvbnN0Cit7CisgICAgZm9yIChSZW5kZXJMYXllciogY3VyciA9IGxheWVyLT5wYXJl
bnQoKTsgY3VyciAhPSAwOyBjdXJyID0gY3Vyci0+cGFyZW50KCkpIHsKKyAgICAgICAgaWYgKGN1
cnItPmlzU3RhY2tpbmdDb250ZXh0KCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAg
ICBpZiAoY3Vyci0+cmVuZGVyZXIoKS0+aGFzT3ZlcmZsb3dDbGlwKCkpCisgICAgICAgICAgICBy
ZXR1cm4gY3VycjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8vICBSZWN1cnNlIHRocm91
Z2ggdGhlIGxheWVycyBpbiB6LWluZGV4IGFuZCBvdmVyZmxvdyBvcmRlciAod2hpY2ggaXMgZXF1
aXZhbGVudCB0byBwYWludGluZyBvcmRlcikKKy8vICBGb3IgdGhlIHotb3JkZXIgY2hpbGRyZW4g
b2YgYSBjb21wb3NpdGluZyBsYXllcjoKKy8vICAgICAgSWYgYSBjaGlsZCBsYXllcnMgaGFzIGEg
Y29tcG9zaXRpbmcgbGF5ZXIsIHRoZW4gYWxsIHN1YnNlcXVlbnQgbGF5ZXJzIG11c3QKKy8vICAg
ICAgYmUgY29tcG9zaXRpbmcgaW4gb3JkZXIgdG8gcmVuZGVyIGFib3ZlIHRoYXQgbGF5ZXIuCisv
LworLy8gICAgICBJZiBhIGNoaWxkIGluIHRoZSBuZWdhdGl2ZSB6LW9yZGVyIGxpc3QgaXMgY29t
cG9zaXRpbmcsIHRoZW4gdGhlIGxheWVyIGl0c2VsZgorLy8gICAgICBtdXN0IGJlIGNvbXBvc2l0
aW5nIHNvIHRoYXQgaXRzIGNvbnRlbnRzIHJlbmRlciBvdmVyIHRoYXQgY2hpbGQuCisvLyAgICAg
IFRoaXMgaW1wbGllcyB0aGF0IGl0cyBwb3NpdGl2ZSB6LWluZGV4IGNoaWxkcmVuIG11c3QgYWxz
byBiZSBjb21wb3NpdGluZy4KKy8vCit2b2lkIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6Y29tcHV0
ZUNvbXBvc2l0aW5nUmVxdWlyZW1lbnRzKFJlbmRlckxheWVyKiBsYXllciwgc3RydWN0IENvbXBv
c2l0aW5nU3RhdGUmIGlvQ29tcFN0YXRlKQoreworICAgIC8vIE1ha2Ugc3VyZSB0aGlzIGxheWVy
J3Mgei1vcmRlciBhbmQgb3ZlcmZsb3cgbGlzdHMgYXJlIHVwIHRvIGRhdGUKKyAgICBsYXllci0+
dXBkYXRlVGhpc0xheWVyKCk7CisgICAgCisgICAgLy8gQ2xlYXIgdGhlIGZsYWcKKyAgICBsYXll
ci0+c2V0SGFzQ29tcG9zaXRpbmdEZXNjZW5kYW50KGZhbHNlKTsKKworICAgIHNldEZvcmNlZENv
bXBvc2l0aW5nTGF5ZXIobGF5ZXIsIGlvQ29tcFN0YXRlLm1fc3VidHJlZUlzQ29tcG9zaXRpbmcp
OworICAgIAorICAgIGNvbnN0IGJvb2wgaXNDb21wb3NpdGluZ0xheWVyID0gbmVlZHNUb0JlQ29t
cG9zaXRlZChsYXllcik7CisgICAgaW9Db21wU3RhdGUubV9zdWJ0cmVlSXNDb21wb3NpdGluZyA9
IGlzQ29tcG9zaXRpbmdMYXllcjsKKworICAgIENvbXBvc2l0aW5nU3RhdGUgY2hpbGRTdGF0ZSA9
IGlvQ29tcFN0YXRlOworICAgIGlmIChpc0NvbXBvc2l0aW5nTGF5ZXIpCisgICAgICAgIGNoaWxk
U3RhdGUubV9jb21wb3NpdGluZ0FuY2VzdG9yID0gbGF5ZXI7CisKKyAgICAvLyBUaGUgY2hpbGRy
ZW4gb2YgdGhpcyBzdGFja2luZyBjb250ZXh0IGRvbid0IG5lZWQgdG8gY29tcG9zaXRlLCB1bmxl
c3MgdGhlcmUgaXMKKyAgICAvLyBhIGNvbXBvc2l0aW5nIGxheWVyIGFtb25nIHRoZW0sIHNvIHN0
YXJ0IGJ5IGFzc3VtaW5nIGZhbHNlLgorICAgIGNoaWxkU3RhdGUubV9zdWJ0cmVlSXNDb21wb3Np
dGluZyA9IGZhbHNlOworCisjaWZuZGVmIE5ERUJVRworICAgICsrY2hpbGRTdGF0ZS5tX2RlcHRo
OworI2VuZGlmCisKKyAgICBpZiAobGF5ZXItPmlzU3RhY2tpbmdDb250ZXh0KCkpIHsKKyAgICAg
ICAgQVNTRVJUKCFsYXllci0+bV96T3JkZXJMaXN0c0RpcnR5KTsKKyAgICAgICAgVmVjdG9yPFJl
bmRlckxheWVyKj4qIG5lZ1pPcmRlckxpc3QgPSBsYXllci0+bmVnWk9yZGVyTGlzdCgpOworICAg
ICAgICBpZiAobmVnWk9yZGVyTGlzdCAmJiBuZWdaT3JkZXJMaXN0LT5zaXplKCkgPiAwKSB7Cisg
ICAgICAgICAgICBmb3IgKFZlY3RvcjxSZW5kZXJMYXllcio+Ojpjb25zdF9pdGVyYXRvciBpdCA9
IG5lZ1pPcmRlckxpc3QtPmJlZ2luKCk7IGl0ICE9IG5lZ1pPcmRlckxpc3QtPmVuZCgpOyArK2l0
KSB7CisgICAgICAgICAgICAgICAgUmVuZGVyTGF5ZXIqIGN1ckxheWVyID0gKCppdCk7CisgICAg
ICAgICAgICAgICAgY29tcHV0ZUNvbXBvc2l0aW5nUmVxdWlyZW1lbnRzKGN1ckxheWVyLCBjaGls
ZFN0YXRlKTsKKworICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgdG8gbWFrZSBhIGxheWVy
IGZvciB0aGlzIGNoaWxkLCBtYWtlIG9uZSBub3cgc28gd2UgY2FuIGhhdmUgYSBjb250ZW50cyBs
YXllcgorICAgICAgICAgICAgICAgIC8vIChzaW5jZSB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRo
ZSAtdmUgei1vcmRlciBjaGlsZCByZW5kZXJzIHVuZGVybmVhdGggb3VyIGNvbnRlbnRzKQorICAg
ICAgICAgICAgICAgIGlmIChjaGlsZFN0YXRlLm1fc3VidHJlZUlzQ29tcG9zaXRpbmcpIHsKKyAg
ICAgICAgICAgICAgICAgICAgLy8gbWFrZSB8dGhpc3wgY29tcG9zaXRpbmcKKyAgICAgICAgICAg
ICAgICAgICAgc2V0Rm9yY2VkQ29tcG9zaXRpbmdMYXllcihsYXllciwgdHJ1ZSk7CisgICAgICAg
ICAgICAgICAgICAgIGNoaWxkU3RhdGUubV9jb21wb3NpdGluZ0FuY2VzdG9yID0gbGF5ZXI7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAor
ICAgIEFTU0VSVCghbGF5ZXItPm1fb3ZlcmZsb3dMaXN0RGlydHkpOworICAgIFZlY3RvcjxSZW5k
ZXJMYXllcio+KiBvdmVyZmxvd0xpc3QgPSBsYXllci0+b3ZlcmZsb3dMaXN0KCk7CisgICAgaWYg
KG92ZXJmbG93TGlzdCAmJiBvdmVyZmxvd0xpc3QtPnNpemUoKSA+IDApIHsKKyAgICAgICAgZm9y
IChWZWN0b3I8UmVuZGVyTGF5ZXIqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBvdmVyZmxvd0xpc3Qt
PmJlZ2luKCk7IGl0ICE9IG92ZXJmbG93TGlzdC0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAg
IFJlbmRlckxheWVyKiBjdXJMYXllciA9ICgqaXQpOworICAgICAgICAgICAgY29tcHV0ZUNvbXBv
c2l0aW5nUmVxdWlyZW1lbnRzKGN1ckxheWVyLCBjaGlsZFN0YXRlKTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIGlmIChsYXllci0+aXNTdGFja2luZ0NvbnRleHQoKSkgeworICAgICAgICBWZWN0
b3I8UmVuZGVyTGF5ZXIqPiogcG9zWk9yZGVyTGlzdCA9IGxheWVyLT5wb3NaT3JkZXJMaXN0KCk7
CisgICAgICAgIGlmIChwb3NaT3JkZXJMaXN0ICYmIHBvc1pPcmRlckxpc3QtPnNpemUoKSA+IDAp
IHsKKyAgICAgICAgICAgIGZvciAoVmVjdG9yPFJlbmRlckxheWVyKj46OmNvbnN0X2l0ZXJhdG9y
IGl0ID0gcG9zWk9yZGVyTGlzdC0+YmVnaW4oKTsgaXQgIT0gcG9zWk9yZGVyTGlzdC0+ZW5kKCk7
ICsraXQpIHsKKyAgICAgICAgICAgICAgICBSZW5kZXJMYXllciogY3VyTGF5ZXIgPSAoKml0KTsK
KyAgICAgICAgICAgICAgICBjb21wdXRlQ29tcG9zaXRpbmdSZXF1aXJlbWVudHMoY3VyTGF5ZXIs
IGNoaWxkU3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8g
SWYgd2UgaGF2ZSBhIHNvZnR3YXJlIHRyYW5zZm9ybSwgYW5kIHdlIGhhdmUgbGF5ZXJzIHVuZGVy
IHVzLCB3ZSBuZWVkIHRvIGFsc28KKyAgICAvLyBiZSBjb21wb3NpdGVkLiBBbHNvLCBpZiB3ZSBo
YXZlIG9wYWNpdHkgPCAxLCB0aGVuIHdlIG5lZWQgdG8gYmUgYSBsYXllciBzbyB0aGF0CisgICAg
Ly8gdGhlIGNoaWxkIGxheWVycyBhcmUgb3BhcXVlLCB0aGVuIHJlbmRlcmVkIHdpdGggb3BhY2l0
eSBvbiB0aGlzIGxheWVyLgorICAgIGlmIChjaGlsZFN0YXRlLm1fc3VidHJlZUlzQ29tcG9zaXRp
bmcgJiYKKyAgICAgICAgKGxheWVyLT5yZW5kZXJlcigpLT5zdHlsZSgpLT5oYXNUcmFuc2Zvcm0o
KSB8fCBsYXllci0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+b3BhY2l0eSgpIDwgMSkpCisgICAgICAg
IHNldEZvcmNlZENvbXBvc2l0aW5nTGF5ZXIobGF5ZXIsIHRydWUpOworCisgICAgLy8gU3Vic2Vx
dWVudCBsYXllcnMgaW4gdGhlIHBhcmVudCBzdGFja2luZyBjb250ZXh0IGFsc28gbmVlZCB0byBj
b21wb3NpdGUuCisgICAgaWYgKGNoaWxkU3RhdGUubV9zdWJ0cmVlSXNDb21wb3NpdGluZykKKyAg
ICAgICAgaW9Db21wU3RhdGUubV9zdWJ0cmVlSXNDb21wb3NpdGluZyA9IHRydWU7CisKKyAgICAv
LyBTZXQgdGhlIGZsYWcgdG8gc2F5IHRoYXQgdGhpcyBTQyBoYXMgY29tcG9zaXRpbmcgY2hpbGRy
ZW4uCisgICAgLy8gdGhpcyBjYW4gYWZmZWN0IHRoZSBhbnN3ZXIgdG8gbmVlZHNUb0JlQ29tcG9z
aXRlZCgpIHdoZW4gY2xpcHBpbmcsCisgICAgLy8gYnV0IHRoYXQncyBvayBoZXJlLgorICAgIGxh
eWVyLT5zZXRIYXNDb21wb3NpdGluZ0Rlc2NlbmRhbnQoY2hpbGRTdGF0ZS5tX3N1YnRyZWVJc0Nv
bXBvc2l0aW5nKTsKK30KKwordm9pZCBSZW5kZXJMYXllckNvbXBvc2l0b3I6OnNldEZvcmNlZENv
bXBvc2l0aW5nTGF5ZXIoUmVuZGVyTGF5ZXIqIGxheWVyLCBib29sIGZvcmNlKQoreworICAgIGlm
IChmb3JjZSkgeworICAgICAgICBsYXllci0+ZW5zdXJlQmFja2luZygpOworICAgICAgICBsYXll
ci0+YmFja2luZygpLT5mb3JjZUNvbXBvc2l0aW5nTGF5ZXIoKTsKKyAgICB9IGVsc2UgeworICAg
ICAgICBpZiAobGF5ZXItPmJhY2tpbmcoKSkKKyAgICAgICAgICAgIGxheWVyLT5iYWNraW5nKCkt
PmZvcmNlQ29tcG9zaXRpbmdMYXllcihmYWxzZSk7CisgICAgfQorfQorCit2b2lkIFJlbmRlckxh
eWVyQ29tcG9zaXRvcjo6c2V0Q29tcG9zaXRpbmdQYXJlbnQoUmVuZGVyTGF5ZXIqIGNoaWxkTGF5
ZXIsIFJlbmRlckxheWVyKiBwYXJlbnRMYXllcikKK3sKKyAgICBBU1NFUlQoY2hpbGRMYXllci0+
aXNDb21wb3NpdGVkKCkpOworICAgIEFTU0VSVCghcGFyZW50TGF5ZXIgfHwgcGFyZW50TGF5ZXIt
PmlzQ29tcG9zaXRlZCgpKTsKKyAgICAKKyAgICBpZiAocGFyZW50TGF5ZXIpIHsKKyAgICAgICAg
R3JhcGhpY3NMYXllciogaG9zdGluZ0xheWVyID0gcGFyZW50TGF5ZXItPmJhY2tpbmcoKS0+cGFy
ZW50Rm9yU3VibGF5ZXJzKCk7CisgICAgICAgIEdyYXBoaWNzTGF5ZXIqIGhvc3RlZExheWVyID0g
Y2hpbGRMYXllci0+YmFja2luZygpLT5jaGlsZEZvclN1cGVybGF5ZXJzKCk7CisgICAgICAgIAor
ICAgICAgICBob3N0aW5nTGF5ZXItPmFkZENoaWxkKGhvc3RlZExheWVyKTsKKyAgICB9IGVsc2UK
KyAgICAgICAgY2hpbGRMYXllci0+YmFja2luZygpLT5jaGlsZEZvclN1cGVybGF5ZXJzKCktPnJl
bW92ZUZyb21QYXJlbnQoKTsKKyAgICAKKyAgICAvLyBGSVhNRTogc2V0Q29tcG9zaXRpbmdQYXJl
bnQoKSBpcyBvbmx5IGNhbGxlZCBhdCBwcmVzZW50IGJ5IHJlYnVpbGRDb21wb3NpdGluZ0xheWVy
VHJlZSgpLAorICAgIC8vIHdoaWNoIGNhbGxzIHVwZGF0ZUdyYXBoaWNzTGF5ZXJHZW9tZXRyeSB2
aWEgdXBkYXRlTGF5ZXJDb21wb3NpdGluZ1N0YXRlKCksIHNvIHRoaXMgc2hvdWxkCisgICAgLy8g
YmUgb3B0aW1pemVkLgorICAgIGlmIChwYXJlbnRMYXllcikKKyAgICAgICAgY2hpbGRMYXllci0+
YmFja2luZygpLT51cGRhdGVHcmFwaGljc0xheWVyR2VvbWV0cnkoKTsKK30KKwordm9pZCBSZW5k
ZXJMYXllckNvbXBvc2l0b3I6OnJlbW92ZUNvbXBvc2l0ZWRDaGlsZHJlbihSZW5kZXJMYXllciog
bGF5ZXIpCit7CisgICAgQVNTRVJUKGxheWVyLT5pc0NvbXBvc2l0ZWQoKSk7CisKKyAgICBHcmFw
aGljc0xheWVyKiBob3N0aW5nTGF5ZXIgPSBsYXllci0+YmFja2luZygpLT5wYXJlbnRGb3JTdWJs
YXllcnMoKTsKKyAgICBob3N0aW5nTGF5ZXItPnJlbW92ZUFsbENoaWxkcmVuKCk7Cit9CisKK3Zv
aWQgUmVuZGVyTGF5ZXJDb21wb3NpdG9yOjpwYXJlbnRJblJvb3RMYXllcihSZW5kZXJMYXllciog
bGF5ZXIpCit7CisgICAgQVNTRVJUKGxheWVyLT5pc0NvbXBvc2l0ZWQoKSk7CisKKyAgICBHcmFw
aGljc0xheWVyKiBsYXllckFuY2hvciA9IGxheWVyLT5iYWNraW5nKCktPmNoaWxkRm9yU3VwZXJs
YXllcnMoKTsKKworICAgIGlmIChsYXllckFuY2hvci0+cGFyZW50KCkgIT0gbV9yb290UGxhdGZv
cm1MYXllcikgeworICAgICAgICBsYXllckFuY2hvci0+cmVtb3ZlRnJvbVBhcmVudCgpOworICAg
ICAgICBpZiAobV9yb290UGxhdGZvcm1MYXllcikKKyAgICAgICAgICAgIG1fcm9vdFBsYXRmb3Jt
TGF5ZXItPmFkZENoaWxkKGxheWVyQW5jaG9yKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyTGF5
ZXJDb21wb3NpdG9yOjpyZWJ1aWxkQ29tcG9zaXRpbmdMYXllclRyZWUoUmVuZGVyTGF5ZXIqIGxh
eWVyLCBzdHJ1Y3QgQ29tcG9zaXRpbmdTdGF0ZSYgaW9Db21wU3RhdGUpCit7CisgICAgdXBkYXRl
TGF5ZXJDb21wb3NpdGluZ1N0YXRlKGxheWVyLCBSZW5kZXJTdHlsZTo6RXF1YWwpOworCisgICAg
Ly8gaG9zdCB0aGUgZG9jdW1lbnQgbGF5ZXIgaW4gdGhlIFJlbmRlclZpZXcncyByb290IGxheWVy
CisgICAgaWYgKGxheWVyLT5pc0RvY3VtZW50TGF5ZXIoKSkKKyAgICAgICAgcGFyZW50SW5Sb290
TGF5ZXIobGF5ZXIpOworCisgICAgQ29tcG9zaXRpbmdTdGF0ZSBjaGlsZFN0YXRlID0gaW9Db21w
U3RhdGU7CisgICAgaWYgKGxheWVyLT5pc0NvbXBvc2l0ZWQoKSkKKyAgICAgICAgY2hpbGRTdGF0
ZS5tX2NvbXBvc2l0aW5nQW5jZXN0b3IgPSBsYXllcjsKKworI2lmbmRlZiBOREVCVUcKKyAgICAr
K2NoaWxkU3RhdGUubV9kZXB0aDsKKyNlbmRpZgorCisgICAgUmVuZGVyTGF5ZXJCYWNraW5nKiBs
YXllckJhY2tpbmcgPSBsYXllci0+YmFja2luZygpOworICAgIAorICAgIC8vIEZJWE1FOiBtYWtl
IHRoaXMgbW9yZSBpbmNyZW1lbnRhbAorICAgIGlmIChsYXllci0+aXNDb21wb3NpdGVkKCkpIHsK
KyAgICAgICAgbGF5ZXJCYWNraW5nLT5wYXJlbnRGb3JTdWJsYXllcnMoKS0+cmVtb3ZlQWxsQ2hp
bGRyZW4oKTsKKyAgICAgICAgbGF5ZXJCYWNraW5nLT51cGRhdGVJbnRlcm5hbEhpZXJhcmNoeSgp
OworICAgIH0KKyAgICAKKyAgICAvLyBUaGUgY2hpbGRyZW4gb2YgdGhpcyBzdGFja2luZyBjb250
ZXh0IGRvbid0IG5lZWQgdG8gY29tcG9zaXRlLCB1bmxlc3MgdGhlcmUgaXMKKyAgICAvLyBhIGNv
bXBvc2l0aW5nIGxheWVyIGFtb25nIHRoZW0sIHNvIHN0YXJ0IGJ5IGFzc3VtaW5nIGZhbHNlLgor
ICAgIGNoaWxkU3RhdGUubV9zdWJ0cmVlSXNDb21wb3NpdGluZyA9IGZhbHNlOworCisgICAgaWYg
KGxheWVyLT5pc1N0YWNraW5nQ29udGV4dCgpKSB7CisgICAgICAgIEFTU0VSVCghbGF5ZXItPm1f
ek9yZGVyTGlzdHNEaXJ0eSk7CisKKyAgICAgICAgVmVjdG9yPFJlbmRlckxheWVyKj4qIG5lZ1pP
cmRlckxpc3QgPSBsYXllci0+bmVnWk9yZGVyTGlzdCgpOworICAgICAgICBpZiAobmVnWk9yZGVy
TGlzdCAmJiBuZWdaT3JkZXJMaXN0LT5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKFZl
Y3RvcjxSZW5kZXJMYXllcio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG5lZ1pPcmRlckxpc3QtPmJl
Z2luKCk7IGl0ICE9IG5lZ1pPcmRlckxpc3QtPmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAg
ICAgUmVuZGVyTGF5ZXIqIGN1ckxheWVyID0gKCppdCk7CisgICAgICAgICAgICAgICAgcmVidWls
ZENvbXBvc2l0aW5nTGF5ZXJUcmVlKGN1ckxheWVyLCBjaGlsZFN0YXRlKTsKKyAgICAgICAgICAg
ICAgICBpZiAoY3VyTGF5ZXItPmlzQ29tcG9zaXRlZCgpKQorICAgICAgICAgICAgICAgICAgICBz
ZXRDb21wb3NpdGluZ1BhcmVudChjdXJMYXllciwgY2hpbGRTdGF0ZS5tX2NvbXBvc2l0aW5nQW5j
ZXN0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGxheWVyQmFj
a2luZyAmJiBsYXllckJhY2tpbmctPmNvbnRlbnRzTGF5ZXIoKSkgeworICAgICAgICAgICAgLy8g
d2Ugb25seSBoYXZlIGEgY29udGVudHMgbGF5ZXIgaWYgd2UgaGF2ZSBhbiBtX2xheWVyCisgICAg
ICAgICAgICBsYXllckJhY2tpbmctPmNvbnRlbnRzTGF5ZXIoKS0+cmVtb3ZlRnJvbVBhcmVudCgp
OworCisgICAgICAgICAgICBHcmFwaGljc0xheWVyKiBob3N0aW5nTGF5ZXIgPSBsYXllckJhY2tp
bmctPmNsaXBwaW5nTGF5ZXIoKSA/IGxheWVyQmFja2luZy0+Y2xpcHBpbmdMYXllcigpIDogbGF5
ZXJCYWNraW5nLT5ncmFwaGljc0xheWVyKCk7CisgICAgICAgICAgICBob3N0aW5nTGF5ZXItPmFk
ZENoaWxkKGxheWVyQmFja2luZy0+Y29udGVudHNMYXllcigpKTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIEFTU0VSVCghbGF5ZXItPm1fb3ZlcmZsb3dMaXN0RGlydHkpOworICAgIFZlY3RvcjxS
ZW5kZXJMYXllcio+KiBvdmVyZmxvd0xpc3QgPSBsYXllci0+b3ZlcmZsb3dMaXN0KCk7CisgICAg
aWYgKG92ZXJmbG93TGlzdCAmJiBvdmVyZmxvd0xpc3QtPnNpemUoKSA+IDApIHsKKyAgICAgICAg
Zm9yIChWZWN0b3I8UmVuZGVyTGF5ZXIqPjo6aXRlcmF0b3IgaXQgPSBvdmVyZmxvd0xpc3QtPmJl
Z2luKCk7IGl0ICE9IG92ZXJmbG93TGlzdC0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIFJl
bmRlckxheWVyKiBjdXJMYXllciA9ICgqaXQpOworICAgICAgICAgICAgcmVidWlsZENvbXBvc2l0
aW5nTGF5ZXJUcmVlKGN1ckxheWVyLCBjaGlsZFN0YXRlKTsKKyAgICAgICAgICAgIGlmIChjdXJM
YXllci0+aXNDb21wb3NpdGVkKCkpCisgICAgICAgICAgICAgICAgc2V0Q29tcG9zaXRpbmdQYXJl
bnQoY3VyTGF5ZXIsIGNoaWxkU3RhdGUubV9jb21wb3NpdGluZ0FuY2VzdG9yKTsKKyAgICAgICAg
fQorICAgIH0KKyAgICAKKyAgICBpZiAobGF5ZXItPmlzU3RhY2tpbmdDb250ZXh0KCkpIHsKKyAg
ICAgICAgVmVjdG9yPFJlbmRlckxheWVyKj4qIHBvc1pPcmRlckxpc3QgPSBsYXllci0+cG9zWk9y
ZGVyTGlzdCgpOworICAgICAgICBpZiAocG9zWk9yZGVyTGlzdCAmJiBwb3NaT3JkZXJMaXN0LT5z
aXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKFZlY3RvcjxSZW5kZXJMYXllcio+Ojpjb25z
dF9pdGVyYXRvciBpdCA9IHBvc1pPcmRlckxpc3QtPmJlZ2luKCk7IGl0ICE9IHBvc1pPcmRlckxp
c3QtPmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgUmVuZGVyTGF5ZXIqIGN1ckxheWVy
ID0gKCppdCk7CisgICAgICAgICAgICAgICAgcmVidWlsZENvbXBvc2l0aW5nTGF5ZXJUcmVlKGN1
ckxheWVyLCBjaGlsZFN0YXRlKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VyTGF5ZXItPmlzQ29t
cG9zaXRlZCgpKQorICAgICAgICAgICAgICAgICAgICBzZXRDb21wb3NpdGluZ1BhcmVudChjdXJM
YXllciwgY2hpbGRTdGF0ZS5tX2NvbXBvc2l0aW5nQW5jZXN0b3IpOworICAgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgfQorfQorCisvLyByZXBhaW50IHRoZSBnaXZlbiByZWN0IGluIHRoaXMg
bGF5ZXIsIGFuZCBvcHRpb25hbGx5IHRoZSByZWN0IGluIGFsbCBjaGlsZCBsYXllcnMKK3ZvaWQg
UmVuZGVyTGF5ZXJDb21wb3NpdG9yOjpyZXBhaW50Q29tcG9zaXRpbmdMYXllclJlY3QoUmVuZGVy
TGF5ZXIqIGxheWVyLCBjb25zdCBJbnRSZWN0JiBpblJlY3QsIGJvb2wgaW5jbHVkZURlc2NlbmRh
bnRzKQoreworICAgIGlmIChsYXllci0+aXNDb21wb3NpdGVkKCkpCisgICAgICAgIGxheWVyLT5i
YWNraW5nKCktPnNldENvbnRlbnRzTmVlZERpc3BsYXlJblJlY3QoaW5SZWN0KTsKKworICAgIGlm
IChsYXllci0+aGFzQ29tcG9zaXRpbmdEZXNjZW5kYW50KCkgJiYgaW5jbHVkZURlc2NlbmRhbnRz
KSB7CisgICAgICAgIEFTU0VSVChsYXllci0+aXNTdGFja2luZ0NvbnRleHQoKSB8fCAoIWxheWVy
LT5tX3Bvc1pPcmRlckxpc3QgfHwgbGF5ZXItPm1fcG9zWk9yZGVyTGlzdC0+c2l6ZSgpID09IDAp
KTsKKworICAgICAgICBWZWN0b3I8UmVuZGVyTGF5ZXIqPiogbmVnWk9yZGVyTGlzdCA9IGxheWVy
LT5uZWdaT3JkZXJMaXN0KCk7CisgICAgICAgIGlmIChuZWdaT3JkZXJMaXN0KSB7CisgICAgICAg
ICAgICBmb3IgKFZlY3RvcjxSZW5kZXJMYXllcio+OjppdGVyYXRvciBpdCA9IG5lZ1pPcmRlckxp
c3QtPmJlZ2luKCk7IGl0ICE9IG5lZ1pPcmRlckxpc3QtPmVuZCgpOyArK2l0KSB7CisgICAgICAg
ICAgICAgICAgUmVuZGVyTGF5ZXIqIGN1ckxheWVyID0gKCppdCk7CisgICAgICAgICAgICAgICAg
aW50IHggPSAwLCB5ID0gMDsKKyAgICAgICAgICAgICAgICBjdXJMYXllci0+Y29udmVydFRvTGF5
ZXJDb29yZHMobGF5ZXIsIHgsIHkpOworICAgICAgICAgICAgICAgIEludFJlY3QgY2hpbGRSZWN0
KGluUmVjdCk7CisgICAgICAgICAgICAgICAgY2hpbGRSZWN0Lm1vdmUoLXgsIC15KTsKKyAgICAg
ICAgICAgICAgICByZXBhaW50Q29tcG9zaXRpbmdMYXllclJlY3QoY3VyTGF5ZXIsIGNoaWxkUmVj
dCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBWZWN0b3I8UmVu
ZGVyTGF5ZXIqPiogcG9zWk9yZGVyTGlzdCA9IGxheWVyLT5wb3NaT3JkZXJMaXN0KCk7CisgICAg
ICAgIGlmIChwb3NaT3JkZXJMaXN0KSB7CisgICAgICAgICAgICBmb3IgKFZlY3RvcjxSZW5kZXJM
YXllcio+OjppdGVyYXRvciBpdCA9IHBvc1pPcmRlckxpc3QtPmJlZ2luKCk7IGl0ICE9IHBvc1pP
cmRlckxpc3QtPmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgUmVuZGVyTGF5ZXIqIGN1
ckxheWVyID0gKCppdCk7CisgICAgICAgICAgICAgICAgaW50IHggPSAwLCB5ID0gMDsKKyAgICAg
ICAgICAgICAgICBjdXJMYXllci0+Y29udmVydFRvTGF5ZXJDb29yZHMobGF5ZXIsIHgsIHkpOwor
ICAgICAgICAgICAgICAgIEludFJlY3QgY2hpbGRSZWN0KGluUmVjdCk7CisgICAgICAgICAgICAg
ICAgY2hpbGRSZWN0Lm1vdmUoLXgsIC15KTsKKyAgICAgICAgICAgICAgICByZXBhaW50Q29tcG9z
aXRpbmdMYXllclJlY3QoY3VyTGF5ZXIsIGNoaWxkUmVjdCwgdHJ1ZSk7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFZlY3RvcjxSZW5kZXJMYXllcio+KiBvdmVy
Zmxvd0xpc3QgPSBsYXllci0+b3ZlcmZsb3dMaXN0KCk7CisgICAgICAgIGlmIChvdmVyZmxvd0xp
c3QpIHsKKyAgICAgICAgICAgIGZvciAoVmVjdG9yPFJlbmRlckxheWVyKj46Oml0ZXJhdG9yIGl0
ID0gb3ZlcmZsb3dMaXN0LT5iZWdpbigpOyBpdCAhPSBvdmVyZmxvd0xpc3QtPmVuZCgpOyArK2l0
KSB7CisgICAgICAgICAgICAgICAgUmVuZGVyTGF5ZXIqIGN1ckxheWVyID0gKCppdCk7CisgICAg
ICAgICAgICAgICAgaW50IHggPSAwLCB5ID0gMDsKKyAgICAgICAgICAgICAgICBjdXJMYXllci0+
Y29udmVydFRvTGF5ZXJDb29yZHMobGF5ZXIsIHgsIHkpOworICAgICAgICAgICAgICAgIEludFJl
Y3QgY2hpbGRSZWN0KGluUmVjdCk7CisgICAgICAgICAgICAgICAgY2hpbGRSZWN0Lm1vdmUoLXgs
IC15KTsKKyAgICAgICAgICAgICAgICByZXBhaW50Q29tcG9zaXRpbmdMYXllclJlY3QoY3VyTGF5
ZXIsIGNoaWxkUmVjdCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9
CisKK1JlbmRlckxheWVyKiBSZW5kZXJMYXllckNvbXBvc2l0b3I6OnJvb3RSZW5kZXJMYXllcigp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcmVuZGVyVmlldy0+bGF5ZXIoKTsKK30KKworR3JhcGhp
Y3NMYXllciogUmVuZGVyTGF5ZXJDb21wb3NpdG9yOjpyb290UGxhdGZvcm1MYXllcigpIGNvbnN0
Cit7CisgICAgcmV0dXJuIG1fcm9vdFBsYXRmb3JtTGF5ZXI7Cit9CisKK3ZvaWQgUmVuZGVyTGF5
ZXJDb21wb3NpdG9yOjp3aWxsQmVEZXRhY2hlZCgpCit7CisgICAgaWYgKCFtX3Jvb3RQbGF0Zm9y
bUxheWVyIHx8ISBtX3Jvb3RMYXllckF0dGFjaGVkKQorICAgICAgICByZXR1cm47CisKKyAgICBG
cmFtZSogZnJhbWUgPSBtX3JlbmRlclZpZXctPmZyYW1lVmlldygpLT5mcmFtZSgpOworICAgIFBh
Z2UqIHBhZ2UgPSBmcmFtZSA/IGZyYW1lLT5wYWdlKCkgOiAwOworICAgIGlmICghcGFnZSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgcGFnZS0+Y2hyb21lKCktPmNsaWVudCgpLT5hdHRhY2hSb290
R3JhcGhpY3NMYXllcihmcmFtZSwgMCk7CisgICAgbV9yb290TGF5ZXJBdHRhY2hlZCA9IGZhbHNl
OworfQorCit2b2lkIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6d2FzQXR0YWNoZWQoKQoreworICAg
IGlmICghbV9yb290UGxhdGZvcm1MYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgRnJhbWUq
IGZyYW1lID0gbV9yZW5kZXJWaWV3LT5mcmFtZVZpZXcoKS0+ZnJhbWUoKTsKKyAgICBQYWdlKiBw
YWdlID0gZnJhbWUgPyBmcmFtZS0+cGFnZSgpIDogMDsKKyAgICBpZiAoIXBhZ2UpCisgICAgICAg
IHJldHVybjsKKworICAgIHBhZ2UtPmNocm9tZSgpLT5jbGllbnQoKS0+YXR0YWNoUm9vdEdyYXBo
aWNzTGF5ZXIoZnJhbWUsIG1fcm9vdFBsYXRmb3JtTGF5ZXIpOworICAgIG1fcm9vdExheWVyQXR0
YWNoZWQgPSB0cnVlOworfQorCit2b2lkIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6dXBkYXRlUm9v
dExheWVyUG9zaXRpb24oKQoreworICAgIGlmIChtX3Jvb3RQbGF0Zm9ybUxheWVyKQorICAgICAg
ICBtX3Jvb3RQbGF0Zm9ybUxheWVyLT5zZXRTaXplKEZsb2F0U2l6ZShtX3JlbmRlclZpZXctPmRv
Y1dpZHRoKCksIG1fcmVuZGVyVmlldy0+ZG9jSGVpZ2h0KCkpKTsKK30KKworYm9vbCBSZW5kZXJM
YXllckNvbXBvc2l0b3I6Om5lZWRzVG9CZUNvbXBvc2l0ZWQoY29uc3QgUmVuZGVyTGF5ZXIqIGxh
eWVyKSBjb25zdAoreworICAgIHJldHVybiByZXF1aXJlc0NvbXBvc2l0aW5nTGF5ZXIobGF5ZXIp
IHx8IChsYXllci0+YmFja2luZygpICYmIGxheWVyLT5iYWNraW5nKCktPmZvcmNlZENvbXBvc2l0
aW5nTGF5ZXIoKSk7Cit9CisKK3N0YXRpYyBib29sIHJlcXVpcmVzQ29tcG9zaXRpbmdMYXllckZv
clRyYW5zZm9ybShjb25zdCBSZW5kZXJTdHlsZSopCit7CisgICAgcmV0dXJuIGZhbHNlOworfQor
CisjZGVmaW5lIFZFUkJPU0VfQ09NUE9TSVRJTkdMQVlFUiAgICAwCisKKy8vIE5vdGU6IHRoaXMg
c3BlY2lmaWVzIHdoZXRoZXIgdGhlIFJMIG5lZWRzIGEgY29tcG9zaXRpbmcgbGF5ZXIgZm9yIGlu
dHJpbnNpYyByZWFzb25zLgorLy8gVXNlIG5lZWRzVG9CZUNvbXBvc2l0ZWQoKSB0byBkZXRlcm1p
bmUgaWYgYSBSTCBhY3R1YWxseSBuZWVkcyBhIGNvbXBvc2l0aW5nIGxheWVyLgorLy8gc3RhdGlj
Citib29sIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6cmVxdWlyZXNDb21wb3NpdGluZ0xheWVyKGNv
bnN0IFJlbmRlckxheWVyKiBsYXllcikgY29uc3QKK3sKKyAgICAvLyBUT0RPOiBjYWNoZSB0aGUg
cmVzdWx0IG9mIHRoZXNlIHRlc3RzPworICAgIGNvbnN0IFJlbmRlclN0eWxlKiByZW5kZXJTdHls
ZSA9IGxheWVyLT5yZW5kZXJlcigpLT5zdHlsZSgpOworCisjaWYgVkVSQk9TRV9DT01QT1NJVElO
R0xBWUVSCisgICAgYm9vbCBnb3RSZWFzb24gPSBmYWxzZTsKKworICAgIGlmICghZ290UmVhc29u
ICYmIGluQ29tcG9zaXRpbmdNb2RlKCkgJiYgbGF5ZXItPmlzRG9jdW1lbnRMYXllcigpKSB7Cisg
ICAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVuZGVyTGF5ZXIgJXAgcmVxdWlyZXMgY29tcG9zaXRp
bmcgbGF5ZXIgYmVjYXVzZTogaXQncyB0aGUgZG9jdW1lbnQgcm9vdFxuIiwgbGF5ZXIpOworICAg
ICAgICBnb3RSZWFzb24gPSB0cnVlOworICAgIH0KKyAgICAKKyAgICBpZiAoIWdvdFJlYXNvbiAm
JiByZXF1aXJlc0NvbXBvc2l0aW5nTGF5ZXJGb3JUcmFuc2Zvcm0ocmVuZGVyU3R5bGUpKSB7Cisg
ICAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVuZGVyTGF5ZXIgJXAgcmVxdWlyZXMgY29tcG9zaXRp
bmcgbGF5ZXIgYmVjYXVzZTogaXQgaGFzIDNkIHRyYW5zZm9ybSwgcGVyc3BlY3RpdmUsIGJhY2tm
YWNlLCBvciBhbmltYXRpbmcgdHJhbnNmb3JtXG4iLCBsYXllcik7CisgICAgICAgIGdvdFJlYXNv
biA9IHRydWU7CisgICAgfQorCisgICAgaWYgKCFnb3RSZWFzb24gJiYgY2xpcHNDb21wb3NpdGlu
Z0Rlc2NlbmRhbnRzKGxheWVyKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJlbmRlckxh
eWVyICVwIHJlcXVpcmVzIGNvbXBvc2l0aW5nIGxheWVyIGJlY2F1c2U6IGl0IGhhcyBvdmVyZmxv
dyBjbGlwXG4iLCBsYXllcik7CisgICAgICAgIGdvdFJlYXNvbiA9IHRydWU7CisgICAgfQorCisg
ICAgaWYgKCFnb3RSZWFzb24gJiYgcmVxdWlyZXNDb21wb3NpdGluZ0ZvckFuaW1hdGlvbihsYXll
cikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJSZW5kZXJMYXllciAlcCByZXF1aXJlcyBj
b21wb3NpdGluZyBsYXllciBiZWNhdXNlOiBpdCBoYXMgYSBydW5uaW5nIHRyYW5zaXRpb24gZm9y
IG9wYWNpdHkgb3IgdHJhbnNmb3JtXG4iLCBsYXllcik7CisgICAgICAgIGdvdFJlYXNvbiA9IHRy
dWU7CisgICAgfQorICAgIAorICAgIGlmICghZ290UmVhc29uKQorICAgICAgICBmcHJpbnRmKHN0
ZGVyciwgIlJlbmRlckxheWVyICVwIGRvZXMgbm90IHJlcXVpcmUgY29tcG9zaXRpbmcgbGF5ZXJc
biIsIGxheWVyKTsKKyNlbmRpZgorCisgICAgLy8gdGhlIHJvb3QgbGF5ZXIgYWx3YXlzIGhhcyBh
IGNvbXBvc2l0aW5nIGxheWVyIChmb3Igbm93KS4KKyAgICByZXR1cm4gKGluQ29tcG9zaXRpbmdN
b2RlKCkgJiYgbGF5ZXItPmlzRG9jdW1lbnRMYXllcigpKSB8fAorICAgICAgICAgICAgIHJlcXVp
cmVzQ29tcG9zaXRpbmdMYXllckZvclRyYW5zZm9ybShyZW5kZXJTdHlsZSkgfHwKKyAgICAgICAg
ICAgICBjbGlwc0NvbXBvc2l0aW5nRGVzY2VuZGFudHMobGF5ZXIpIHx8CisgICAgICAgICAgICAg
cmVxdWlyZXNDb21wb3NpdGluZ0ZvckFuaW1hdGlvbihsYXllcik7Cit9CisKKy8vIFJldHVybiB0
cnVlIGlmIHRoZSBnaXZlbiBsYXllciBoYXMgc29tZSBhbmNlc3RvciBpbiB0aGUgUmVuZGVyTGF5
ZXIgaGllcmFyY2h5IHRoYXQgY2xpcHMsCisvLyB1cCB0byB0aGUgZW5jbG9zaW5nIGNvbXBvc2l0
aW5nIGFuY2VzdG9yLiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgY29tcG9zaXRpbmcgbGF5ZXJz
IGFyZSBwYXJlbnRlZAorLy8gYWNjb3JkaW5nIHRvIHRoZSB6LW9yZGVyIGhpZXJhcmNoeSwgeWV0
IGNsaXBwaW5nIGdvZXMgZG93biB0aGUgcmVuZGVyZXIgaGllcmFyY2h5LgorLy8gVGh1cywgYSBS
ZW5kZXJMYXllciBjYW4gYmUgY2xpcHBlZCBieSBhIFJlbmRlckxheWVyIHRoYXQgaXMgYW4gYW5j
ZXN0b3IgaW4gdGhlIHJlbmRlcmVyIGhpZXJhcmNoeSwKKy8vIGJ1dCBhIHNpYmxpbmcgaW4gdGhl
IHotb3JkZXIgaGllcmFyY2h5LgorYm9vbCBSZW5kZXJMYXllckNvbXBvc2l0b3I6OmNsaXBwZWRC
eUFuY2VzdG9yKFJlbmRlckxheWVyKiBsYXllcikgY29uc3QKK3sKKyAgICBpZiAoIWxheWVyLT5p
c0NvbXBvc2l0ZWQoKSB8fCAhbGF5ZXItPnBhcmVudCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBSZW5kZXJMYXllciogY29tcG9zaXRpbmdBbmNlc3RvciA9IGVuY2xvc2luZ0NvbXBv
c2l0aW5nTGF5ZXIobGF5ZXIsIGZhbHNlKTsKKworICAgIC8vIFdlIG5lZWQgYW5jZXN0b3IgY2xp
cHBpbmcgaWYgc29tZXRoaW5nIGNsaXBzIGJldHdlZW4gdGhpcyBsYXllciBhbmQgaXRzIGNvbXBv
c2l0aW5nLCBzdGFja2luZyBjb250ZXh0IGFuY2VzdG9yCisgICAgZm9yIChSZW5kZXJMYXllciog
Y3VyTGF5ZXIgPSBsYXllci0+cGFyZW50KCk7IGN1ckxheWVyICYmIGN1ckxheWVyICE9IGNvbXBv
c2l0aW5nQW5jZXN0b3I7IGN1ckxheWVyID0gY3VyTGF5ZXItPnBhcmVudCgpKSB7CisgICAgICAg
IC8vIEZJWE1FOiBuZWVkIHRvIGxvb2sgYXQgaGFzQ2xpcCgpIHRvbyBldmVudHVhbGx5CisgICAg
ICAgIGlmIChjdXJMYXllci0+cmVuZGVyZXIoKS0+aGFzT3ZlcmZsb3dDbGlwKCkpCisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIC8vIENsaXAgaXMgcmVzZXQgZm9y
IGFuIGFic29sdXRlbHkgcG9zaXRpb25lZCBlbGVtZW50LgorICAgICAgICAvLyBGSVhNRTogbWFu
eSBjYXNlcyBhcmUgYnJva2VuLiBXZSBuZWVkIG1vcmUgb2YgdGhlIGxvZ2ljIGluIGNhbGN1bGF0
ZUNsaXBSZWN0cygpIGhlcmUKKyAgICAgICAgaWYgKGN1ckxheWVyLT5yZW5kZXJlcigpLT5zdHls
ZSgpLT5wb3NpdGlvbigpID09IEFic29sdXRlUG9zaXRpb24pCisgICAgICAgICAgICBicmVhazsK
KyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIHRoZSBn
aXZlbiBsYXllciBpcyBhIHN0YWNraW5nIGNvbnRleHQgYW5kIGhhcyBjb21wb3NpdGluZyBjaGls
ZAorLy8gbGF5ZXJzIHRoYXQgaXQgbmVlZHMgdG8gY2xpcC4gSW4gdGhpcyBjYXNlIHdlIGluc2Vy
dCBhIGNsaXBwaW5nIEdyYXBoaWNzTGF5ZXIKKy8vIGludG8gdGhlIGhpZXJhcmNoeSBiZXR3ZWVu
IHRoaXMgbGF5ZXIgYW5kIGl0cyBjaGlsZHJlbiBpbiB0aGUgei1vcmRlciBoaWVyYXJjaHkuCiti
b29sIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6Y2xpcHNDb21wb3NpdGluZ0Rlc2NlbmRhbnRzKGNv
bnN0IFJlbmRlckxheWVyKiBsYXllcikgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogbmVlZCB0byBs
b29rIGF0IGhhc0NsaXAoKSB0b28gZXZlbnR1YWxseQorICAgIHJldHVybiBsYXllci0+aGFzQ29t
cG9zaXRpbmdEZXNjZW5kYW50KCkgJiYKKyAgICAgICAgICAgbGF5ZXItPmlzU3RhY2tpbmdDb250
ZXh0KCkgJiYKKyAgICAgICAgICAgbGF5ZXItPnJlbmRlcmVyKCktPmhhc092ZXJmbG93Q2xpcCgp
OworfQorCitib29sIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6cmVxdWlyZXNDb21wb3NpdGluZ0Zv
ckFuaW1hdGlvbihjb25zdCBSZW5kZXJMYXllciogbGF5ZXIpIGNvbnN0Cit7CisgICAgQW5pbWF0
aW9uQ29udHJvbGxlciogYW5pbUNvbnRyb2xsZXIgPSBsYXllci0+cmVuZGVyZXIoKS0+YW5pbWF0
aW9uKCk7CisgICAgaWYgKGFuaW1Db250cm9sbGVyKQorICAgICAgICByZXR1cm4gYW5pbUNvbnRy
b2xsZXItPmlzQW5pbWF0aW5nUHJvcGVydHlPblJlbmRlcmVyKGxheWVyLT5yZW5kZXJlcigpLCBD
U1NQcm9wZXJ0eU9wYWNpdHkpIHx8CisgICAgICAgICAgICAgICBhbmltQ29udHJvbGxlci0+aXNB
bmltYXRpbmdQcm9wZXJ0eU9uUmVuZGVyZXIobGF5ZXItPnJlbmRlcmVyKCksIENTU1Byb3BlcnR5
V2Via2l0VHJhbnNmb3JtKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIElmIGFuIGVsZW1l
bnQgaGFzIG5lZ2F0aXZlIHotaW5kZXggY2hpbGRyZW4sIHRob3NlIGNoaWxkcmVuIHJlbmRlciBp
biBmcm9udCBvZiB0aGUgCisvLyBsYXllciBiYWNrZ3JvdW5kLCBzbyB3ZSBuZWVkIGFuIGV4dHJh
ICdjb250ZW50cycgbGF5ZXIgZm9yIHRoZSBmb3JlZ3JvdW5kIG9mIHRoZSBsYXllcgorLy8gb2Jq
ZWN0LgorYm9vbCBSZW5kZXJMYXllckNvbXBvc2l0b3I6Om5lZWRzQ29udGVudHNDb21wb3NpdGlu
Z0xheWVyKGNvbnN0IFJlbmRlckxheWVyKiBsYXllcikgY29uc3QKK3sKKyAgICByZXR1cm4gKGxh
eWVyLT5tX25lZ1pPcmRlckxpc3QgJiYgbGF5ZXItPm1fbmVnWk9yZGVyTGlzdC0+c2l6ZSgpID4g
MCk7Cit9CisKK3ZvaWQgUmVuZGVyTGF5ZXJDb21wb3NpdG9yOjplbnN1cmVSb290UGxhdGZvcm1M
YXllcigpCit7CisgICAgaWYgKG1fcm9vdFBsYXRmb3JtTGF5ZXIpCisgICAgICAgIHJldHVybjsK
KworICAgIG1fcm9vdFBsYXRmb3JtTGF5ZXIgPSBHcmFwaGljc0xheWVyOjpjcmVhdGVHcmFwaGlj
c0xheWVyKDApOworICAgIG1fcm9vdFBsYXRmb3JtTGF5ZXItPnNldFNpemUoRmxvYXRTaXplKG1f
cmVuZGVyVmlldy0+ZG9jV2lkdGgoKSwgbV9yZW5kZXJWaWV3LT5kb2NIZWlnaHQoKSkpOworICAg
IG1fcm9vdFBsYXRmb3JtTGF5ZXItPnNldFBvc2l0aW9uKEZsb2F0UG9pbnQoMCwgMCkpOworCisg
ICAgaWYgKEdyYXBoaWNzTGF5ZXI6OmdyYXBoaWNzQ29udGV4dHNGbGlwcGVkKCkpCisgICAgICAg
IG1fcm9vdFBsYXRmb3JtTGF5ZXItPnNldENoaWxkcmVuVHJhbnNmb3JtKGZsaXBUcmFuc2Zvcm0o
KSk7CisKKyAgICAvLyBOZWVkIHRvIGNsaXAgdG8gcHJldmVudCB0cmFuc2Zvcm1lZCBjb250ZW50
IHNob3dpbmcgb3V0c2lkZSB0aGlzIGZyYW1lCisgICAgbV9yb290UGxhdGZvcm1MYXllci0+c2V0
TWFza3NUb0JvdW5kcyh0cnVlKTsKKyAgICAKKyAgICB3YXNBdHRhY2hlZCgpOworfQorCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCisKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQ29tcG9zaXRv
ci5oIGIvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmYzI1NwotLS0gL2Rldi9udWxsCisrKyBiL1dl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQ29tcG9zaXRvci5oCkBAIC0wLDAgKzEsMTM0IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaWZuZGVmIFJlbmRlckxheWVyQ29tcG9zaXRvcl9oCisjZGVmaW5lIFJlbmRlckxheWVyQ29t
cG9zaXRvcl9oCisKKyNpbmNsdWRlICJSZW5kZXJMYXllci5oIgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKKyNkZWZpbmUgUFJPRklMRV9MQVlFUl9SRUJVSUxEIDAKKworY2xhc3MgR3JhcGhpY3NM
YXllcjsKKworLy8gUmVuZGVyTGF5ZXJDb21wb3NpdG9yIG1hbmFnZXMgdGhlIGhpZXJhcmNoeSBv
ZgorLy8gY29tcG9zaXRlZCBSZW5kZXJMYXllcnMuIEl0IGRldGVybWluZXMgd2hpY2ggUmVuZGVy
TGF5ZXJzCisvLyBiZWNvbWUgY29tcG9zaXRpbmcsIGFuZCBjcmVhdGVzIGFuZCBtYWludGFpbnMg
YSBoaWVyYXJjaHkgb2YKKy8vIEdyYXBoaWNzTGF5ZXJzIGJhc2VkIG9uIHRoZSBSZW5kZXJMYXll
ciBwYWludGluZyBvcmRlci4KKy8vIAorLy8gVGhlcmUgaXMgb25lIFJlbmRlckxheWVyQ29tcG9z
aXRvciBwZXIgUmVuZGVyVmlldy4KKworY2xhc3MgUmVuZGVyTGF5ZXJDb21wb3NpdG9yIHsKK3B1
YmxpYzoKKworICAgIFJlbmRlckxheWVyQ29tcG9zaXRvcihSZW5kZXJWaWV3Kik7CisgICAgflJl
bmRlckxheWVyQ29tcG9zaXRvcigpOworICAgIAorICAgIC8vIFJldHVybiB0cnVlIGlmIHRoaXMg
UmVuZGVyVmlldyBpcyBpbiAiY29tcG9zaXRpbmcgbW9kZSIgKGkuZS4gaGFzIG9uZSBvciBtb3Jl
CisgICAgLy8gY29tcG9zaXRlZCBSZW5kZXJMYXllcnMpCisgICAgYm9vbCBpbkNvbXBvc2l0aW5n
TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fY29tcG9zaXRpbmc7IH0KKyAgICAvLyBUaGlzIHdpbGwg
bWFrZSBhIGNvbXBvc2l0aW5nIGxheWVyIGF0IHRoZSByb290IGF1dG9tYXRpY2FsbHksIGFuZCBo
b29rIHVwIHRvCisgICAgLy8gdGhlIG5hdGl2ZSB2aWV3L3dpbmRvdyBzeXN0ZW0uCisgICAgdm9p
ZCBlbmFibGVDb21wb3NpdGluZ01vZGUoYm9vbCBlbmFibGUgPSB0cnVlKTsKKworICAgIHZvaWQg
c2V0Q29tcG9zaXRpbmdMYXllcnNOZWVkVXBkYXRlKGJvb2wgbmVlZFVwZGF0ZSA9IHRydWUpOwor
ICAgIGJvb2wgY29tcG9zaXRpbmdMYXllcnNOZWVkVXBkYXRlKCkgY29uc3QgeyByZXR1cm4gbV9j
b21wb3NpdGluZ0xheWVyc05lZWRVcGRhdGU7IH0KKworICAgIC8vIFJlYnVpbGQgdGhlIHRyZWUg
b2YgY29tcG9zaXRpbmcgbGF5ZXJzCisgICAgdm9pZCB1cGRhdGVDb21wb3NpdGluZ0xheWVycyhS
ZW5kZXJMYXllciogdXBkYXRlUm9vdCA9IDApOworCisgICAgLy8gVXBkYXRlIHRoZSBjb21wb3Np
dGluZyBzdGF0ZSBvZiB0aGUgZ2l2ZW4gbGF5ZXIuIFJldHVybnMgdHJ1ZSBpZiB0aGF0IHN0YXRl
IGNoYW5nZWQKKyAgICBib29sIHVwZGF0ZUxheWVyQ29tcG9zaXRpbmdTdGF0ZShSZW5kZXJMYXll
ciosIFJlbmRlclN0eWxlOjpEaWZmKTsKKworICAgIC8vIFJldHVybiB0aGUgYm91bmRpbmcgYm94
IHJlcXVpcmVkIGZvciBjb21wb3NpdGluZyBsYXllciBhbmQgaXRzIGNoaWxkZXJuLCByZWxhdGl2
ZSB0byBhbmNlc3RvckxheWVyLgorICAgIC8vIElmIGxheWVyQm91bmRpbmdCb3ggaXMgbm90IDAs
IG9uIHJldHVybiBpdCBjb250YWlucyB0aGUgYm91bmRpbmcgYm94IG9mIHRoaXMgbGF5ZXIgb25s
eS4KKyAgICBJbnRSZWN0IGNhbGN1bGF0ZUNvbXBvc2l0ZWRCb3VuZHMoY29uc3QgUmVuZGVyTGF5
ZXIqIGxheWVyLCBjb25zdCBSZW5kZXJMYXllciogYW5jZXN0b3JMYXllciwgSW50UmVjdCogbGF5
ZXJCb3VuZGluZ0JveCA9IDApOworICAgIAorICAgIC8vIE5vdGlmeSB1cyB0aGF0IGEgbGF5ZXIg
aGFzIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZAorICAgIHZvaWQgbGF5ZXJXYXNBZGRlZChSZW5kZXJM
YXllciogcGFyZW50LCBSZW5kZXJMYXllciogY2hpbGQpOworICAgIHZvaWQgbGF5ZXJXaWxsQmVS
ZW1vdmVkKFJlbmRlckxheWVyKiBwYXJlbnQsIFJlbmRlckxheWVyKiBjaGlsZCk7CisKKyAgICAv
LyBHZXRzIHRoZSBuZWFyZXN0IGVuY2xvc2luZyByZW5kZXIgbGF5ZXIgdGhhdCBpcyBjb21wb3Np
dGVkIChvcHRpb25hbGx5IGluY2x1ZGluZyBzZWxmKQorICAgIFJlbmRlckxheWVyKiBlbmNsb3Np
bmdDb21wb3NpdGluZ0xheWVyKFJlbmRlckxheWVyKiBsYXllciwgYm9vbCBpbmNsdWRlU2VsZiA9
IHRydWUpIGNvbnN0OworCisgICAgLy8gR2V0IHRoZSBuZWFyZXN0IGFuY2VzdG9yIGxheWVyIHRo
YXQgaGFzIG92ZXJmbG93IG9yIGNsaXAsIGJ1dCBpcyBub3QgYSBzdGFja2luZyBjb250ZXh0Cisg
ICAgUmVuZGVyTGF5ZXIqIGVuY2xvc2luZ05vblN0YWNraW5nQ2xpcHBpbmdMYXllcihjb25zdCBS
ZW5kZXJMYXllciogbGF5ZXIpIGNvbnN0OworCisgICAgdm9pZCByZXBhaW50Q29tcG9zaXRpbmdM
YXllclJlY3QoUmVuZGVyTGF5ZXIqLCBjb25zdCBJbnRSZWN0JiwgYm9vbCBpbmNsdWRlRGVzY2Vu
ZGFudHMpOworCisgICAgUmVuZGVyTGF5ZXIqIHJvb3RSZW5kZXJMYXllcigpIGNvbnN0OworICAg
IEdyYXBoaWNzTGF5ZXIqIHJvb3RQbGF0Zm9ybUxheWVyKCkgY29uc3Q7CisKKyAgICB2b2lkIHdp
bGxCZURldGFjaGVkKCk7CisgICAgdm9pZCB3YXNBdHRhY2hlZCgpOworICAgIHZvaWQgdXBkYXRl
Um9vdExheWVyUG9zaXRpb24oKTsKKworcHJpdmF0ZToKKyAgICAvLyBXaGV0aGVyIHRoZSBnaXZl
biBSTCBuZWVkcyBhIGNvbXBvc2l0aW5nIGxheWVyLgorICAgIGJvb2wgbmVlZHNUb0JlQ29tcG9z
aXRlZChjb25zdCBSZW5kZXJMYXllciopIGNvbnN0OworICAgIC8vIFdoZXRoZXIgdGhlIGxheWVy
IGhhcyBhbiBpbnRyaW5zaWMgbmVlZCBmb3IgY29tcG9zaXRpbmcgbGF5ZXIuCisgICAgYm9vbCBy
ZXF1aXJlc0NvbXBvc2l0aW5nTGF5ZXIoY29uc3QgUmVuZGVyTGF5ZXIqKSBjb25zdDsKKworICAg
IC8vIFdoZXRoZXIgd2UgbmVlZCBhIGdyYXBoaWNzIGxheWVyIHRvIGRvIGNsaXBwaW5nIGJ5IGFu
IGFuY2VzdG9yIChub24tc3RhY2tpbmctY29udGV4dCBwYXJlbnQgd2l0aCBvdmVyZmxvdykuCisg
ICAgYm9vbCBjbGlwcGVkQnlBbmNlc3RvcihSZW5kZXJMYXllciopIGNvbnN0OworICAgIC8vIFdo
ZXRoZXIgd2UgbmVlZCBhIGdyYXBoaWNzIGxheWVyIHRvIGNsaXAgei1vcmRlciBjaGlsZHJlbiBv
ZiB0aGUgZ2l2ZW4gbGF5ZXIuCisgICAgYm9vbCBjbGlwc0NvbXBvc2l0aW5nRGVzY2VuZGFudHMo
Y29uc3QgUmVuZGVyTGF5ZXIqKSBjb25zdDsKKworICAgIC8vIFdoZXRoZXIgYSBydW5uaW5nIHRy
YW5zaXRpb24gb3IgYW5pbWF0aW9uIGVuZm9yY2VzIHRoZSBuZWVkIGZvciBhIGNvbXBvc2l0aW5n
IGxheWVyLgorICAgIGJvb2wgcmVxdWlyZXNDb21wb3NpdGluZ0ZvckFuaW1hdGlvbihjb25zdCBS
ZW5kZXJMYXllciopIGNvbnN0OworICAgIC8vIFdoZXRoZXIgdGhlIGdpdmVuIGxheWVyIG5lZWRz
IGFuIGV4dHJhICdjb250ZW50cycgbGF5ZXIuCisgICAgYm9vbCBuZWVkc0NvbnRlbnRzQ29tcG9z
aXRpbmdMYXllcihjb25zdCBSZW5kZXJMYXllciopIGNvbnN0OworCisgICAgLy8gU2V0IGEgYml0
IG9uIHRoaXMgbGF5ZXIgdG8gZm9yY2UgaXQgdG8gYmUgY29tcG9zaXN0ZWQsIGJlY2F1c2UgaXQg
aGFzIHRvIHJlbmRlciBvbiB0b3Agb2YKKyAgICAvLyBvdGhlciBjb21wb3NpdGluZyBsYXllcnMu
CisgICAgdm9pZCBzZXRGb3JjZWRDb21wb3NpdGluZ0xheWVyKFJlbmRlckxheWVyKiwgYm9vbCBm
b3JjZSk7CisKKyAgICB2b2lkIGNvbXB1dGVDb21wb3NpdGluZ1JlcXVpcmVtZW50cyhSZW5kZXJM
YXllciosIHN0cnVjdCBDb21wb3NpdGluZ1N0YXRlJik7CisgICAgdm9pZCByZWJ1aWxkQ29tcG9z
aXRpbmdMYXllclRyZWUoUmVuZGVyTGF5ZXIqIGxheWVyLCBzdHJ1Y3QgQ29tcG9zaXRpbmdTdGF0
ZSYpOworCisgICAgLy8gSG9vayBjb21wb3NpdGluZyBsYXllcnMgdG9nZXRoZXIKKyAgICB2b2lk
IHNldENvbXBvc2l0aW5nUGFyZW50KFJlbmRlckxheWVyKiBjaGlsZExheWVyLCBSZW5kZXJMYXll
ciogcGFyZW50TGF5ZXIpOworICAgIHZvaWQgcmVtb3ZlQ29tcG9zaXRlZENoaWxkcmVuKFJlbmRl
ckxheWVyKik7CisKKyAgICB2b2lkIHBhcmVudEluUm9vdExheWVyKFJlbmRlckxheWVyKik7CisK
KyAgICB2b2lkIGVuc3VyZVJvb3RQbGF0Zm9ybUxheWVyKCk7CisKK3ByaXZhdGU6CisgICAgUmVu
ZGVyVmlldyogbV9yZW5kZXJWaWV3OworICAgIEdyYXBoaWNzTGF5ZXIqIG1fcm9vdFBsYXRmb3Jt
TGF5ZXI7CisgICAgYm9vbCBtX2NvbXBvc2l0aW5nOworICAgIGJvb2wgbV9yb290TGF5ZXJBdHRh
Y2hlZDsKKyAgICBib29sIG1fY29tcG9zaXRpbmdMYXllcnNOZWVkVXBkYXRlOworI2lmIFBST0ZJ
TEVfTEFZRVJfUkVCVUlMRAorICAgIGludCBtX3Jvb3RMYXllclVwZGF0ZUNvdW50OworI2VuZGlm
Cit9OworCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJlbmRlckxheWVy
Q29tcG9zaXRvcl9oCg==
</data>
<flag name="review"
          id="12936"
          type_id="1"
          status="+"
          setter="hyatt"
    />
          </attachment>
      

    </bug>

</bugzilla>