<?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>78902</bug_id>
          
          <creation_ts>2012-02-17 08:10:35 -0800</creation_ts>
          <short_desc>Integrate SVGUseElement within the new shadow root concept</short_desc>
          <delta_ts>2026-03-26 06:02:45 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>SVG</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>78807</blocked>
    
    <blocked>79568</blocked>
    
    <blocked>79798</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Nikolas Zimmermann">zimmermann</reporter>
          <assigned_to name="Nikolas Zimmermann">zimmermann</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>gustavo</cc>
    
    <cc>inferno</cc>
    
    <cc>jschuh</cc>
    
    <cc>macpherson</cc>
    
    <cc>menard</cc>
    
    <cc>morrita</cc>
    
    <cc>pnormand</cc>
    
    <cc>rakuco</cc>
    
    <cc>schenney</cc>
    
    <cc>simonjam</cc>
    
    <cc>staikos</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>xan.lopez</cc>
    
    <cc>yong.li.webkit</cc>
    
    <cc>zimmermann</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>559202</commentid>
    <comment_count>0</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-17 08:10:35 -0800</bug_when>
    <thetext>Integrate SVGUseElement within the new shadow root concept.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>559203</commentid>
    <comment_count>1</comment_count>
      <attachid>127590</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-17 08:13:36 -0800</bug_when>
    <thetext>Created attachment 127590
&lt;use&gt; without cloning prototype

Historical patch, some months ago: My attempt to rewrite &lt;use&gt; completly w/o any shadow trees.
The approach failed, as &lt;text&gt; selection etc. is not possible with that approach, as it renders &lt;use&gt; targets into ImageBuffers.
Maybe we can opt-it in for simple use-on-shape, situations, etc. as it&apos;s incredibe much faster than cloning.

NOTE: This is just for the record, so schenney can see it - it contains debug code, etc.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>559205</commentid>
    <comment_count>2</comment_count>
      <attachid>127591</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-17 08:16:10 -0800</bug_when>
    <thetext>Created attachment 127591
Current prototype patch

And here&apos;s my new attempt: switches SVGUseElement to use ShadowRoot.
Die RenderSVGShadowTreeRootContainer &amp; SVGShadowTreeElements!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>561888</commentid>
    <comment_count>3</comment_count>
      <attachid>128185</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-22 05:40:57 -0800</bug_when>
    <thetext>Created attachment 128185
Patch v1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>561889</commentid>
    <comment_count>4</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-22 05:42:28 -0800</bug_when>
    <thetext>The code changes are actually below 50k, the rest is build system changes, file removal, and expectations updates - lots of them, due the changed shadow tree handling.

The patch should eliminate the root of all our past security bugs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>561902</commentid>
    <comment_count>5</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-22 05:59:27 -0800</bug_when>
    <thetext>CC&apos;ing more shadow dom folks. A pity, the bots don&apos;t like the patch (never seen that kind of crash)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>561907</commentid>
    <comment_count>6</comment_count>
      <attachid>128185</attachid>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2012-02-22 06:05:44 -0800</bug_when>
    <thetext>Comment on attachment 128185
Patch v1

Attachment 128185 did not pass qt-ews (qt):
Output: http://queues.webkit.org/results/11562467</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>561913</commentid>
    <comment_count>7</comment_count>
      <attachid>128185</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-22 06:11:43 -0800</bug_when>
    <thetext>Comment on attachment 128185
Patch v1

Attachment 128185 did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/11557492</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>561916</commentid>
    <comment_count>8</comment_count>
      <attachid>128185</attachid>
    <who name="Philippe Normand">pnormand</who>
    <bug_when>2012-02-22 06:13:33 -0800</bug_when>
    <thetext>Comment on attachment 128185
Patch v1

Attachment 128185 did not pass gtk-ews (gtk):
Output: http://queues.webkit.org/results/11558488</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>561939</commentid>
    <comment_count>9</comment_count>
      <attachid>128203</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-22 06:47:30 -0800</bug_when>
    <thetext>Created attachment 128203
Patch v2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562128</commentid>
    <comment_count>10</comment_count>
      <attachid>128203</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2012-02-22 10:37:45 -0800</bug_when>
    <thetext>Comment on attachment 128203
Patch v2

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

Whoa, awesome patch (both in intent and in size :P)

The shadow DOM stuff looks good. Haven&apos;t looked at the SVG stuff closely, other than shadow tree management.

&gt; Source/WebCore/css/SelectorChecker.cpp:-61
&gt; -#if ENABLE(SVG)

(here and elsewhere) Why don&apos;t we need this flagged anymore?

&gt; Source/WebCore/dom/Node.cpp:1523
&gt; +bool Node::isInShadowTree() const

This could&apos;ve probably be done as a separate patch.

&gt; LayoutTests/platform/chromium/test_expectations.txt:-951
&gt; -BUGCR23463 LEOPARD : svg/W3C-SVG-1.1/struct-symbol-01-b.svg = IMAGE
&gt; -BUGCR23463 LINUX WIN : svg/W3C-SVG-1.1/struct-symbol-01-b.svg = IMAGE+TEXT
&gt; -BUGCR23463 LINUX WIN : svg/W3C-SVG-1.1/struct-use-01-t.svg = PASS IMAGE+TEXT IMAGE

In these cases, we usually just comment them out, so that the previous bug info is preserved. Unless of course you fixed these!! :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562138</commentid>
    <comment_count>11</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-22 10:46:01 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; Whoa, awesome patch (both in intent and in size :P)
Thanks :-)

&gt; The shadow DOM stuff looks good. Haven&apos;t looked at the SVG stuff closely, other than shadow tree management.
Excellent, I was looking for that kind of feedback. The SVG part can be reviewed by someone else, I think.
 
&gt; &gt; Source/WebCore/css/SelectorChecker.cpp:-61
&gt; &gt; -#if ENABLE(SVG)
&gt; 
&gt; (here and elsewhere) Why don&apos;t we need this flagged anymore?
isSVGElement() is always available now, and XLinkNames isn&apos;t surrounded by ENABLE(SVG) guards, so we can safely remove this.

&gt; 
&gt; &gt; Source/WebCore/dom/Node.cpp:1523
&gt; &gt; +bool Node::isInShadowTree() const
&gt; 
&gt; This could&apos;ve probably be done as a separate patch.
Sure, but it&apos;s just this single line?

&gt; 
&gt; &gt; LayoutTests/platform/chromium/test_expectations.txt:-951
&gt; &gt; -BUGCR23463 LEOPARD : svg/W3C-SVG-1.1/struct-symbol-01-b.svg = IMAGE
&gt; &gt; -BUGCR23463 LINUX WIN : svg/W3C-SVG-1.1/struct-symbol-01-b.svg = IMAGE+TEXT
&gt; &gt; -BUGCR23463 LINUX WIN : svg/W3C-SVG-1.1/struct-use-01-t.svg = PASS IMAGE+TEXT IMAGE
&gt; 
&gt; In these cases, we usually just comment them out, so that the previous bug info is preserved. Unless of course you fixed these!! :)
I hope its fixed now, but I can of course only comment them, will include these changes in a follow-up patch, if needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562378</commentid>
    <comment_count>12</comment_count>
      <attachid>128203</attachid>
    <who name="Stephen Chenney">schenney</who>
    <bug_when>2012-02-22 14:13:53 -0800</bug_when>
    <thetext>Comment on attachment 128203
Patch v2

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

I&apos;m not sure this will address all the security issues we&apos;ve had, but that is no reason to hold back. I will probably apply it locally and see what difference it makes to the pathological cases we have. I may also need to fix https://bugs.webkit.org/show_bug.cgi?id=77764, sooner rather than later.

&gt; Source/WebCore/css/SelectorChecker.cpp:-449
&gt; -    // Spec: CSS2 selectors cannot be applied to the (conceptually) cloned DOM tree

Are you sure that whatever mechanism controls Style and shadow nodes will correctly work for SVG semantics?

&gt; Source/WebCore/dom/EventDispatcher.cpp:70
&gt; +    if (SVGElementInstance* instance = useElement-&gt;instanceForShadowTreeElement(referenceNode))

Won&apos;t this fail to build with SVG disabled, due to the lack of SVGElementInstance?

&gt;&gt; Source/WebCore/dom/Node.cpp:1523
&gt;&gt; +bool Node::isInShadowTree() const
&gt; 
&gt; This could&apos;ve probably be done as a separate patch.

There are a couple of other portion of this patch that add const in existing code. I think they all go in one separate patch.

&gt; Source/WebCore/dom/ScriptElement.cpp:202
&gt;      if (!isScriptForEventSupported())

Is there code elsewhere to prevent script execution inside the shadow tree? https://bugs.webkit.org/show_bug.cgi?id=64419

&gt; Source/WebCore/rendering/svg/RenderSVGModelObject.cpp:165
&gt; +    return renderer-&gt;isSVGShape() || renderer-&gt;isSVGText() || renderer-&gt;isSVGImage() || renderer-&gt;node()-&gt;hasTagName(SVGNames::useTag);

Maybe a method to encapsulate node()-&gt;hasTagName(SVGNames::useTag)? It seems to appear a lot.

&gt; LayoutTests/platform/chromium/test_expectations.txt:-945
&gt; -BUGCR8763 MAC : svg/custom/use-on-g-containing-foreignObject-and-image.svg = IMAGE

Reiterating Dimitri&apos;s request. Please comment out rather than removing.

Please also create a bug, assigned to me, to update the expectations when this change goes in and the build bots have produced new results. Mark the new bug as depending on this bug.

&gt; LayoutTests/platform/chromium/test_expectations.txt:4374
&gt; +

You can also mark all these as &quot;... = TEXT IMAGE TEXT+IMAGE PASS&quot; if you want to cover all bases. I generally do this to avoid noise for unexpected passing tests.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563109</commentid>
    <comment_count>13</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-23 07:48:58 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; I&apos;m not sure this will address all the security issues we&apos;ve had, but that is no reason to hold back. I will probably apply it locally and see what difference it makes to the pathological cases we have. I may also need to fix https://bugs.webkit.org/show_bug.cgi?id=77764, sooner rather than later.
It won&apos;t address all, but lots of them (instanceUpdates-blocked concept is gone, which was needed as we had races before in that code). Did you have luck with the corner cases?

&gt; &gt; Source/WebCore/css/SelectorChecker.cpp:-449
&gt; &gt; -    // Spec: CSS2 selectors cannot be applied to the (conceptually) cloned DOM tree
&gt; 
&gt; Are you sure that whatever mechanism controls Style and shadow nodes will correctly work for SVG semantics?
Yeah, the SVG shadow tree is now styled correctly, w/o the need for us to early exit in checkSelector, and rely on a custom setStyle call afterwards, that correctly resolves the shadow tree styles with the &lt;use&gt; element as parent. It&apos;s all handled transparently by ShadowRoot now.

&gt; &gt; Source/WebCore/dom/EventDispatcher.cpp:70
&gt; &gt; +    if (SVGElementInstance* instance = useElement-&gt;instanceForShadowTreeElement(referenceNode))
&gt; 
&gt; Won&apos;t this fail to build with SVG disabled, due to the lack of SVGElementInstance?
This is guarded by ENABLE(SVG) already?

&gt; &gt;&gt; Source/WebCore/dom/Node.cpp:1523
&gt; &gt; This could&apos;ve probably be done as a separate patch.
&gt; 
&gt; There are a couple of other portion of this patch that add const in existing code. I think they all go in one separate patch.
Okay, I&apos;ll look for the other cases, and split them off.
 
&gt; &gt; Source/WebCore/dom/ScriptElement.cpp:202
&gt; &gt;      if (!isScriptForEventSupported())
&gt; 
&gt; Is there code elsewhere to prevent script execution inside the shadow tree? https://bugs.webkit.org/show_bug.cgi?id=64419
Thanks for the hint, I found the related bug 64781: that&apos;s exactly what I&apos;ve fixed here. (shadow tree creation time)

&gt; &gt; Source/WebCore/rendering/svg/RenderSVGModelObject.cpp:165
&gt; &gt; +    return renderer-&gt;isSVGShape() || renderer-&gt;isSVGText() || renderer-&gt;isSVGImage() || renderer-&gt;node()-&gt;hasTagName(SVGNames::useTag);
&gt; 
&gt; Maybe a method to encapsulate node()-&gt;hasTagName(SVGNames::useTag)? It seems to appear a lot.
I could add a new method, but that needs to be virtual, and on SVGElement - as we certainly don&apos;t want to pollute Node.h for this. That would look like static_cast&lt;SVGElement*&gt;(node())-&gt;isSVGUseElement() - is it better? Certainly not faster.
 
&gt; &gt; LayoutTests/platform/chromium/test_expectations.txt:-945
&gt; &gt; -BUGCR8763 MAC : svg/custom/use-on-g-containing-foreignObject-and-image.svg = IMAGE
&gt; 
&gt; Reiterating Dimitri&apos;s request. Please comment out rather than removing.
Will take care.
 
&gt; Please also create a bug, assigned to me, to update the expectations when this change goes in and the build bots have produced new results. Mark the new bug as depending on this bug.
Ok, will do.

&gt; &gt; LayoutTests/platform/chromium/test_expectations.txt:4374
&gt; You can also mark all these as &quot;... = TEXT IMAGE TEXT+IMAGE PASS&quot; if you want to cover all bases. I generally do this to avoid noise for unexpected passing tests.
Ok.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563124</commentid>
    <comment_count>14</comment_count>
    <who name="Stephen Chenney">schenney</who>
    <bug_when>2012-02-23 08:13:30 -0800</bug_when>
    <thetext>(In reply to comment #13)
&gt; (In reply to comment #12)
&gt; &gt; I&apos;m not sure this will address all the security issues we&apos;ve had, but that is no reason to hold back. I will probably apply it locally and see what difference it makes to the pathological cases we have. I may also need to fix https://bugs.webkit.org/show_bug.cgi?id=77764, sooner rather than later.
&gt; It won&apos;t address all, but lots of them (instanceUpdates-blocked concept is gone, which was needed as we had races before in that code). Did you have luck with the corner cases?

Today I will get to testing all the odd crash cases we have - I hope.

&gt; &gt; &gt; Source/WebCore/dom/EventDispatcher.cpp:70
&gt; &gt; &gt; +    if (SVGElementInstance* instance = useElement-&gt;instanceForShadowTreeElement(referenceNode))
&gt; &gt; 
&gt; &gt; Won&apos;t this fail to build with SVG disabled, due to the lack of SVGElementInstance?
&gt; This is guarded by ENABLE(SVG) already?

Sorry, needed more context. This is in the #else of a #if ENABLED(SVG) block, so it is not protected. The code is protected at Debug runtime with an ASSERT_NEVER_REACHED, but that line will still try to compile in.

&gt; 
&gt; &gt; &gt; Source/WebCore/rendering/svg/RenderSVGModelObject.cpp:165
&gt; &gt; &gt; +    return renderer-&gt;isSVGShape() || renderer-&gt;isSVGText() || renderer-&gt;isSVGImage() || renderer-&gt;node()-&gt;hasTagName(SVGNames::useTag);
&gt; &gt; 
&gt; &gt; Maybe a method to encapsulate node()-&gt;hasTagName(SVGNames::useTag)? It seems to appear a lot.
&gt; I could add a new method, but that needs to be virtual, and on SVGElement - as we certainly don&apos;t want to pollute Node.h for this. That would look like static_cast&lt;SVGElement*&gt;(node())-&gt;isSVGUseElement() - is it better? Certainly not faster.

Sounds fine. I agree that it should be left as is.

Thanks for the expectations changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563128</commentid>
    <comment_count>15</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-23 08:33:01 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; &gt; &gt; Won&apos;t this fail to build with SVG disabled, due to the lack of SVGElementInstance?
&gt; &gt; This is guarded by ENABLE(SVG) already?
&gt; 
&gt; Sorry, needed more context. This is in the #else of a #if ENABLED(SVG) block, so it is not protected. The code is protected at Debug runtime with an ASSERT_NEVER_REACHED, but that line will still try to compile in.
Heh, look again, the #else branch is removed as well. This won&apos;t affect non-SVG builds, they still work fine.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563129</commentid>
    <comment_count>16</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-23 08:37:25 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; &gt; This could&apos;ve probably be done as a separate patch.
&gt; 
&gt; There are a couple of other portion of this patch that add const in existing code. I think they all go in one separate patch.
I looked again, the only const change in isInShadowTree - do you think that&apos;s worth to split off?? I&apos;d say no, if it&apos;s just this single change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563134</commentid>
    <comment_count>17</comment_count>
    <who name="Stephen Chenney">schenney</who>
    <bug_when>2012-02-23 08:46:08 -0800</bug_when>
    <thetext>(In reply to comment #15)
&gt; (In reply to comment #14)
&gt; &gt; &gt; &gt; Won&apos;t this fail to build with SVG disabled, due to the lack of SVGElementInstance?
&gt; &gt; &gt; This is guarded by ENABLE(SVG) already?
&gt; &gt; 
&gt; &gt; Sorry, needed more context. This is in the #else of a #if ENABLED(SVG) block, so it is not protected. The code is protected at Debug runtime with an ASSERT_NEVER_REACHED, but that line will still try to compile in.
&gt; Heh, look again, the #else branch is removed as well. This won&apos;t affect non-SVG builds, they still work fine.

O how I wish for a side-by-side review system.

And I too could only find one const. Given you are also changing a comment, and that comment is specific to this change (as is the const-ness?) I would leave it in this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>564925</commentid>
    <comment_count>18</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-25 02:45:43 -0800</bug_when>
    <thetext>*** Bug 64419 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>564927</commentid>
    <comment_count>19</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-25 02:46:18 -0800</bug_when>
    <thetext>*** Bug 64779 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>564929</commentid>
    <comment_count>20</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-25 02:46:44 -0800</bug_when>
    <thetext>*** Bug 64781 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>564931</commentid>
    <comment_count>21</comment_count>
      <attachid>128862</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-25 02:54:09 -0800</bug_when>
    <thetext>Created attachment 128862
Patch v3

Updated patch against trunk, and fixed chromium expectations.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>566506</commentid>
    <comment_count>22</comment_count>
      <attachid>128862</attachid>
    <who name="Zoltan Herczeg">zherczeg</who>
    <bug_when>2012-02-28 01:48:14 -0800</bug_when>
    <thetext>Comment on attachment 128862
Patch v3

Wow, really nice patch. I am always happy if we can simplify the code, and we can remove a lot of lines.

I trust you that the expected updates are correct.

Some thoughts:

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

&gt; Source/WebCore/ChangeLog:128
&gt; +            &lt;defs&gt;&lt;rect id=&quot;rect&quot;&gt;&gt;/defs&gt; &lt;use xlink:href=&quot;#rect&quot;/&gt;. Now from a script we change the rect x/y/width/height attributes:

&lt;defs&gt;&lt;rect id=&quot;rect&quot;&gt;&gt;/defs&gt;
The &gt; should be &lt;

&gt; Source/WebCore/dom/EventDispatcher.cpp:64
&gt; +    ASSERT(referenceNode);
&gt; +    if (!referenceNode-&gt;isSVGElement() || !referenceNode-&gt;isInShadowTree())
&gt; +        return referenceNode;
&gt; +
&gt;  #if ENABLE(SVG)

I think the lines above should be covered by the #if directive even if it can be compiled without SVG.

&gt; Source/WebCore/rendering/svg/RenderSVGTransformableContainer.cpp:64
&gt; +    FloatSize translation;
&gt; +    if (useElement) {
&gt; +        SVGLengthContext lengthContext(useElement);
&gt; +        translation = FloatSize(useElement-&gt;x().value(lengthContext), useElement-&gt;y().value(lengthContext));
&gt; +        if (translation != m_lastTranslation)
&gt; +            m_needsTransformUpdate = true;
&gt; +        m_lastTranslation = translation;
&gt; +    }

FloatSize translation probably can be moved inside the if:
FloatSize translation(FloatSize(useElement-&gt;x().value(lengthContext), useElement-&gt;y().value(lengthContext)));

&gt; Source/WebCore/rendering/svg/RenderSVGViewportContainer.cpp:71
&gt; +    SVGElement* correspondingElement = svg-&gt;correspondingElement();
&gt; +    if (svg-&gt;isInShadowTree() &amp;&amp; correspondingElement) {

I think the two conditions around the &amp;&amp; could be swapped. Little perf gain.

&gt; Source/WebCore/rendering/svg/RenderSVGViewportContainer.cpp:113
&gt; +        SVGLengthContext lengthContext(element);
&gt; +        if (useElement-&gt;hasAttribute(SVGNames::widthAttr))
&gt; +            m_viewport.setWidth(useElement-&gt;width().value(lengthContext));
&gt; +        else if (isSymbolElement &amp;&amp; svg-&gt;hasAttribute(SVGNames::widthAttr)) {
&gt; +            SVGLength containerWidth(LengthModeWidth, &quot;100%&quot;);
&gt; +            m_viewport.setWidth(containerWidth.value(lengthContext));
&gt; +        }
&gt; +
&gt; +        if (useElement-&gt;hasAttribute(SVGNames::heightAttr))
&gt; +            m_viewport.setHeight(useElement-&gt;height().value(lengthContext));
&gt; +        else if (isSymbolElement &amp;&amp; svg-&gt;hasAttribute(SVGNames::heightAttr)) {
&gt; +            SVGLength containerHeight(LengthModeHeight, &quot;100%&quot;);
&gt; +            m_viewport.setHeight(containerHeight.value(lengthContext));
&gt; +        }

Just some thinking: setting up lengthContext if both &quot;ifs&quot; are false is unnecessary. Is it cheap enough? If not, perhaps we should avoid that, especially if the &quot;ifs&quot; are likely false.

&gt; Source/WebCore/svg/SVGElement.cpp:484
&gt; +        style = parent-&gt;renderer() ? parent-&gt;renderer()-&gt;style() : 0;

For me personally this looks ugly. Can&apos;t we just use a second if? And put a renderer into a local vvariable?

&gt; Source/WebCore/svg/SVGLocatable.cpp:48
&gt; -    for (ContainerNode* n = element-&gt;parentNode(); n; n = n-&gt;parentNode()) {
&gt; -        if (isViewportElement(n))
&gt; -            return static_cast&lt;SVGElement*&gt;(n);
&gt; +    for (Element* current = element-&gt;parentOrHostElement(); current; current = current-&gt;parentOrHostElement()) {
&gt; +        if (isViewportElement(current))
&gt; +            return static_cast&lt;SVGElement*&gt;(current);

I know it was not in the old code, but perhaps we could add an ASSERT here. Or is it unnecessary?

&gt; Source/WebCore/svg/SVGLocatable.cpp:60
&gt; -    for (ContainerNode* n = element-&gt;parentNode(); n; n = n-&gt;parentNode()) {
&gt; -        if (isViewportElement(n))
&gt; -            farthest = static_cast&lt;SVGElement*&gt;(n);
&gt; +    for (Element* current = element-&gt;parentOrHostElement(); current; current = current-&gt;parentOrHostElement()) {
&gt; +        if (isViewportElement(current))
&gt; +            farthest = static_cast&lt;SVGElement*&gt;(current);

ditto

&gt; Source/WebCore/svg/SVGLocatable.cpp:88
&gt; +    SVGElement* currentElement = element;
&gt; +    while (currentElement) {

can currentElement be NULL? If not, we could make this a do ... while()

&gt; Source/WebCore/svg/SVGUseElement.cpp:99
&gt; +    RefPtr&lt;SVGUseElement&gt; use = adoptRef(new SVGUseElement(tagName, document));
&gt; +    use-&gt;ensureShadowRoot();
&gt; +    return use.release();

Can&apos;t this ensureShadowRoot() go to the constructor?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>566550</commentid>
    <comment_count>23</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-28 03:04:38 -0800</bug_when>
    <thetext>(In reply to comment #22)
&gt; (From update of attachment 128862 [details])
&gt; Wow, really nice patch. I am always happy if we can simplify the code, and we can remove a lot of lines.
Thanks.

&gt; The &gt; should be &lt;
Fixed.

&gt; I think the lines above should be covered by the #if directive even if it can be compiled without SVG.
Fixed.

&gt; FloatSize translation probably can be moved inside the if:
&gt; FloatSize translation(FloatSize(useElement-&gt;x().value(lengthContext), useElement-&gt;y().value(lengthContext)));
Fixed.

&gt; I think the two conditions around the &amp;&amp; could be swapped. Little perf gain.
Fixed.

&gt; Just some thinking: setting up lengthContext if both &quot;ifs&quot; are false is unnecessary. Is it cheap enough? If not, perhaps we should avoid that, especially if the &quot;ifs&quot; are likely false.
Yes, we could avoid that, but I guess it&apos;s not worth it, lengthContext construction is cheap.

&gt; For me personally this looks ugly. Can&apos;t we just use a second if? And put a renderer into a local vvariable?
Fixed.
 
&gt; I know it was not in the old code, but perhaps we could add an ASSERT here. Or is it unnecessary?
No, it doesn&apos;t need to be a viewport element as parent.


&gt; can currentElement be NULL? If not, we could make this a do ... while()
The whole construct makes no sense, I&apos;ll make it use a for-loop instead, operating on Elements, no need to make this SVGElement only, this is ancient legacy code.

&gt; Can&apos;t this ensureShadowRoot() go to the constructor?
I followed the existing style in the other shadow tree constructing elements. I guess it can call virtual functions, and thus can&apos;t run from the constructor.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>566562</commentid>
    <comment_count>24</comment_count>
      <attachid>129223</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-28 03:40:37 -0800</bug_when>
    <thetext>Created attachment 129223
Patch v4</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>566567</commentid>
    <comment_count>25</comment_count>
      <attachid>129223</attachid>
    <who name="Zoltan Herczeg">zherczeg</who>
    <bug_when>2012-02-28 03:53:24 -0800</bug_when>
    <thetext>Comment on attachment 129223
Patch v4

r=me nincs work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>566576</commentid>
    <comment_count>26</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-28 04:13:54 -0800</bug_when>
    <thetext>Committed r109097: &lt;http://trac.webkit.org/changeset/109097&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>566593</commentid>
    <comment_count>27</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-28 05:15:44 -0800</bug_when>
    <thetext>Ossy rebaselined Qt in r109099. I rebaselined Gtk in r109100.
Win bots are still so broken, that I&apos;m unable to obtain new results for Win, it early exits after 500 failures, before svg/ is reached :(

Still waiting for the SL bots to cycle.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>566650</commentid>
    <comment_count>28</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-02-28 07:26:12 -0800</bug_when>
    <thetext>Stephen, can you have a look at the chromium expectations, and the other &lt;use&gt; security bugs?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>566673</commentid>
    <comment_count>29</comment_count>
    <who name="Stephen Chenney">schenney</who>
    <bug_when>2012-02-28 07:45:19 -0800</bug_when>
    <thetext>(In reply to comment #28)
&gt; Stephen, can you have a look at the chromium expectations, and the other &lt;use&gt; security bugs?

Yep. And I will shortly have up a patch for excluding invalid elements from &lt;use&gt;. That alone fixes the security issues even before your change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568592</commentid>
    <comment_count>30</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2012-03-01 05:41:54 -0800</bug_when>
    <thetext>I can&apos;t access bug 79798. I hope Stephen can take care of 79568, so we can close this bug soon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>570260</commentid>
    <comment_count>31</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2012-03-04 10:18:52 -0800</bug_when>
    <thetext>&lt;rdar://problem/10980087&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>572906</commentid>
    <comment_count>32</comment_count>
    <who name="Stephen Chenney">schenney</who>
    <bug_when>2012-03-07 08:35:16 -0800</bug_when>
    <thetext>You can close this if you would like. https://bugs.webkit.org/show_bug.cgi?id=79568 is tracking the chromium expectations and there is nothing in them that suggest problems with this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>589167</commentid>
    <comment_count>33</comment_count>
      <attachid>129223</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-03-27 12:48:53 -0700</bug_when>
    <thetext>Comment on attachment 129223
Patch v4

Cleared Zoltan Herczeg&apos;s review+ from obsolete attachment 129223 so that this bug does not appear in http://webkit.org/pending-commit.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>127590</attachid>
            <date>2012-02-17 08:13:36 -0800</date>
            <delta_ts>2012-02-22 05:26:59 -0800</delta_ts>
            <desc>&lt;use&gt; without cloning prototype</desc>
            <filename>SVGUseElement-rewrite-working.diff</filename>
            <type>text/plain</type>
            <size>210911</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9TZWxlY3RvckNoZWNrZXIuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9TZWxlY3RvckNoZWNrZXIuY3BwCShyZXZpc2lvbiA5NjU3
NSkKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9TZWxlY3RvckNoZWNrZXIuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC00MjcsMTMgKzQyNyw2IEBAIGJvb2wgU2VsZWN0b3JDaGVja2VyOjppc0Zhc3RDaGVj
a2FibGVTZWwKIC8vICogU2VsZWN0b3JGYWlsc0NvbXBsZXRlbHkgLSB0aGUgc2VsZWN0b3IgZmFp
bHMgZm9yIGUgYW5kIGFueSBzaWJsaW5nIG9yIGFuY2VzdG9yIG9mIGUKIFNlbGVjdG9yQ2hlY2tl
cjo6U2VsZWN0b3JNYXRjaCBTZWxlY3RvckNoZWNrZXI6OmNoZWNrU2VsZWN0b3IoQ1NTU2VsZWN0
b3IqIHNlbCwgRWxlbWVudCogZSwgUHNldWRvSWQmIGR5bmFtaWNQc2V1ZG8sIGJvb2wgaXNTdWJT
ZWxlY3RvciwgYm9vbCBlbmNvdW50ZXJlZExpbmssIFJlbmRlclN0eWxlKiBlbGVtZW50U3R5bGUs
IFJlbmRlclN0eWxlKiBlbGVtZW50UGFyZW50U3R5bGUpIGNvbnN0CiB7Ci0jaWYgRU5BQkxFKFNW
RykKLSAgICAvLyBTcGVjOiBDU1MyIHNlbGVjdG9ycyBjYW5ub3QgYmUgYXBwbGllZCB0byB0aGUg
KGNvbmNlcHR1YWxseSkgY2xvbmVkIERPTSB0cmVlCi0gICAgLy8gYmVjYXVzZSBpdHMgY29udGVu
dHMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBmb3JtYWwgZG9jdW1lbnQgc3RydWN0dXJlLgotICAgIGlm
IChlLT5pc1NWR1NoYWRvd1Jvb3QoKSkKLSAgICAgICAgcmV0dXJuIFNlbGVjdG9yRmFpbHNDb21w
bGV0ZWx5OwotI2VuZGlmCi0KICAgICAvLyBmaXJzdCBzZWxlY3RvciBoYXMgdG8gbWF0Y2gKICAg
ICBpZiAoIWNoZWNrT25lU2VsZWN0b3Ioc2VsLCBlLCBkeW5hbWljUHNldWRvLCBpc1N1YlNlbGVj
dG9yLCBlbmNvdW50ZXJlZExpbmssIGVsZW1lbnRTdHlsZSwgZWxlbWVudFBhcmVudFN0eWxlKSkK
ICAgICAgICAgcmV0dXJuIFNlbGVjdG9yRmFpbHNMb2NhbGx5OwpJbmRleDogU291cmNlL1dlYkNv
cmUvZG9tL0V2ZW50RGlzcGF0Y2hlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
ZG9tL0V2ZW50RGlzcGF0Y2hlci5jcHAJKHJldmlzaW9uIDk2NTc1KQorKysgU291cmNlL1dlYkNv
cmUvZG9tL0V2ZW50RGlzcGF0Y2hlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzLDY3ICszMywz
NiBAQAogI2luY2x1ZGUgIkluc3BlY3Rvckluc3RydW1lbnRhdGlvbi5oIgogI2luY2x1ZGUgIk1v
dXNlRXZlbnQuaCIKICNpbmNsdWRlICJTY29wZWRFdmVudFF1ZXVlLmgiCisjaW5jbHVkZSAiU1ZH
RWxlbWVudEluc3RhbmNlLmgiCisjaW5jbHVkZSAiU1ZHVXNlRWxlbWVudC5oIgogI2luY2x1ZGUg
IldpbmRvd0V2ZW50Q29udGV4dC5oIgogI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KICNpbmNsdWRl
IDx3dGYvVW51c2VkUGFyYW0uaD4KIAotI2lmIEVOQUJMRShTVkcpCi0jaW5jbHVkZSAiU1ZHRWxl
bWVudEluc3RhbmNlLmgiCi0jaW5jbHVkZSAiU1ZHTmFtZXMuaCIKLSNpbmNsdWRlICJTVkdVc2VF
bGVtZW50LmgiCi0jZW5kaWYKLQogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBzdGF0aWMgSGFzaFNl
dDxOb2RlKj4qIGdOb2Rlc0Rpc3BhdGNoaW5nU2ltdWxhdGVkQ2xpY2tzID0gMDsKIAotYm9vbCBF
dmVudERpc3BhdGNoZXI6OmRpc3BhdGNoRXZlbnQoTm9kZSogbm9kZSwgUGFzc1JlZlB0cjxFdmVu
dERpc3BhdGNoTWVkaWF0b3I+IG1lZGlhdG9yKQorYm9vbCBFdmVudERpc3BhdGNoZXI6OmRpc3Bh
dGNoRXZlbnQoRXZlbnRUYXJnZXQqIHRhcmdldCwgUGFzc1JlZlB0cjxFdmVudERpc3BhdGNoTWVk
aWF0b3I+IG1lZGlhdG9yKQogewogICAgIEFTU0VSVCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigp
KTsKIAotICAgIEV2ZW50RGlzcGF0Y2hlciBkaXNwYXRjaGVyKG5vZGUpOworICAgIEV2ZW50RGlz
cGF0Y2hlciBkaXNwYXRjaGVyKHRhcmdldCk7CiAgICAgcmV0dXJuIG1lZGlhdG9yLT5kaXNwYXRj
aEV2ZW50KCZkaXNwYXRjaGVyKTsKIH0KIAotc3RhdGljIEV2ZW50VGFyZ2V0KiBmaW5kRWxlbWVu
dEluc3RhbmNlKE5vZGUqIHJlZmVyZW5jZU5vZGUpCi17Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAv
LyBTcGVjOiBUaGUgZXZlbnQgaGFuZGxpbmcgZm9yIHRoZSBub24tZXhwb3NlZCB0cmVlIHdvcmtz
IGFzIGlmIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgaGFkIGJlZW4gdGV4dHVhbGx5IGluY2x1ZGVk
Ci0gICAgLy8gYXMgYSBkZWVwbHkgY2xvbmVkIGNoaWxkIG9mIHRoZSAndXNlJyBlbGVtZW50LCBl
eGNlcHQgdGhhdCBldmVudHMgYXJlIGRpc3BhdGNoZWQgdG8gdGhlIFNWR0VsZW1lbnRJbnN0YW5j
ZSBvYmplY3RzCi0gICAgZm9yIChOb2RlKiBuID0gcmVmZXJlbmNlTm9kZTsgbjsgbiA9IG4tPnBh
cmVudE5vZGUoKSkgewotICAgICAgICBpZiAoIW4tPmlzU1ZHU2hhZG93Um9vdCgpIHx8ICFuLT5p
c1NWR0VsZW1lbnQoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIEVsZW1lbnQq
IHNoYWRvd1RyZWVQYXJlbnRFbGVtZW50ID0gbi0+c3ZnU2hhZG93SG9zdCgpOwotICAgICAgICBB
U1NFUlQoc2hhZG93VHJlZVBhcmVudEVsZW1lbnQtPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnVzZVRh
ZykpOwotCi0gICAgICAgIGlmIChTVkdFbGVtZW50SW5zdGFuY2UqIGluc3RhbmNlID0gc3RhdGlj
X2Nhc3Q8U1ZHVXNlRWxlbWVudCo+KHNoYWRvd1RyZWVQYXJlbnRFbGVtZW50KS0+aW5zdGFuY2VG
b3JTaGFkb3dUcmVlRWxlbWVudChyZWZlcmVuY2VOb2RlKSkKLSAgICAgICAgICAgIHJldHVybiBp
bnN0YW5jZTsKLSAgICB9Ci0jZWxzZQotICAgIC8vIFNWRyBlbGVtZW50cyB3aXRoIFNWRyBkaXNh
YmxlZCBzaG91bGQgbm90IGJlIHBvc3NpYmxlLgotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwot
I2VuZGlmCi0KLSAgICByZXR1cm4gcmVmZXJlbmNlTm9kZTsKLX0KLQotaW5saW5lIHN0YXRpYyBF
dmVudFRhcmdldCogZXZlbnRUYXJnZXRSZXNwZWN0aW5nU1ZHVGFyZ2V0UnVsZXMoTm9kZSogcmVm
ZXJlbmNlTm9kZSkKLXsKLSAgICBBU1NFUlQocmVmZXJlbmNlTm9kZSk7Ci0KLSAgICByZXR1cm4g
cmVmZXJlbmNlTm9kZS0+aXNTVkdFbGVtZW50KCkgPyBmaW5kRWxlbWVudEluc3RhbmNlKHJlZmVy
ZW5jZU5vZGUpIDogcmVmZXJlbmNlTm9kZTsKLX0KLQotdm9pZCBFdmVudERpc3BhdGNoZXI6OmRp
c3BhdGNoU2NvcGVkRXZlbnQoTm9kZSogbm9kZSwgUGFzc1JlZlB0cjxFdmVudERpc3BhdGNoTWVk
aWF0b3I+IG1lZGlhdG9yKQordm9pZCBFdmVudERpc3BhdGNoZXI6OmRpc3BhdGNoU2NvcGVkRXZl
bnQoRXZlbnRUYXJnZXQqIHRhcmdldCwgUGFzc1JlZlB0cjxFdmVudERpc3BhdGNoTWVkaWF0b3I+
IG1lZGlhdG9yKQogewogICAgIC8vIFdlIG5lZWQgdG8gc2V0IHRoZSB0YXJnZXQgaGVyZSBiZWNh
dXNlIGl0IGNhbiBnbyBhd2F5IGJ5IHRoZSB0aW1lIHdlIGFjdHVhbGx5IGZpcmUgdGhlIGV2ZW50
LgotICAgIG1lZGlhdG9yLT5ldmVudCgpLT5zZXRUYXJnZXQoZXZlbnRUYXJnZXRSZXNwZWN0aW5n
U1ZHVGFyZ2V0UnVsZXMobm9kZSkpOworICAgIG1lZGlhdG9yLT5ldmVudCgpLT5zZXRUYXJnZXQo
dGFyZ2V0KTsKICAgICBTY29wZWRFdmVudFF1ZXVlOjppbnN0YW5jZSgpLT5lbnF1ZXVlRXZlbnRE
aXNwYXRjaE1lZGlhdG9yKG1lZGlhdG9yKTsKIH0KIAotdm9pZCBFdmVudERpc3BhdGNoZXI6OmRp
c3BhdGNoU2ltdWxhdGVkQ2xpY2soTm9kZSogbm9kZSwgUGFzc1JlZlB0cjxFdmVudD4gdW5kZXJs
eWluZ0V2ZW50LCBib29sIHNlbmRNb3VzZUV2ZW50cywgYm9vbCBzaG93UHJlc3NlZExvb2spCit2
b2lkIEV2ZW50RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hTaW11bGF0ZWRDbGljayhFdmVudFRhcmdldCog
dGFyZ2V0LCBQYXNzUmVmUHRyPEV2ZW50PiB1bmRlcmx5aW5nRXZlbnQsIGJvb2wgc2VuZE1vdXNl
RXZlbnRzLCBib29sIHNob3dQcmVzc2VkTG9vaykKIHsKKyAgICBOb2RlKiBub2RlID0gdGFyZ2V0
ID8gdGFyZ2V0LT50b05vZGUoKSA6IDA7CisgICAgQVNTRVJUKG5vZGUpOworCiAgICAgaWYgKG5v
ZGUtPmRpc2FibGVkKCkpCiAgICAgICAgIHJldHVybjsKIApAQCAtMTIwLDExICs4OSw2IEBAIHZv
aWQgRXZlbnREaXNwYXRjaGVyOjpkaXNwYXRjaFNpbXVsYXRlZEMKICAgICBnTm9kZXNEaXNwYXRj
aGluZ1NpbXVsYXRlZENsaWNrcy0+cmVtb3ZlKG5vZGUpOwogfQogCi1zdGF0aWMgaW5saW5lIGJv
b2wgaXNTaGFkb3dSb290T3JTVkdTaGFkb3dSb290KGNvbnN0IE5vZGUqIG5vZGUpCi17Ci0gICAg
cmV0dXJuIG5vZGUtPmlzU2hhZG93Um9vdCgpIHx8IG5vZGUtPmlzU1ZHU2hhZG93Um9vdCgpOwot
fQotCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNTaGFkb3dIb3N0KE5vZGUqIG5vZGUpCiB7CiAgICAg
cmV0dXJuIG5vZGUtPmlzRWxlbWVudE5vZGUoKSAmJiB0b0VsZW1lbnQobm9kZSktPnNoYWRvd1Jv
b3QoKTsKQEAgLTE0MSw3ICsxMDUsNyBAQCBQYXNzUmVmUHRyPEV2ZW50VGFyZ2V0PiBFdmVudERp
c3BhdGNoZXI6CiAgICAgYm9vbCBkaXZlcmdlZCA9IGZhbHNlOwogICAgIGZvciAoVmVjdG9yPE5v
ZGUqPjo6Y29uc3RfaXRlcmF0b3IgaSA9IHJlbGF0ZWRUYXJnZXRBbmNlc3RvcnMuZW5kKCkgLSAx
OyBpID49IHJlbGF0ZWRUYXJnZXRBbmNlc3RvcnMuYmVnaW4oKTsgLS1pKSB7CiAgICAgICAgIGlm
IChkaXZlcmdlZCkgewotICAgICAgICAgICAgaWYgKGlzU2hhZG93Um9vdE9yU1ZHU2hhZG93Um9v
dCgqaSkpIHsKKyAgICAgICAgICAgIGlmICgoKmkpLT5pc1NoYWRvd1Jvb3QoKSkgewogICAgICAg
ICAgICAgICAgIGZpcnN0RGl2ZXJnZW50Qm91bmRhcnkgPSBpICsgMTsKICAgICAgICAgICAgICAg
ICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTE1NSw3ICsxMTksNyBAQCBQYXNzUmVmUHRyPEV2
ZW50VGFyZ2V0PiBFdmVudERpc3BhdGNoZXI6CiAKICAgICAgICAgdGFyZ2V0QW5jZXN0b3ItLTsK
IAotICAgICAgICBpZiAoaXNTaGFkb3dSb290T3JTVkdTaGFkb3dSb290KCppKSkKKyAgICAgICAg
aWYgKCgqaSktPmlzU2hhZG93Um9vdCgpKQogICAgICAgICAgICAgbG93ZXN0Q29tbW9uQm91bmRh
cnkgPSB0YXJnZXRBbmNlc3RvcjsKIAogICAgICAgICBpZiAoKCppKSAhPSAoKnRhcmdldEFuY2Vz
dG9yKS5ub2RlKCkpCkBAIC0xNjUsMTIgKzEyOSwxMiBAQCBQYXNzUmVmUHRyPEV2ZW50VGFyZ2V0
PiBFdmVudERpc3BhdGNoZXI6CiAgICAgaWYgKCFkaXZlcmdlZCkgewogICAgICAgICAvLyBUaGUg
cmVsYXRlZFRhcmdldCBpcyBhbiBhbmNlc3RvciBvciBzaGFkb3dIb3N0IG9mIHRoZSB0YXJnZXQu
CiAgICAgICAgIC8vIEZJWE1FOiBSZW1vdmUgdGhlIGZpcnN0IGNoZWNrIG9uY2UgY29udmVyc2lv
biB0byBuZXcgc2hhZG93IERPTSBpcyBjb21wbGV0ZSA8aHR0cDovL3dlYmtpdC5vcmcvYi80ODY5
OD4KLSAgICAgICAgaWYgKG1fbm9kZS0+c2hhZG93SG9zdCgpID09IHJlbGF0ZWRUYXJnZXQuZ2V0
KCkgfHwgaXNTaGFkb3dIb3N0KHJlbGF0ZWRUYXJnZXQuZ2V0KCkpKSB7CisgICAgICAgIGlmIChu
b2RlKCktPnNoYWRvd0hvc3QoKSA9PSByZWxhdGVkVGFyZ2V0LmdldCgpIHx8IGlzU2hhZG93SG9z
dChyZWxhdGVkVGFyZ2V0LmdldCgpKSkgewogICAgICAgICAgICAgVmVjdG9yPEV2ZW50Q29udGV4
dD46OmNvbnN0X2l0ZXJhdG9yIHJlbGF0ZWRUYXJnZXRDaGlsZCA9IHRhcmdldEFuY2VzdG9yIC0g
MTsKLSAgICAgICAgICAgIGlmIChyZWxhdGVkVGFyZ2V0Q2hpbGQgPj0gbV9hbmNlc3RvcnMuYmVn
aW4oKSAmJiBpc1NoYWRvd1Jvb3RPclNWR1NoYWRvd1Jvb3QocmVsYXRlZFRhcmdldENoaWxkLT5u
b2RlKCkpKQorICAgICAgICAgICAgaWYgKHJlbGF0ZWRUYXJnZXRDaGlsZCA+PSBtX2FuY2VzdG9y
cy5iZWdpbigpICYmIHJlbGF0ZWRUYXJnZXRDaGlsZC0+bm9kZSgpLT5pc1NoYWRvd1Jvb3QoKSkK
ICAgICAgICAgICAgICAgICBsb3dlc3RDb21tb25Cb3VuZGFyeSA9IHJlbGF0ZWRUYXJnZXRDaGls
ZDsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoKCpmaXJzdERpdmVyZ2VudEJvdW5kYXJ5KSA9
PSBtX25vZGUuZ2V0KCkpIHsKKyAgICB9IGVsc2UgaWYgKCgqZmlyc3REaXZlcmdlbnRCb3VuZGFy
eSkgPT0gbm9kZSgpKSB7CiAgICAgICAgIC8vIFNpbmNlIGFuY2VzdG9ycyBkb2VzIG5vdCBjb250
YWluIHRhcmdldCBpdHNlbGYsIHdlIG11c3QgYWNjb3VudAogICAgICAgICAvLyBmb3IgdGhlIHBv
c3NpYmlsaXR5IHRoYXQgdGFyZ2V0IGlzIGEgc2hhZG93SG9zdCBvZiByZWxhdGVkVGFyZ2V0CiAg
ICAgICAgIC8vIGFuZCB0aHVzIHNlcnZlcyBhcyB0aGUgbG93ZXN0Q29tbW9uQm91bmRhcnkuCkBA
IC0yMDMsNyArMTY3LDcgQEAgUGFzc1JlZlB0cjxFdmVudFRhcmdldD4gRXZlbnREaXNwYXRjaGVy
OgogICAgIGlmICghcmVsYXRlZFRhcmdldCkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBOb2Rl
KiB0YXJnZXQgPSBtX25vZGUuZ2V0KCk7CisgICAgTm9kZSogdGFyZ2V0ID0gbV90YXJnZXQgPyBt
X3RhcmdldC0+dG9Ob2RlKCkgOiAwOwogICAgIGlmICghdGFyZ2V0KQogICAgICAgICByZXR1cm4g
cHJwUmVsYXRlZFRhcmdldDsKIApAQCAtMjE3LDcgKzE4MSw3IEBAIFBhc3NSZWZQdHI8RXZlbnRU
YXJnZXQ+IEV2ZW50RGlzcGF0Y2hlcjoKICAgICBWZWN0b3I8Tm9kZSo+IHJlbGF0ZWRUYXJnZXRB
bmNlc3RvcnM7CiAgICAgTm9kZSogb3V0ZXJtb3N0U2hhZG93Qm91bmRhcnkgPSByZWxhdGVkVGFy
Z2V0LmdldCgpOwogICAgIGZvciAoTm9kZSogbiA9IG91dGVybW9zdFNoYWRvd0JvdW5kYXJ5OyBu
OyBuID0gbi0+cGFyZW50T3JIb3N0Tm9kZSgpKSB7Ci0gICAgICAgIGlmIChpc1NoYWRvd1Jvb3RP
clNWR1NoYWRvd1Jvb3QobikpCisgICAgICAgIGlmIChuLT5pc1NoYWRvd1Jvb3QoKSkKICAgICAg
ICAgICAgIG91dGVybW9zdFNoYWRvd0JvdW5kYXJ5ID0gbi0+cGFyZW50T3JIb3N0Tm9kZSgpOwog
ICAgICAgICBpZiAoIW5vQ29tbW9uQm91bmRhcnkpCiAgICAgICAgICAgICByZWxhdGVkVGFyZ2V0
QW5jZXN0b3JzLmFwcGVuZChuKTsKQEAgLTIzMCwxOCArMTk0LDE4IEBAIFBhc3NSZWZQdHI8RXZl
bnRUYXJnZXQ+IEV2ZW50RGlzcGF0Y2hlcjoKICAgICByZXR1cm4gYWRqdXN0VG9TaGFkb3dCb3Vu
ZGFyaWVzKHJlbGF0ZWRUYXJnZXQucmVsZWFzZSgpLCByZWxhdGVkVGFyZ2V0QW5jZXN0b3JzKTsK
IH0KIAotRXZlbnREaXNwYXRjaGVyOjpFdmVudERpc3BhdGNoZXIoTm9kZSogbm9kZSkKLSAgICA6
IG1fbm9kZShub2RlKQorRXZlbnREaXNwYXRjaGVyOjpFdmVudERpc3BhdGNoZXIoRXZlbnRUYXJn
ZXQqIHRhcmdldCkKKyAgICA6IG1fdGFyZ2V0KHRhcmdldCkKICAgICAsIG1fYW5jZXN0b3JzSW5p
dGlhbGl6ZWQoZmFsc2UpCiAgICAgLCBtX3Nob3VsZFByZXZlbnREaXNwYXRjaChmYWxzZSkKIHsK
LSAgICBBU1NFUlQobm9kZSk7Ci0gICAgbV92aWV3ID0gbm9kZS0+ZG9jdW1lbnQoKS0+dmlldygp
OworICAgIEFTU0VSVCh0YXJnZXQpOworICAgIEFTU0VSVCh0YXJnZXQtPnRvTm9kZSgpKTsKIH0K
IAogdm9pZCBFdmVudERpc3BhdGNoZXI6OmVuc3VyZUV2ZW50QW5jZXN0b3JzKEV2ZW50KiBldmVu
dCkKIHsKLSAgICBpZiAoIW1fbm9kZS0+aW5Eb2N1bWVudCgpKQorICAgIGlmICghbm9kZSgpLT5p
bkRvY3VtZW50KCkpCiAgICAgICAgIHJldHVybjsKIAogICAgIGlmIChtX2FuY2VzdG9yc0luaXRp
YWxpemVkKQpAQCAtMjQ5LDE5ICsyMTMsMzMgQEAgdm9pZCBFdmVudERpc3BhdGNoZXI6OmVuc3Vy
ZUV2ZW50QW5jZXN0bwogCiAgICAgbV9hbmNlc3RvcnNJbml0aWFsaXplZCA9IHRydWU7CiAKLSAg
ICBOb2RlKiBhbmNlc3RvciA9IG1fbm9kZS5nZXQoKTsKLSAgICBFdmVudFRhcmdldCogdGFyZ2V0
ID0gZXZlbnRUYXJnZXRSZXNwZWN0aW5nU1ZHVGFyZ2V0UnVsZXMoYW5jZXN0b3IpOworICAgIEV2
ZW50VGFyZ2V0KiB0YXJnZXQgPSBtX3RhcmdldC5nZXQoKTsKKyAgICBOb2RlKiBhbmNlc3RvciA9
IG5vZGUoKTsKKworI2lmIEVOQUJMRShTVkcpCisgICAgaWYgKFNWR0VsZW1lbnRJbnN0YW5jZSog
dGFyZ2V0SW5zdGFuY2UgPSBtX3RhcmdldC0+dG9TVkdFbGVtZW50SW5zdGFuY2UoKSkgeworICAg
ICAgICBTVkdFbGVtZW50SW5zdGFuY2UqIGxhc3RJbnN0YW5jZSA9IDA7CisgICAgICAgIHdoaWxl
ICh0cnVlKSB7CisgICAgICAgICAgICBsYXN0SW5zdGFuY2UgPSB0YXJnZXRJbnN0YW5jZTsKKyAg
ICAgICAgICAgIHRhcmdldEluc3RhbmNlID0gdGFyZ2V0SW5zdGFuY2UtPnBhcmVudE5vZGUoKTsK
KyAgICAgICAgICAgIGlmICghdGFyZ2V0SW5zdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAvLyBD
cm9zcyBTVkdFbGVtZW50SW5zdGFuY2UgLT4gRE9NIHRyZWUgYmFycmllci4gVGhlIG5leHQgbG9n
aWNhbCBhbmNlc3RvciBpcyB0aGUgcGFyZW50IG9mIHRoZSA8dXNlPiBlbGVtZW50LgorICAgICAg
ICAgICAgICAgIEFTU0VSVChsYXN0SW5zdGFuY2UpOworICAgICAgICAgICAgICAgIGFuY2VzdG9y
ID0gbGFzdEluc3RhbmNlLT5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCgpLT5wYXJlbnROb2RlKCk7
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb2Rl
KiB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdGFuY2UtPnRvTm9kZSgpOworICAgICAgICAgICAgbV9h
bmNlc3RvcnMuYXBwZW5kKEV2ZW50Q29udGV4dCh0YXJnZXROb2RlLCB0YXJnZXRJbnN0YW5jZSwg
dGFyZ2V0KSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKwogICAgIGJvb2wgc2hvdWxkU2tp
cE5leHRBbmNlc3RvciA9IGZhbHNlOwogICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGJvb2wg
aXNTVkdTaGFkb3dSb290ID0gYW5jZXN0b3ItPmlzU1ZHU2hhZG93Um9vdCgpOwotICAgICAgICBp
ZiAoaXNTVkdTaGFkb3dSb290IHx8IGFuY2VzdG9yLT5pc1NoYWRvd1Jvb3QoKSkgeworICAgICAg
ICBpZiAoYW5jZXN0b3ItPmlzU2hhZG93Um9vdCgpKSB7CiAgICAgICAgICAgICBpZiAoZGV0ZXJt
aW5lRGlzcGF0Y2hCZWhhdmlvcihldmVudCwgYW5jZXN0b3IpID09IFN0YXlJbnNpZGVTaGFkb3dE
T00pCiAgICAgICAgICAgICAgICAgcmV0dXJuOwotI2lmIEVOQUJMRShTVkcpCi0gICAgICAgICAg
ICBhbmNlc3RvciA9IGlzU1ZHU2hhZG93Um9vdCA/IGFuY2VzdG9yLT5zdmdTaGFkb3dIb3N0KCkg
OiBhbmNlc3Rvci0+c2hhZG93SG9zdCgpOwotI2Vsc2UKICAgICAgICAgICAgIGFuY2VzdG9yID0g
YW5jZXN0b3ItPnNoYWRvd0hvc3QoKTsKLSNlbmRpZgogICAgICAgICAgICAgaWYgKCFzaG91bGRT
a2lwTmV4dEFuY2VzdG9yKQogICAgICAgICAgICAgICAgIHRhcmdldCA9IGFuY2VzdG9yOwogICAg
ICAgICB9IGVsc2UKQEAgLTI3MCwyMCArMjQ4LDEzIEBAIHZvaWQgRXZlbnREaXNwYXRjaGVyOjpl
bnN1cmVFdmVudEFuY2VzdG8KICAgICAgICAgaWYgKCFhbmNlc3RvcikKICAgICAgICAgICAgIHJl
dHVybjsKIAotI2lmIEVOQUJMRShTVkcpCi0gICAgICAgIC8vIFNraXAgU1ZHU2hhZG93VHJlZVJv
b3RFbGVtZW50LgotICAgICAgICBzaG91bGRTa2lwTmV4dEFuY2VzdG9yID0gYW5jZXN0b3ItPmlz
U1ZHU2hhZG93Um9vdCgpOwotICAgICAgICBpZiAoc2hvdWxkU2tpcE5leHRBbmNlc3RvcikKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotI2VuZGlmCi0gICAgICAgIC8vIEZJWE1FOiBVbnJvbGwgdGhl
IGV4dHJhIGxvb3AgaW5zaWRlIGV2ZW50VGFyZ2V0UmVzcGVjdGluZ1NWR1RhcmdldFJ1bGVzIGlu
dG8gdGhpcyBsb29wLgotICAgICAgICBtX2FuY2VzdG9ycy5hcHBlbmQoRXZlbnRDb250ZXh0KGFu
Y2VzdG9yLCBldmVudFRhcmdldFJlc3BlY3RpbmdTVkdUYXJnZXRSdWxlcyhhbmNlc3RvciksIHRh
cmdldCkpOworICAgICAgICBtX2FuY2VzdG9ycy5hcHBlbmQoRXZlbnRDb250ZXh0KGFuY2VzdG9y
LCBhbmNlc3RvciwgdGFyZ2V0KSk7CiAgICAgfQogfQogCiBib29sIEV2ZW50RGlzcGF0Y2hlcjo6
ZGlzcGF0Y2hFdmVudChQYXNzUmVmUHRyPEV2ZW50PiBldmVudCkKIHsKLSAgICBldmVudC0+c2V0
VGFyZ2V0KGV2ZW50VGFyZ2V0UmVzcGVjdGluZ1NWR1RhcmdldFJ1bGVzKG1fbm9kZS5nZXQoKSkp
OworICAgIGV2ZW50LT5zZXRUYXJnZXQobV90YXJnZXQuZ2V0KCkpOwogCiAgICAgQVNTRVJUKCFl
dmVudERpc3BhdGNoRm9yYmlkZGVuKCkpOwogICAgIEFTU0VSVChldmVudC0+dGFyZ2V0KCkpOwpA
QCAtMjkyLDEyICsyNjMsMTIgQEAgYm9vbCBFdmVudERpc3BhdGNoZXI6OmRpc3BhdGNoRXZlbnQo
UGFzcwogICAgIFJlZlB0cjxFdmVudFRhcmdldD4gb3JpZ2luYWxUYXJnZXQgPSBldmVudC0+dGFy
Z2V0KCk7CiAgICAgZW5zdXJlRXZlbnRBbmNlc3RvcnMoZXZlbnQuZ2V0KCkpOwogCi0gICAgV2lu
ZG93RXZlbnRDb250ZXh0IHdpbmRvd0NvbnRleHQoZXZlbnQuZ2V0KCksIG1fbm9kZS5nZXQoKSwg
dG9wRXZlbnRDb250ZXh0KCkpOworICAgIFdpbmRvd0V2ZW50Q29udGV4dCB3aW5kb3dDb250ZXh0
KGV2ZW50LmdldCgpLCBub2RlKCksIHRvcEV2ZW50Q29udGV4dCgpKTsKIAotICAgIEluc3BlY3Rv
ckluc3RydW1lbnRhdGlvbkNvb2tpZSBjb29raWUgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246
OndpbGxEaXNwYXRjaEV2ZW50KG1fbm9kZS0+ZG9jdW1lbnQoKSwgKmV2ZW50LCB3aW5kb3dDb250
ZXh0LndpbmRvdygpLCBtX25vZGUuZ2V0KCksIG1fYW5jZXN0b3JzKTsKKyAgICBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3
aWxsRGlzcGF0Y2hFdmVudChub2RlKCktPmRvY3VtZW50KCksICpldmVudCwgd2luZG93Q29udGV4
dC53aW5kb3coKSwgbm9kZSgpLCBtX2FuY2VzdG9ycyk7CiAKICAgICAvLyBHaXZlIHRoZSB0YXJn
ZXQgbm9kZSBhIGNoYW5jZSB0byBkbyBzb21lIHdvcmsgYmVmb3JlIERPTSBldmVudCBoYW5kbGVy
cyBnZXQgYSBjcmFjay4KLSAgICB2b2lkKiBkYXRhID0gbV9ub2RlLT5wcmVEaXNwYXRjaEV2ZW50
SGFuZGxlcihldmVudC5nZXQoKSk7CisgICAgdm9pZCogZGF0YSA9IG5vZGUoKS0+cHJlRGlzcGF0
Y2hFdmVudEhhbmRsZXIoZXZlbnQuZ2V0KCkpOwogICAgIGlmIChtX3Nob3VsZFByZXZlbnREaXNw
YXRjaCB8fCBldmVudC0+cHJvcGFnYXRpb25TdG9wcGVkKCkpCiAgICAgICAgIGdvdG8gZG9uZURp
c3BhdGNoaW5nOwogCkBAIC0zMTUsOCArMjg2LDggQEAgYm9vbCBFdmVudERpc3BhdGNoZXI6OmRp
c3BhdGNoRXZlbnQoUGFzcwogCiAgICAgZXZlbnQtPnNldEV2ZW50UGhhc2UoRXZlbnQ6OkFUX1RB
UkdFVCk7CiAgICAgZXZlbnQtPnNldFRhcmdldChvcmlnaW5hbFRhcmdldC5nZXQoKSk7Ci0gICAg
ZXZlbnQtPnNldEN1cnJlbnRUYXJnZXQoZXZlbnRUYXJnZXRSZXNwZWN0aW5nU1ZHVGFyZ2V0UnVs
ZXMobV9ub2RlLmdldCgpKSk7Ci0gICAgbV9ub2RlLT5oYW5kbGVMb2NhbEV2ZW50cyhldmVudC5n
ZXQoKSk7CisgICAgZXZlbnQtPnNldEN1cnJlbnRUYXJnZXQobV90YXJnZXQuZ2V0KCkpOworICAg
IG5vZGUoKS0+aGFuZGxlTG9jYWxFdmVudHMoZXZlbnQuZ2V0KCkpOwogICAgIGlmIChldmVudC0+
cHJvcGFnYXRpb25TdG9wcGVkKCkpCiAgICAgICAgIGdvdG8gZG9uZURpc3BhdGNoaW5nOwogCkBA
IC0zMzksMTQgKzMxMCwxNCBAQCBkb25lRGlzcGF0Y2hpbmc6CiAgICAgZXZlbnQtPnNldEV2ZW50
UGhhc2UoMCk7CiAKICAgICAvLyBQYXNzIHRoZSBkYXRhIGZyb20gdGhlIHByZURpc3BhdGNoRXZl
bnRIYW5kbGVyIHRvIHRoZSBwb3N0RGlzcGF0Y2hFdmVudEhhbmRsZXIuCi0gICAgbV9ub2RlLT5w
b3N0RGlzcGF0Y2hFdmVudEhhbmRsZXIoZXZlbnQuZ2V0KCksIGRhdGEpOworICAgIG5vZGUoKS0+
cG9zdERpc3BhdGNoRXZlbnRIYW5kbGVyKGV2ZW50LmdldCgpLCBkYXRhKTsKIAogICAgIC8vIENh
bGwgZGVmYXVsdCBldmVudCBoYW5kbGVycy4gV2hpbGUgdGhlIERPTSBkb2VzIGhhdmUgYSBjb25j
ZXB0IG9mIHByZXZlbnRpbmcKICAgICAvLyBkZWZhdWx0IGhhbmRsaW5nLCB0aGUgZGV0YWlsIG9m
IHdoaWNoIGhhbmRsZXJzIGFyZSBjYWxsZWQgaXMgYW4gaW50ZXJuYWwKICAgICAvLyBpbXBsZW1l
bnRhdGlvbiBkZXRhaWwgYW5kIG5vdCBwYXJ0IG9mIHRoZSBET00uCiAgICAgaWYgKCFldmVudC0+
ZGVmYXVsdFByZXZlbnRlZCgpICYmICFldmVudC0+ZGVmYXVsdEhhbmRsZWQoKSkgewogICAgICAg
ICAvLyBOb24tYnViYmxpbmcgZXZlbnRzIGNhbGwgb25seSBvbmUgZGVmYXVsdCBldmVudCBoYW5k
bGVyLCB0aGUgb25lIGZvciB0aGUgdGFyZ2V0LgotICAgICAgICBtX25vZGUtPmRlZmF1bHRFdmVu
dEhhbmRsZXIoZXZlbnQuZ2V0KCkpOworICAgICAgICBub2RlKCktPmRlZmF1bHRFdmVudEhhbmRs
ZXIoZXZlbnQuZ2V0KCkpOwogICAgICAgICBBU1NFUlQoIWV2ZW50LT5kZWZhdWx0UHJldmVudGVk
KCkpOwogICAgICAgICBpZiAoZXZlbnQtPmRlZmF1bHRIYW5kbGVkKCkpCiAgICAgICAgICAgICBn
b3RvIGRvbmVXaXRoRGVmYXVsdDsKQEAgLTM4NCw3ICszNTUsNyBAQCBFdmVudERpc3BhdGNoQmVo
YXZpb3IgRXZlbnREaXNwYXRjaGVyOjpkCiAjaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKSAmJiBF
TkFCTEUoVklERU8pCiAgICAgLy8gVmlkZW8tb25seSBmdWxsIHNjcmVlbiBpcyBhIG1vZGUgd2hl
cmUgd2UgdXNlIHRoZSBzaGFkb3cgRE9NIGFzIGFuIGltcGxlbWVudGF0aW9uCiAgICAgLy8gZGV0
YWlsIHRoYXQgc2hvdWxkIG5vdCBiZSBkZXRlY3RhYmxlIGJ5IHRoZSB3ZWIgY29udGVudC4KLSAg
ICBpZiAoRWxlbWVudCogZWxlbWVudCA9IG1fbm9kZS0+ZG9jdW1lbnQoKS0+d2Via2l0Q3VycmVu
dEZ1bGxTY3JlZW5FbGVtZW50KCkpIHsKKyAgICBpZiAoRWxlbWVudCogZWxlbWVudCA9IG5vZGUo
KS0+ZG9jdW1lbnQoKS0+d2Via2l0Q3VycmVudEZ1bGxTY3JlZW5FbGVtZW50KCkpIHsKICAgICAg
ICAgLy8gRklYTUU6IFdlIGFzc3VtZSB0aGF0IGlmIHRoZSBmdWxsIHNjcmVlbiBlbGVtZW50IGlz
IGEgbWVkaWEgZWxlbWVudCB0aGF0IGl0J3MKICAgICAgICAgLy8gdGhlIHZpZGVvLW9ubHkgZnVs
bCBzY3JlZW4uIEJvdGggaGVyZSBhbmQgZWxzZXdoZXJlLiBCdXQgdGhhdCBpcyBwcm9iYWJseSB3
cm9uZy4KICAgICAgICAgaWYgKGVsZW1lbnQtPmlzTWVkaWFFbGVtZW50KCkgJiYgc2hhZG93Um9v
dCAmJiBzaGFkb3dSb290LT5zaGFkb3dIb3N0KCkgPT0gZWxlbWVudCkKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL2RvbS9FdmVudERpc3BhdGNoZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9kb20vRXZlbnREaXNwYXRjaGVyLmgJKHJldmlzaW9uIDk2NTc1KQorKysgU291cmNlL1dlYkNv
cmUvZG9tL0V2ZW50RGlzcGF0Y2hlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNSw3ICsyNSw3IEBA
CiAKICNpZm5kZWYgRXZlbnREaXNwYXRjaGVyX2gKICNkZWZpbmUgRXZlbnREaXNwYXRjaGVyX2gK
LQorI2luY2x1ZGUgIkV2ZW50VGFyZ2V0LmgiCiAjaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KICNp
bmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAKQEAgLTM0LDggKzM0LDYgQEAgbmFtZXNwYWNlIFdlYkNv
cmUgewogY2xhc3MgRXZlbnQ7CiBjbGFzcyBFdmVudENvbnRleHQ7CiBjbGFzcyBFdmVudERpc3Bh
dGNoTWVkaWF0b3I7Ci1jbGFzcyBFdmVudFRhcmdldDsKLWNsYXNzIEZyYW1lVmlldzsKIGNsYXNz
IE5vZGU7CiBjbGFzcyBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ7CiBjbGFzcyBQbGF0Zm9ybU1vdXNl
RXZlbnQ7CkBAIC00OCwxNyArNDYsMTggQEAgZW51bSBFdmVudERpc3BhdGNoQmVoYXZpb3Igewog
CiBjbGFzcyBFdmVudERpc3BhdGNoZXIgewogcHVibGljOgotICAgIHN0YXRpYyBib29sIGRpc3Bh
dGNoRXZlbnQoTm9kZSosIFBhc3NSZWZQdHI8RXZlbnREaXNwYXRjaE1lZGlhdG9yPik7Ci0gICAg
c3RhdGljIHZvaWQgZGlzcGF0Y2hTY29wZWRFdmVudChOb2RlKiwgUGFzc1JlZlB0cjxFdmVudERp
c3BhdGNoTWVkaWF0b3I+KTsKKyAgICBzdGF0aWMgYm9vbCBkaXNwYXRjaEV2ZW50KEV2ZW50VGFy
Z2V0KiwgUGFzc1JlZlB0cjxFdmVudERpc3BhdGNoTWVkaWF0b3I+KTsKKyAgICBzdGF0aWMgdm9p
ZCBkaXNwYXRjaFNjb3BlZEV2ZW50KEV2ZW50VGFyZ2V0KiwgUGFzc1JlZlB0cjxFdmVudERpc3Bh
dGNoTWVkaWF0b3I+KTsKIAotICAgIHN0YXRpYyB2b2lkIGRpc3BhdGNoU2ltdWxhdGVkQ2xpY2so
Tm9kZSosIFBhc3NSZWZQdHI8RXZlbnQ+IHVuZGVybHlpbmdFdmVudCwgYm9vbCBzZW5kTW91c2VF
dmVudHMsIGJvb2wgc2hvd1ByZXNzZWRMb29rKTsKKyAgICBzdGF0aWMgdm9pZCBkaXNwYXRjaFNp
bXVsYXRlZENsaWNrKEV2ZW50VGFyZ2V0KiwgUGFzc1JlZlB0cjxFdmVudD4gdW5kZXJseWluZ0V2
ZW50LCBib29sIHNlbmRNb3VzZUV2ZW50cywgYm9vbCBzaG93UHJlc3NlZExvb2spOwogCiAgICAg
Ym9vbCBkaXNwYXRjaEV2ZW50KFBhc3NSZWZQdHI8RXZlbnQ+KTsKICAgICBQYXNzUmVmUHRyPEV2
ZW50VGFyZ2V0PiBhZGp1c3RSZWxhdGVkVGFyZ2V0KEV2ZW50KiwgUGFzc1JlZlB0cjxFdmVudFRh
cmdldD4pOwogICAgIE5vZGUqIG5vZGUoKSBjb25zdDsKKyAgICBFdmVudFRhcmdldCogdGFyZ2V0
KCkgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgRXZlbnREaXNwYXRjaGVyKE5vZGUqKTsKKyAgICBF
dmVudERpc3BhdGNoZXIoRXZlbnRUYXJnZXQqKTsKIAogICAgIFBhc3NSZWZQdHI8RXZlbnRUYXJn
ZXQ+IGFkanVzdFRvU2hhZG93Qm91bmRhcmllcyhQYXNzUmVmUHRyPE5vZGU+IHJlbGF0ZWRUYXJn
ZXQsIGNvbnN0IFZlY3RvcjxOb2RlKj4gcmVsYXRlZFRhcmdldEFuY2VzdG9ycyk7CiAgICAgRXZl
bnREaXNwYXRjaEJlaGF2aW9yIGRldGVybWluZURpc3BhdGNoQmVoYXZpb3IoRXZlbnQqLCBOb2Rl
KiBzaGFkb3dSb290KTsKQEAgLTY2LDE4ICs2NSwyMiBAQCBwcml2YXRlOgogICAgIGNvbnN0IEV2
ZW50Q29udGV4dCogdG9wRXZlbnRDb250ZXh0KCk7CiAKICAgICBWZWN0b3I8RXZlbnRDb250ZXh0
PiBtX2FuY2VzdG9yczsKLSAgICBSZWZQdHI8Tm9kZT4gbV9ub2RlOwotICAgIFJlZlB0cjxFdmVu
dFRhcmdldD4gbV9vcmlnaW5hbFRhcmdldDsKLSAgICBSZWZQdHI8RnJhbWVWaWV3PiBtX3ZpZXc7
CisgICAgUmVmUHRyPEV2ZW50VGFyZ2V0PiBtX3RhcmdldDsKICAgICBib29sIG1fYW5jZXN0b3Jz
SW5pdGlhbGl6ZWQ7CiAgICAgYm9vbCBtX3Nob3VsZFByZXZlbnREaXNwYXRjaDsKIH07CiAKIGlu
bGluZSBOb2RlKiBFdmVudERpc3BhdGNoZXI6Om5vZGUoKSBjb25zdAogewotICAgIHJldHVybiBt
X25vZGUuZ2V0KCk7CisgICAgcmV0dXJuIG1fdGFyZ2V0LT50b05vZGUoKTsKIH0KIAoraW5saW5l
IEV2ZW50VGFyZ2V0KiBFdmVudERpc3BhdGNoZXI6OnRhcmdldCgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fdGFyZ2V0LmdldCgpOworfQorCisKIH0KIAogI2VuZGlmCkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9kb20vTm9kZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL05vZGUu
Y3BwCShyZXZpc2lvbiA5NjU3NSkKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMTA2LDExICsxMDYsNiBAQAogI2luY2x1ZGUgIlN0b3JhZ2VFdmVudC5o
IgogI2VuZGlmCiAKLSNpZiBFTkFCTEUoU1ZHKQotI2luY2x1ZGUgIlNWR0VsZW1lbnRJbnN0YW5j
ZS5oIgotI2luY2x1ZGUgIlNWR1VzZUVsZW1lbnQuaCIKLSNlbmRpZgotCiAjaWYgRU5BQkxFKFhI
VE1MTVApCiAjaW5jbHVkZSAiSFRNTE5vU2NyaXB0RWxlbWVudC5oIgogI2VuZGlmCkBAIC01Njgs
NyArNTYzLDcgQEAgRWxlbWVudCogTm9kZTo6c2hhZG93SG9zdCgpIGNvbnN0CiAKIHZvaWQgTm9k
ZTo6c2V0U2hhZG93SG9zdChFbGVtZW50KiBob3N0KQogewotICAgIEFTU0VSVCghcGFyZW50Tm9k
ZSgpICYmICFpc1NWR1NoYWRvd1Jvb3QoKSk7CisgICAgQVNTRVJUKCFwYXJlbnROb2RlKCkpOwog
ICAgIGlmIChob3N0KQogICAgICAgICBzZXRGbGFnKElzU2hhZG93Um9vdEZsYWcpOwogICAgIGVs
c2UKQEAgLTE1MzAsMjQgKzE1MjUsOCBAQCBib29sIE5vZGU6OmNhblN0YXJ0U2VsZWN0aW9uKCkg
Y29uc3QKICAgICByZXR1cm4gcGFyZW50T3JIb3N0Tm9kZSgpID8gcGFyZW50T3JIb3N0Tm9kZSgp
LT5jYW5TdGFydFNlbGVjdGlvbigpIDogdHJ1ZTsKIH0KIAotI2lmIEVOQUJMRShTVkcpCi1TVkdV
c2VFbGVtZW50KiBOb2RlOjpzdmdTaGFkb3dIb3N0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gaXNT
VkdTaGFkb3dSb290KCkgPyBzdGF0aWNfY2FzdDxTVkdVc2VFbGVtZW50Kj4ocGFyZW50KCkpIDog
MDsKLX0KLSNlbmRpZgotCiBOb2RlKiBOb2RlOjpzaGFkb3dBbmNlc3Rvck5vZGUoKSBjb25zdAog
ewotI2lmIEVOQUJMRShTVkcpCi0gICAgLy8gU1ZHIGVsZW1lbnRzIGxpdmluZyBpbiBhIHNoYWRv
dyB0cmVlIG9ubHkgb2NjdXIgd2hlbiA8dXNlPiBjcmVhdGVkIHRoZW0uCi0gICAgLy8gRm9yIHRo
ZXNlIGNhc2VzIHdlIGRvIE5PVCB3YW50IHRvIHJldHVybiB0aGUgc2hhZG93UGFyZW50Tm9kZSgp
IGhlcmUKLSAgICAvLyBidXQgdGhlIGFjdHVhbCBzaGFkb3cgdHJlZSBlbGVtZW50IC0gYXMgbWFp
biBkaWZmZXJlbmNlIHRvIHRoZSBIVE1MIGZvcm1zCi0gICAgLy8gc2hhZG93IHRyZWUgY29uY2Vw
dC4gKFRoaXMgZnVuY3Rpb24gX2NvdWxkXyBiZSBtYWRlIHZpcnR1YWwgLSBvcGluaW9ucz8pCi0g
ICAgaWYgKGlzU1ZHRWxlbWVudCgpKQotICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxOb2RlKj4o
dGhpcyk7Ci0jZW5kaWYKLQogICAgIE5vZGUqIHJvb3QgPSBzaGFkb3dUcmVlUm9vdE5vZGUoKTsK
ICAgICBpZiAocm9vdCkKICAgICAgICAgcmV0dXJuIHJvb3QtPnNoYWRvd0hvc3QoKTsKQEAgLTE1
NTgsNyArMTUzNyw3IEBAIE5vZGUqIE5vZGU6OnNoYWRvd1RyZWVSb290Tm9kZSgpIGNvbnN0CiB7
CiAgICAgTm9kZSogcm9vdCA9IGNvbnN0X2Nhc3Q8Tm9kZSo+KHRoaXMpOwogICAgIHdoaWxlIChy
b290KSB7Ci0gICAgICAgIGlmIChyb290LT5pc1NoYWRvd1Jvb3QoKSB8fCByb290LT5pc1NWR1No
YWRvd1Jvb3QoKSkKKyAgICAgICAgaWYgKHJvb3QtPmlzU2hhZG93Um9vdCgpKQogICAgICAgICAg
ICAgcmV0dXJuIHJvb3Q7CiAgICAgICAgIHJvb3QgPSByb290LT5wYXJlbnROb2RlR3VhcmFudGVl
ZEhvc3RGcmVlKCk7CiAgICAgfQpAQCAtMTU3MCw3ICsxNTQ5LDcgQEAgTm9kZSogTm9kZTo6bm9u
Qm91bmRhcnlTaGFkb3dUcmVlUm9vdE5vZAogICAgIEFTU0VSVCghaXNTaGFkb3dSb290KCkpOwog
ICAgIE5vZGUqIHJvb3QgPSB0aGlzOwogICAgIHdoaWxlIChyb290KSB7Ci0gICAgICAgIGlmIChy
b290LT5pc1NoYWRvd1Jvb3QoKSB8fCByb290LT5pc1NWR1NoYWRvd1Jvb3QoKSkKKyAgICAgICAg
aWYgKHJvb3QtPmlzU2hhZG93Um9vdCgpKQogICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAg
ICAgIE5vZGUqIHBhcmVudCA9IHJvb3QtPnBhcmVudE5vZGVHdWFyYW50ZWVkSG9zdEZyZWUoKTsK
ICAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQtPmlzU2hhZG93Um9vdCgpKQpAQCAtMjUwNSwz
MiArMjQ4NCwxMiBAQCB2b2lkIE5vZGU6OmRpZE1vdmVUb05ld093bmVyRG9jdW1lbnQoKQogICAg
IHNldERpZE1vdmVUb05ld093bmVyRG9jdW1lbnRXYXNDYWxsZWQodHJ1ZSk7CiB9CiAKLSNpZiBF
TkFCTEUoU1ZHKQotc3RhdGljIGlubGluZSBIYXNoU2V0PFNWR0VsZW1lbnRJbnN0YW5jZSo+IGlu
c3RhbmNlc0ZvclNWR0VsZW1lbnQoTm9kZSogbm9kZSkKLXsKLSAgICBIYXNoU2V0PFNWR0VsZW1l
bnRJbnN0YW5jZSo+IGluc3RhbmNlczsKLSAKLSAgICBBU1NFUlQobm9kZSk7Ci0gICAgaWYgKCFu
b2RlLT5pc1NWR0VsZW1lbnQoKSB8fCBub2RlLT5zaGFkb3dUcmVlUm9vdE5vZGUoKSkKLSAgICAg
ICAgcmV0dXJuIEhhc2hTZXQ8U1ZHRWxlbWVudEluc3RhbmNlKj4oKTsKLQotICAgIFNWR0VsZW1l
bnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4obm9kZSk7Ci0gICAgaWYgKCFl
bGVtZW50LT5pc1N0eWxlZCgpKQotICAgICAgICByZXR1cm4gSGFzaFNldDxTVkdFbGVtZW50SW5z
dGFuY2UqPigpOwotCi0gICAgU1ZHU3R5bGVkRWxlbWVudCogc3R5bGVkRWxlbWVudCA9IHN0YXRp
Y19jYXN0PFNWR1N0eWxlZEVsZW1lbnQqPihlbGVtZW50KTsKLSAgICBBU1NFUlQoIXN0eWxlZEVs
ZW1lbnQtPmluc3RhbmNlVXBkYXRlc0Jsb2NrZWQoKSk7Ci0KLSAgICByZXR1cm4gc3R5bGVkRWxl
bWVudC0+aW5zdGFuY2VzRm9yRWxlbWVudCgpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUg
Ym9vbCB0cnlBZGRFdmVudExpc3RlbmVyKE5vZGUqIHRhcmdldE5vZGUsIGNvbnN0IEF0b21pY1N0
cmluZyYgZXZlbnRUeXBlLCBQYXNzUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyLCBib29s
IHVzZUNhcHR1cmUpCitib29sIE5vZGU6OmFkZEV2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3Ry
aW5nJiBldmVudFR5cGUsIFBhc3NSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIsIGJvb2wg
dXNlQ2FwdHVyZSkKIHsKLSAgICBpZiAoIXRhcmdldE5vZGUtPkV2ZW50VGFyZ2V0OjphZGRFdmVu
dExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpKQorICAgIGlmICghRXZl
bnRUYXJnZXQ6OmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVy
ZSkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIGlmIChEb2N1bWVudCogZG9jdW1lbnQg
PSB0YXJnZXROb2RlLT5kb2N1bWVudCgpKSB7CisgICAgaWYgKERvY3VtZW50KiBkb2N1bWVudCA9
IHRoaXMtPmRvY3VtZW50KCkpIHsKICAgICAgICAgZG9jdW1lbnQtPmFkZExpc3RlbmVyVHlwZUlm
TmVlZGVkKGV2ZW50VHlwZSk7CiAgICAgICAgIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygp
Lm1vdXNld2hlZWxFdmVudCkKICAgICAgICAgICAgIGRvY3VtZW50LT5kaWRBZGRXaGVlbEV2ZW50
SGFuZGxlcigpOwpAQCAtMjUzOSw0OCArMjQ5OCwxNCBAQCBzdGF0aWMgaW5saW5lIGJvb2wgdHJ5
QWRkRXZlbnRMaXN0ZW5lcihOCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgTm9kZTo6YWRk
RXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgUGFzc1JlZlB0cjxF
dmVudExpc3RlbmVyPiBsaXN0ZW5lciwgYm9vbCB1c2VDYXB0dXJlKQotewotI2lmICFFTkFCTEUo
U1ZHKQotICAgIHJldHVybiB0cnlBZGRFdmVudExpc3RlbmVyKHRoaXMsIGV2ZW50VHlwZSwgbGlz
dGVuZXIsIHVzZUNhcHR1cmUpOwotI2Vsc2UKLSAgICBpZiAoIWlzU1ZHRWxlbWVudCgpKQotICAg
ICAgICByZXR1cm4gdHJ5QWRkRXZlbnRMaXN0ZW5lcih0aGlzLCBldmVudFR5cGUsIGxpc3RlbmVy
LCB1c2VDYXB0dXJlKTsKLQotICAgIEhhc2hTZXQ8U1ZHRWxlbWVudEluc3RhbmNlKj4gaW5zdGFu
Y2VzID0gaW5zdGFuY2VzRm9yU1ZHRWxlbWVudCh0aGlzKTsKLSAgICBpZiAoaW5zdGFuY2VzLmlz
RW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIHRyeUFkZEV2ZW50TGlzdGVuZXIodGhpcywgZXZlbnRU
eXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSk7Ci0KLSAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4g
bGlzdGVuZXJGb3JSZWd1bGFyVHJlZSA9IGxpc3RlbmVyOwotICAgIFJlZlB0cjxFdmVudExpc3Rl
bmVyPiBsaXN0ZW5lckZvclNoYWRvd1RyZWUgPSBsaXN0ZW5lckZvclJlZ3VsYXJUcmVlOwotCi0g
ICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVyIHRvIHJlZ3VsYXIgRE9NIGVsZW1lbnQKLSAgICBpZiAo
IXRyeUFkZEV2ZW50TGlzdGVuZXIodGhpcywgZXZlbnRUeXBlLCBsaXN0ZW5lckZvclJlZ3VsYXJU
cmVlLnJlbGVhc2UoKSwgdXNlQ2FwdHVyZSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
IC8vIEFkZCBldmVudCBsaXN0ZW5lciB0byBhbGwgc2hhZG93IHRyZWUgRE9NIGVsZW1lbnQgaW5z
dGFuY2VzCi0gICAgY29uc3QgSGFzaFNldDxTVkdFbGVtZW50SW5zdGFuY2UqPjo6Y29uc3RfaXRl
cmF0b3IgZW5kID0gaW5zdGFuY2VzLmVuZCgpOwotICAgIGZvciAoSGFzaFNldDxTVkdFbGVtZW50
SW5zdGFuY2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBpbnN0YW5jZXMuYmVnaW4oKTsgaXQgIT0g
ZW5kOyArK2l0KSB7Ci0gICAgICAgIEFTU0VSVCgoKml0KS0+c2hhZG93VHJlZUVsZW1lbnQoKSk7
Ci0gICAgICAgIEFTU0VSVCgoKml0KS0+Y29ycmVzcG9uZGluZ0VsZW1lbnQoKSA9PSB0aGlzKTsK
LQotICAgICAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJGb3JDdXJyZW50U2hhZG93
VHJlZUVsZW1lbnQgPSBsaXN0ZW5lckZvclNoYWRvd1RyZWU7Ci0gICAgICAgIGJvb2wgcmVzdWx0
ID0gdHJ5QWRkRXZlbnRMaXN0ZW5lcigoKml0KS0+c2hhZG93VHJlZUVsZW1lbnQoKSwgZXZlbnRU
eXBlLCBsaXN0ZW5lckZvckN1cnJlbnRTaGFkb3dUcmVlRWxlbWVudC5yZWxlYXNlKCksIHVzZUNh
cHR1cmUpOwotICAgICAgICBBU1NFUlRfVU5VU0VEKHJlc3VsdCwgcmVzdWx0KTsKLSAgICB9Ci0K
LSAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgdHJ5UmVt
b3ZlRXZlbnRMaXN0ZW5lcihOb2RlKiB0YXJnZXROb2RlLCBjb25zdCBBdG9taWNTdHJpbmcmIGV2
ZW50VHlwZSwgRXZlbnRMaXN0ZW5lciogbGlzdGVuZXIsIGJvb2wgdXNlQ2FwdHVyZSkKK2Jvb2wg
Tm9kZTo6cmVtb3ZlRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSwg
RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIsIGJvb2wgdXNlQ2FwdHVyZSkKIHsKLSAgICBpZiAoIXRh
cmdldE5vZGUtPkV2ZW50VGFyZ2V0OjpyZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlz
dGVuZXIsIHVzZUNhcHR1cmUpKQorICAgIGlmICghRXZlbnRUYXJnZXQ6OnJlbW92ZUV2ZW50TGlz
dGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSkpCiAgICAgICAgIHJldHVybiBm
YWxzZTsKIAogICAgIC8vIEZJWE1FOiBOb3RpZnkgRG9jdW1lbnQgdGhhdCB0aGUgbGlzdGVuZXIg
aGFzIHZhbmlzaGVkLiBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgYSBudW1iZXIgb2YKICAgICAv
LyBsaXN0ZW5lcnMgZm9yIGVhY2ggdHlwZSwgbm90IGp1c3QgYSBib29sIC0gc2VlIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMzg2MQotICAgIGlmIChEb2N1bWVudCog
ZG9jdW1lbnQgPSB0YXJnZXROb2RlLT5kb2N1bWVudCgpKSB7CisgICAgaWYgKERvY3VtZW50KiBk
b2N1bWVudCA9IHRoaXMtPmRvY3VtZW50KCkpIHsKICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBl
dmVudE5hbWVzKCkubW91c2V3aGVlbEV2ZW50KQogICAgICAgICAgICAgZG9jdW1lbnQtPmRpZFJl
bW92ZVdoZWVsRXZlbnRIYW5kbGVyKCk7CiAgICAgfQpAQCAtMjU4OCw1OSArMjUxMyw2IEBAIHN0
YXRpYyBpbmxpbmUgYm9vbCB0cnlSZW1vdmVFdmVudExpc3RlbmUKICAgICByZXR1cm4gdHJ1ZTsK
IH0KIAotYm9vbCBOb2RlOjpyZW1vdmVFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyYg
ZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCB1c2VDYXB0dXJlKQotewot
I2lmICFFTkFCTEUoU1ZHKQotICAgIHJldHVybiB0cnlSZW1vdmVFdmVudExpc3RlbmVyKHRoaXMs
IGV2ZW50VHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpOwotI2Vsc2UKLSAgICBpZiAoIWlzU1ZH
RWxlbWVudCgpKQotICAgICAgICByZXR1cm4gdHJ5UmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLCBl
dmVudFR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlKTsKLQotICAgIEhhc2hTZXQ8U1ZHRWxlbWVu
dEluc3RhbmNlKj4gaW5zdGFuY2VzID0gaW5zdGFuY2VzRm9yU1ZHRWxlbWVudCh0aGlzKTsKLSAg
ICBpZiAoaW5zdGFuY2VzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIHRyeVJlbW92ZUV2ZW50
TGlzdGVuZXIodGhpcywgZXZlbnRUeXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSk7Ci0KLSAgICAv
LyBFdmVudFRhcmdldDo6cmVtb3ZlRXZlbnRMaXN0ZW5lciBjcmVhdGVzIGEgUGFzc1JlZlB0ciBh
cm91bmQgdGhlIGdpdmVuIEV2ZW50TGlzdGVuZXIKLSAgICAvLyBvYmplY3Qgd2hlbiBjcmVhdGlu
ZyBhIHRlbXBvcmFyeSBSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lciBvYmplY3QgdXNlZCB0byBsb29r
IHVwIHRoZQotICAgIC8vIGV2ZW50IGxpc3RlbmVyIGluIGEgY2FjaGUuIElmIHdlIHdhbnQgdG8g
YmUgYWJsZSB0byBjYWxsIHJlbW92ZUV2ZW50TGlzdGVuZXIoKSBtdWx0aXBsZQotICAgIC8vIHRp
bWVzIG9uIGRpZmZlcmVudCBub2Rlcywgd2UgaGF2ZSB0byBkZWxheSBpdHMgaW1tZWRpYXRlIGRl
c3RydWN0aW9uLCB3aGljaCB3b3VsZCBoYXBwZW4KLSAgICAvLyBhZnRlciB0aGUgZmlyc3QgY2Fs
bCBiZWxvdy4KLSAgICBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gcHJvdGVjdG9yKGxpc3RlbmVyKTsK
LQotICAgIC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lciBmcm9tIHJlZ3VsYXIgRE9NIGVsZW1lbnQK
LSAgICBpZiAoIXRyeVJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcywgZXZlbnRUeXBlLCBsaXN0ZW5l
ciwgdXNlQ2FwdHVyZSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIFJlbW92ZSBl
dmVudCBsaXN0ZW5lciBmcm9tIGFsbCBzaGFkb3cgdHJlZSBET00gZWxlbWVudCBpbnN0YW5jZXMK
LSAgICBjb25zdCBIYXNoU2V0PFNWR0VsZW1lbnRJbnN0YW5jZSo+Ojpjb25zdF9pdGVyYXRvciBl
bmQgPSBpbnN0YW5jZXMuZW5kKCk7Ci0gICAgZm9yIChIYXNoU2V0PFNWR0VsZW1lbnRJbnN0YW5j
ZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGluc3RhbmNlcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsr
aXQpIHsKLSAgICAgICAgQVNTRVJUKCgqaXQpLT5jb3JyZXNwb25kaW5nRWxlbWVudCgpID09IHRo
aXMpOwotCi0gICAgICAgIFNWR0VsZW1lbnQqIHNoYWRvd1RyZWVFbGVtZW50ID0gKCppdCktPnNo
YWRvd1RyZWVFbGVtZW50KCk7Ci0gICAgICAgIEFTU0VSVChzaGFkb3dUcmVlRWxlbWVudCk7Ci0K
LSAgICAgICAgaWYgKHRyeVJlbW92ZUV2ZW50TGlzdGVuZXIoc2hhZG93VHJlZUVsZW1lbnQsIGV2
ZW50VHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpKQotICAgICAgICAgICAgY29udGludWU7Ci0K
LSAgICAgICAgLy8gVGhpcyBjYXNlIGNhbiBvbmx5IGJlIGhpdCBmb3IgZXZlbnQgbGlzdGVuZXJz
IGNyZWF0ZWQgZnJvbSBtYXJrdXAKLSAgICAgICAgQVNTRVJUKGxpc3RlbmVyLT53YXNDcmVhdGVk
RnJvbU1hcmt1cCgpKTsKLQotICAgICAgICAvLyBJZiB0aGUgZXZlbnQgbGlzdGVuZXIgJ2xpc3Rl
bmVyJyBoYXMgYmVlbiBjcmVhdGVkIGZyb20gbWFya3VwIGFuZCBoYXMgYmVlbiBmaXJlZCBiZWZv
cmUKLSAgICAgICAgLy8gdGhlbiBKU0xhenlFdmVudExpc3RlbmVyOjpwYXJzZUNvZGUoKSBoYXMg
YmVlbiBjYWxsZWQgYW5kIG1fanNGdW5jdGlvbiBvZiB0aGF0IGxpc3RlbmVyCi0gICAgICAgIC8v
IGhhcyBiZWVuIGNyZWF0ZWQgKHJlYWQ6IGl0J3Mgbm90IDAgYW55bW9yZSkuIER1cmluZyBzaGFk
b3cgdHJlZSBjcmVhdGlvbiwgdGhlIGV2ZW50Ci0gICAgICAgIC8vIGxpc3RlbmVyIERPTSBhdHRy
aWJ1dGUgaGFzIGJlZW4gY2xvbmVkLCBhbmQgYW5vdGhlciBldmVudCBsaXN0ZW5lciBoYXMgYmVl
biBzZXR1cCBpbgotICAgICAgICAvLyB0aGUgc2hhZG93IHRyZWUuIElmIHRoYXQgZXZlbnQgbGlz
dGVuZXIgaGFzIG5vdCBiZWVuIHVzZWQgeWV0LCBtX2pzRnVuY3Rpb24gaXMgc3RpbGwgMCwKLSAg
ICAgICAgLy8gYW5kIHRyeVJlbW92ZUV2ZW50TGlzdGVuZXIoKSBhYm92ZSB3aWxsIGZhaWwuIFdv
cmsgYXJvdW5kIHRoYXQgdmVyeSBzZWxkb20gcHJvYmxlbS4KLSAgICAgICAgRXZlbnRUYXJnZXRE
YXRhKiBkYXRhID0gc2hhZG93VHJlZUVsZW1lbnQtPmV2ZW50VGFyZ2V0RGF0YSgpOwotICAgICAg
ICBBU1NFUlQoZGF0YSk7Ci0KLSAgICAgICAgZGF0YS0+ZXZlbnRMaXN0ZW5lck1hcC5yZW1vdmVG
aXJzdEV2ZW50TGlzdGVuZXJDcmVhdGVkRnJvbU1hcmt1cChldmVudFR5cGUpOwotICAgIH0KLQot
ICAgIHJldHVybiB0cnVlOwotI2VuZGlmCi19Ci0KIEV2ZW50VGFyZ2V0RGF0YSogTm9kZTo6ZXZl
bnRUYXJnZXREYXRhKCkKIHsKICAgICByZXR1cm4gaGFzUmFyZURhdGEoKSA/IHJhcmVEYXRhKCkt
PmV2ZW50VGFyZ2V0RGF0YSgpIDogMDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL05vZGUuaAkocmV2aXNpb24gOTY1NzUp
CisrKyBTb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xOTYsMTIg
KzE5Niw3IEBAIHB1YmxpYzoKICAgICBib29sIGlzVGV4dE5vZGUoKSBjb25zdCB7IHJldHVybiBn
ZXRGbGFnKElzVGV4dEZsYWcpOyB9CiAKICAgICBib29sIGlzSFRNTEVsZW1lbnQoKSBjb25zdCB7
IHJldHVybiBnZXRGbGFnKElzSFRNTEZsYWcpOyB9Ci0KICAgICBib29sIGlzU1ZHRWxlbWVudCgp
IGNvbnN0IHsgcmV0dXJuIGdldEZsYWcoSXNTVkdGbGFnKTsgfQotICAgIHZpcnR1YWwgYm9vbCBp
c1NWR1NoYWRvd1Jvb3QoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotI2lmIEVOQUJMRShTVkcp
Ci0gICAgU1ZHVXNlRWxlbWVudCogc3ZnU2hhZG93SG9zdCgpIGNvbnN0OwotI2VuZGlmCiAKICAg
ICB2aXJ0dWFsIGJvb2wgaXNNZWRpYUNvbnRyb2xFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gZmFs
c2U7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNNZWRpYUNvbnRyb2xzKCkgY29uc3QgeyByZXR1cm4g
ZmFsc2U7IH0KQEAgLTIyNCw3ICsyMTksNyBAQCBwdWJsaWM6CiAgICAgLy8gTm9kZSdzIHBhcmVu
dCwgc2hhZG93IHRyZWUgaG9zdCwgb3IgU1ZHIHVzZS4KICAgICBDb250YWluZXJOb2RlKiBwYXJl
bnRPckhvc3ROb2RlKCkgY29uc3Q7CiAgICAgRWxlbWVudCogcGFyZW50T3JIb3N0RWxlbWVudCgp
IGNvbnN0OwotICAgIC8vIFVzZSB3aGVuIGl0J3MgZ3VhcmFudGVlZCB0byB0aGF0IHNoYWRvd0hv
c3QgaXMgMCBhbmQgc3ZnU2hhZG93SG9zdCBpcyAwLgorICAgIC8vIFVzZSB3aGVuIGl0J3MgZ3Vh
cmFudGVlZCB0byB0aGF0IHNoYWRvd0hvc3QgaXMgMC4KICAgICBDb250YWluZXJOb2RlKiBwYXJl
bnROb2RlR3VhcmFudGVlZEhvc3RGcmVlKCkgY29uc3Q7CiAgICAgLy8gUmV0dXJucyB0aGUgcGFy
ZW50IG5vZGUsIGJ1dCAwIGlmIHRoZSBwYXJlbnQgbm9kZSBpcyBhIFNoYWRvd1Jvb3QuCiAgICAg
Q29udGFpbmVyTm9kZSogbm9uU2hhZG93Qm91bmRhcnlQYXJlbnROb2RlKCkgY29uc3Q7CkBAIC03
NDMsNyArNzM4LDcgQEAgaW5saW5lIHZvaWQgYWRkU3VicmVzb3VyY2VVUkwoTGlzdEhhc2hTZQog
CiBpbmxpbmUgQ29udGFpbmVyTm9kZSogTm9kZTo6cGFyZW50Tm9kZSgpIGNvbnN0CiB7Ci0gICAg
cmV0dXJuIGdldEZsYWcoSXNTaGFkb3dSb290RmxhZykgfHwgaXNTVkdTaGFkb3dSb290KCkgPyAw
IDogcGFyZW50KCk7CisgICAgcmV0dXJuIGdldEZsYWcoSXNTaGFkb3dSb290RmxhZykgPyAwIDog
cGFyZW50KCk7CiB9CiAKIGlubGluZSBDb250YWluZXJOb2RlKiBOb2RlOjpwYXJlbnRPckhvc3RO
b2RlKCkgY29uc3QKQEAgLTc1Myw3ICs3NDgsNyBAQCBpbmxpbmUgQ29udGFpbmVyTm9kZSogTm9k
ZTo6cGFyZW50T3JIb3N0CiAKIGlubGluZSBDb250YWluZXJOb2RlKiBOb2RlOjpwYXJlbnROb2Rl
R3VhcmFudGVlZEhvc3RGcmVlKCkgY29uc3QKIHsKLSAgICBBU1NFUlQoIWdldEZsYWcoSXNTaGFk
b3dSb290RmxhZykgJiYgIWlzU1ZHU2hhZG93Um9vdCgpKTsKKyAgICBBU1NFUlQoIWdldEZsYWco
SXNTaGFkb3dSb290RmxhZykpOwogICAgIHJldHVybiBwYXJlbnRPckhvc3ROb2RlKCk7CiB9CiAK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9SYW5nZS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvZG9tL1JhbmdlLmNwcAkocmV2aXNpb24gOTY1NzUpCisrKyBTb3VyY2UvV2ViQ29y
ZS9kb20vUmFuZ2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjc2LDggKzEyNzYsNiBAQCB2b2lk
IFJhbmdlOjpjaGVja05vZGVCQShOb2RlKiBuLCBFeGNlcHRpCiAgICAgICAgIGNhc2UgTm9kZTo6
UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgogICAgICAgICBjYXNlIE5vZGU6OlRFWFRfTk9E
RToKICAgICAgICAgY2FzZSBOb2RlOjpYUEFUSF9OQU1FU1BBQ0VfTk9ERToKLSAgICAgICAgICAg
IGlmIChyb290LT5pc1NWR1NoYWRvd1Jvb3QoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKICAg
ICAgICAgICAgIGVjID0gUmFuZ2VFeGNlcHRpb246OklOVkFMSURfTk9ERV9UWVBFX0VSUjsKICAg
ICAgICAgICAgIHJldHVybjsKICAgICB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vU2NyaXB0
RWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL1NjcmlwdEVsZW1l
bnQuY3BwCShyZXZpc2lvbiA5NjU3NSkKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9TY3JpcHRFbGVt
ZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjA2LDEzICsyMDYsOCBAQCBib29sIFNjcmlwdEVs
ZW1lbnQ6OnByZXBhcmVTY3JpcHQoY29uc3QgCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAg
IE5vZGUqIGFuY2VzdG9yID0gbV9lbGVtZW50LT5wYXJlbnROb2RlKCk7Ci0gICAgd2hpbGUgKGFu
Y2VzdG9yKSB7Ci0gICAgICAgIGlmIChhbmNlc3Rvci0+aXNTVkdTaGFkb3dSb290KCkpIHsKLSAg
ICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWJvcnRlZCBzY3JpcHQ6IHNoYWRvdyByb290XG4i
KTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgIHdoaWxlIChhbmNl
c3RvcikKICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci0+cGFyZW50Tm9kZSgpOwotICAgIH0K
IAogICAgIGlmICghaXNTY3JpcHRGb3JFdmVudFN1cHBvcnRlZCgpKQogICAgICAgICByZXR1cm4g
ZmFsc2U7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL0V2ZW50SGFuZGxlci5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGFnZS9FdmVudEhhbmRsZXIuY3BwCShyZXZpc2lvbiA5
NjU3NSkKKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvRXZlbnRIYW5kbGVyLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgIkRyYWdDb250cm9sbGVyLmgiCiAjaW5j
bHVkZSAiRHJhZ1N0YXRlLmgiCiAjaW5jbHVkZSAiRWRpdG9yLmgiCisjaW5jbHVkZSAiRXZlbnRE
aXNwYXRjaGVyLmgiCiAjaW5jbHVkZSAiRXZlbnROYW1lcy5oIgogI2luY2x1ZGUgIkV2ZW50UXVl
dWUuaCIKICNpbmNsdWRlICJGbG9hdFBvaW50LmgiCkBAIC04OSw5ICs5MCw3IEBACiAKICNpZiBF
TkFCTEUoU1ZHKQogI2luY2x1ZGUgIlNWR0RvY3VtZW50LmgiCi0jaW5jbHVkZSAiU1ZHRWxlbWVu
dEluc3RhbmNlLmgiCiAjaW5jbHVkZSAiU1ZHTmFtZXMuaCIKLSNpbmNsdWRlICJTVkdVc2VFbGVt
ZW50LmgiCiAjZW5kaWYKIAogI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCkBAIC0yNDIsMjMgKzI0
MSwxOSBAQCB2b2lkIEV2ZW50SGFuZGxlcjo6Y2xlYXIoKQogICAgIG1faG92ZXJUaW1lci5zdG9w
KCk7CiAgICAgbV9mYWtlTW91c2VNb3ZlRXZlbnRUaW1lci5zdG9wKCk7CiAgICAgbV9yZXNpemVM
YXllciA9IDA7Ci0gICAgbV9ub2RlVW5kZXJNb3VzZSA9IDA7Ci0gICAgbV9sYXN0Tm9kZVVuZGVy
TW91c2UgPSAwOwotI2lmIEVOQUJMRShTVkcpCi0gICAgbV9pbnN0YW5jZVVuZGVyTW91c2UgPSAw
OwotICAgIG1fbGFzdEluc3RhbmNlVW5kZXJNb3VzZSA9IDA7Ci0jZW5kaWYKKyAgICBtX3Rhcmdl
dFVuZGVyTW91c2UgPSAwOworICAgIG1fbGFzdFRhcmdldFVuZGVyTW91c2UgPSAwOwogICAgIG1f
bGFzdE1vdXNlTW92ZUV2ZW50U3ViZnJhbWUgPSAwOwogICAgIG1fbGFzdFNjcm9sbGJhclVuZGVy
TW91c2UgPSAwOwogICAgIG1fY2xpY2tDb3VudCA9IDA7Ci0gICAgbV9jbGlja05vZGUgPSAwOwor
ICAgIG1fY2xpY2tUYXJnZXQgPSAwOwogICAgIG1fZnJhbWVTZXRCZWluZ1Jlc2l6ZWQgPSAwOwog
I2lmIEVOQUJMRShEUkFHX1NVUFBPUlQpCiAgICAgbV9kcmFnVGFyZ2V0ID0gMDsKICAgICBtX3No
b3VsZE9ubHlGaXJlRHJhZ092ZXJFdmVudCA9IGZhbHNlOwogI2VuZGlmCiAgICAgbV9jdXJyZW50
TW91c2VQb3NpdGlvbiA9IExheW91dFBvaW50KCk7Ci0gICAgbV9tb3VzZVByZXNzTm9kZSA9IDA7
CisgICAgbV9tb3VzZVByZXNzVGFyZ2V0ID0gMDsKICAgICBtX21vdXNlUHJlc3NlZCA9IGZhbHNl
OwogICAgIG1fY2FwdHVyZXNEcmFnZ2luZyA9IGZhbHNlOwogICAgIG1fY2FwdHVyaW5nTW91c2VF
dmVudHNOb2RlID0gMDsKQEAgLTI3MSw4ICsyNjYsMTAgQEAgdm9pZCBFdmVudEhhbmRsZXI6OmNs
ZWFyKCkKIAogdm9pZCBFdmVudEhhbmRsZXI6Om5vZGVXaWxsQmVSZW1vdmVkKE5vZGUqIG5vZGVU
b0JlUmVtb3ZlZCkKIHsKLSAgICBpZiAobm9kZVRvQmVSZW1vdmVkLT5jb250YWlucyhtX2NsaWNr
Tm9kZS5nZXQoKSkpCi0gICAgICAgIG1fY2xpY2tOb2RlID0gMDsKKyAgICBpZiAoIW1fY2xpY2tU
YXJnZXQpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAobm9kZVRvQmVSZW1vdmVkLT5jb250YWlu
cyhtX2NsaWNrVGFyZ2V0LT50b05vZGUoKSkpCisgICAgICAgIG1fY2xpY2tUYXJnZXQgPSAwOwog
fQogCiBzdGF0aWMgdm9pZCBzZXRTZWxlY3Rpb25JZk5lZWRlZChGcmFtZVNlbGVjdGlvbiogc2Vs
ZWN0aW9uLCBjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiBuZXdTZWxlY3Rpb24pCkBAIC0yODIsMTcg
KzI3OSwxOCBAQCBzdGF0aWMgdm9pZCBzZXRTZWxlY3Rpb25JZk5lZWRlZChGcmFtZVNlCiAgICAg
ICAgIHNlbGVjdGlvbi0+c2V0U2VsZWN0aW9uKG5ld1NlbGVjdGlvbik7CiB9CiAKLXN0YXRpYyBp
bmxpbmUgYm9vbCBkaXNwYXRjaFNlbGVjdFN0YXJ0KE5vZGUqIG5vZGUpCitzdGF0aWMgaW5saW5l
IGJvb2wgZGlzcGF0Y2hTZWxlY3RTdGFydChFdmVudFRhcmdldCogdGFyZ2V0KQogeworICAgIE5v
ZGUqIG5vZGUgPSB0YXJnZXQtPnRvTm9kZSgpOwogICAgIGlmICghbm9kZSB8fCAhbm9kZS0+cmVu
ZGVyZXIoKSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICByZXR1cm4gbm9kZS0+ZGlzcGF0
Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS5zZWxlY3RzdGFydEV2ZW50LCB0cnVl
LCB0cnVlKSk7CisgICAgcmV0dXJuIHRhcmdldC0+ZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRl
KGV2ZW50TmFtZXMoKS5zZWxlY3RzdGFydEV2ZW50LCB0cnVlLCB0cnVlKSk7CiB9CiAKLWJvb2wg
RXZlbnRIYW5kbGVyOjp1cGRhdGVTZWxlY3Rpb25Gb3JNb3VzZURvd25EaXNwYXRjaGluZ1NlbGVj
dFN0YXJ0KE5vZGUqIHRhcmdldE5vZGUsIGNvbnN0IFZpc2libGVTZWxlY3Rpb24mIG5ld1NlbGVj
dGlvbiwgVGV4dEdyYW51bGFyaXR5IGdyYW51bGFyaXR5KQorYm9vbCBFdmVudEhhbmRsZXI6OnVw
ZGF0ZVNlbGVjdGlvbkZvck1vdXNlRG93bkRpc3BhdGNoaW5nU2VsZWN0U3RhcnQoRXZlbnRUYXJn
ZXQqIHRhcmdldCwgY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYgbmV3U2VsZWN0aW9uLCBUZXh0R3Jh
bnVsYXJpdHkgZ3JhbnVsYXJpdHkpCiB7Ci0gICAgaWYgKCFkaXNwYXRjaFNlbGVjdFN0YXJ0KHRh
cmdldE5vZGUpKQorICAgIGlmICghZGlzcGF0Y2hTZWxlY3RTdGFydCh0YXJnZXQpKQogICAgICAg
ICByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAobmV3U2VsZWN0aW9uLmlzUmFuZ2UoKSkKQEAgLTMw
OSw3ICszMDcsOCBAQCBib29sIEV2ZW50SGFuZGxlcjo6dXBkYXRlU2VsZWN0aW9uRm9yTW91CiAK
IHZvaWQgRXZlbnRIYW5kbGVyOjpzZWxlY3RDbG9zZXN0V29yZEZyb21Nb3VzZUV2ZW50KGNvbnN0
IE1vdXNlRXZlbnRXaXRoSGl0VGVzdFJlc3VsdHMmIHJlc3VsdCkKIHsKLSAgICBOb2RlKiBpbm5l
ck5vZGUgPSB0YXJnZXROb2RlKHJlc3VsdCk7CisgICAgRXZlbnRUYXJnZXQqIGV2ZW50VGFyZ2V0
ID0gZXZlbnRUYXJnZXRGcm9tSGl0VGVzdFJlc3VsdHMocmVzdWx0KTsKKyAgICBOb2RlKiBpbm5l
ck5vZGUgPSBldmVudFRhcmdldCA/IGV2ZW50VGFyZ2V0LT50b05vZGUoKSA6IDA7CiAgICAgVmlz
aWJsZVNlbGVjdGlvbiBuZXdTZWxlY3Rpb247CiAKICAgICBpZiAoaW5uZXJOb2RlICYmIGlubmVy
Tm9kZS0+cmVuZGVyZXIoKSAmJiBtX21vdXNlRG93bk1heVN0YXJ0U2VsZWN0KSB7CkBAIC0zMjIs
NyArMzIxLDcgQEAgdm9pZCBFdmVudEhhbmRsZXI6OnNlbGVjdENsb3Nlc3RXb3JkRnJvbQogICAg
ICAgICBpZiAobmV3U2VsZWN0aW9uLmlzUmFuZ2UoKSAmJiByZXN1bHQuZXZlbnQoKS5jbGlja0Nv
dW50KCkgPT0gMiAmJiBtX2ZyYW1lLT5lZGl0b3IoKS0+aXNTZWxlY3RUcmFpbGluZ1doaXRlc3Bh
Y2VFbmFibGVkKCkpIAogICAgICAgICAgICAgbmV3U2VsZWN0aW9uLmFwcGVuZFRyYWlsaW5nV2hp
dGVzcGFjZSgpOwogCi0gICAgICAgIHVwZGF0ZVNlbGVjdGlvbkZvck1vdXNlRG93bkRpc3BhdGNo
aW5nU2VsZWN0U3RhcnQoaW5uZXJOb2RlLCBuZXdTZWxlY3Rpb24sIFdvcmRHcmFudWxhcml0eSk7
CisgICAgICAgIHVwZGF0ZVNlbGVjdGlvbkZvck1vdXNlRG93bkRpc3BhdGNoaW5nU2VsZWN0U3Rh
cnQoZXZlbnRUYXJnZXQsIG5ld1NlbGVjdGlvbiwgV29yZEdyYW51bGFyaXR5KTsKICAgICB9CiB9
CiAKQEAgLTMzMSw3ICszMzAsOCBAQCB2b2lkIEV2ZW50SGFuZGxlcjo6c2VsZWN0Q2xvc2VzdFdv
cmRPckxpCiAgICAgaWYgKCFyZXN1bHQuaGl0VGVzdFJlc3VsdCgpLmlzTGl2ZUxpbmsoKSkKICAg
ICAgICAgcmV0dXJuIHNlbGVjdENsb3Nlc3RXb3JkRnJvbU1vdXNlRXZlbnQocmVzdWx0KTsKIAot
ICAgIE5vZGUqIGlubmVyTm9kZSA9IHRhcmdldE5vZGUocmVzdWx0KTsKKyAgICBFdmVudFRhcmdl
dCogZXZlbnRUYXJnZXQgPSBldmVudFRhcmdldEZyb21IaXRUZXN0UmVzdWx0cyhyZXN1bHQpOwor
ICAgIE5vZGUqIGlubmVyTm9kZSA9IGV2ZW50VGFyZ2V0ID8gZXZlbnRUYXJnZXQtPnRvTm9kZSgp
IDogMDsKIAogICAgIGlmIChpbm5lck5vZGUgJiYgaW5uZXJOb2RlLT5yZW5kZXJlcigpICYmIG1f
bW91c2VEb3duTWF5U3RhcnRTZWxlY3QpIHsKICAgICAgICAgVmlzaWJsZVNlbGVjdGlvbiBuZXdT
ZWxlY3Rpb247CkBAIC0zNDAsNyArMzQwLDcgQEAgdm9pZCBFdmVudEhhbmRsZXI6OnNlbGVjdENs
b3Nlc3RXb3JkT3JMaQogICAgICAgICBpZiAocG9zLmlzTm90TnVsbCgpICYmIHBvcy5kZWVwRXF1
aXZhbGVudCgpLmRlcHJlY2F0ZWROb2RlKCktPmlzRGVzY2VuZGFudE9mKFVSTEVsZW1lbnQpKQog
ICAgICAgICAgICAgbmV3U2VsZWN0aW9uID0gVmlzaWJsZVNlbGVjdGlvbjo6c2VsZWN0aW9uRnJv
bUNvbnRlbnRzT2ZOb2RlKFVSTEVsZW1lbnQpOwogCi0gICAgICAgIHVwZGF0ZVNlbGVjdGlvbkZv
ck1vdXNlRG93bkRpc3BhdGNoaW5nU2VsZWN0U3RhcnQoaW5uZXJOb2RlLCBuZXdTZWxlY3Rpb24s
IFdvcmRHcmFudWxhcml0eSk7CisgICAgICAgIHVwZGF0ZVNlbGVjdGlvbkZvck1vdXNlRG93bkRp
c3BhdGNoaW5nU2VsZWN0U3RhcnQoZXZlbnRUYXJnZXQsIG5ld1NlbGVjdGlvbiwgV29yZEdyYW51
bGFyaXR5KTsKICAgICB9CiB9CiAKQEAgLTM2Niw4ICszNjYsOSBAQCBib29sIEV2ZW50SGFuZGxl
cjo6aGFuZGxlTW91c2VQcmVzc0V2ZW50CiB7CiAgICAgaWYgKGV2ZW50LmV2ZW50KCkuYnV0dG9u
KCkgIT0gTGVmdEJ1dHRvbikKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIE5vZGUq
IGlubmVyTm9kZSA9IHRhcmdldE5vZGUoZXZlbnQpOworCisgICAgRXZlbnRUYXJnZXQqIGV2ZW50
VGFyZ2V0ID0gZXZlbnRUYXJnZXRGcm9tSGl0VGVzdFJlc3VsdHMoZXZlbnQpOworICAgIE5vZGUq
IGlubmVyTm9kZSA9IGV2ZW50VGFyZ2V0ID8gZXZlbnRUYXJnZXQtPnRvTm9kZSgpIDogMDsKICAg
ICBpZiAoIShpbm5lck5vZGUgJiYgaW5uZXJOb2RlLT5yZW5kZXJlcigpICYmIG1fbW91c2VEb3du
TWF5U3RhcnRTZWxlY3QpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTM3OCw3ICszNzks
NyBAQCBib29sIEV2ZW50SGFuZGxlcjo6aGFuZGxlTW91c2VQcmVzc0V2ZW50CiAgICAgICAgIG5l
d1NlbGVjdGlvbi5leHBhbmRVc2luZ0dyYW51bGFyaXR5KFBhcmFncmFwaEdyYW51bGFyaXR5KTsK
ICAgICB9CiAKLSAgICByZXR1cm4gdXBkYXRlU2VsZWN0aW9uRm9yTW91c2VEb3duRGlzcGF0Y2hp
bmdTZWxlY3RTdGFydChpbm5lck5vZGUsIG5ld1NlbGVjdGlvbiwgUGFyYWdyYXBoR3JhbnVsYXJp
dHkpOworICAgIHJldHVybiB1cGRhdGVTZWxlY3Rpb25Gb3JNb3VzZURvd25EaXNwYXRjaGluZ1Nl
bGVjdFN0YXJ0KGV2ZW50VGFyZ2V0LCBuZXdTZWxlY3Rpb24sIFBhcmFncmFwaEdyYW51bGFyaXR5
KTsKIH0KIAogc3RhdGljIGludCB0ZXh0RGlzdGFuY2UoY29uc3QgUG9zaXRpb24mIHN0YXJ0LCBj
b25zdCBQb3NpdGlvbiYgZW5kKQpAQCAtMzg5LDcgKzM5MCw4IEBAIHN0YXRpYyBpbnQgdGV4dERp
c3RhbmNlKGNvbnN0IFBvc2l0aW9uJiAKIAogYm9vbCBFdmVudEhhbmRsZXI6OmhhbmRsZU1vdXNl
UHJlc3NFdmVudFNpbmdsZUNsaWNrKGNvbnN0IE1vdXNlRXZlbnRXaXRoSGl0VGVzdFJlc3VsdHMm
IGV2ZW50KQogewotICAgIE5vZGUqIGlubmVyTm9kZSA9IHRhcmdldE5vZGUoZXZlbnQpOworICAg
IEV2ZW50VGFyZ2V0KiBldmVudFRhcmdldCA9IGV2ZW50VGFyZ2V0RnJvbUhpdFRlc3RSZXN1bHRz
KGV2ZW50KTsKKyAgICBOb2RlKiBpbm5lck5vZGUgPSBldmVudFRhcmdldCA/IGV2ZW50VGFyZ2V0
LT50b05vZGUoKSA6IDA7CiAgICAgaWYgKCEoaW5uZXJOb2RlICYmIGlubmVyTm9kZS0+cmVuZGVy
ZXIoKSAmJiBtX21vdXNlRG93bk1heVN0YXJ0U2VsZWN0KSkKICAgICAgICAgcmV0dXJuIGZhbHNl
OwogCkBAIC00MzcsMTEgKzQzOSwxMiBAQCBib29sIEV2ZW50SGFuZGxlcjo6aGFuZGxlTW91c2VQ
cmVzc0V2ZW50CiAgICAgfSBlbHNlCiAgICAgICAgIG5ld1NlbGVjdGlvbiA9IFZpc2libGVTZWxl
Y3Rpb24odmlzaWJsZVBvcyk7CiAgICAgCi0gICAgcmV0dXJuIHVwZGF0ZVNlbGVjdGlvbkZvck1v
dXNlRG93bkRpc3BhdGNoaW5nU2VsZWN0U3RhcnQoaW5uZXJOb2RlLCBuZXdTZWxlY3Rpb24sIGdy
YW51bGFyaXR5KTsKKyAgICByZXR1cm4gdXBkYXRlU2VsZWN0aW9uRm9yTW91c2VEb3duRGlzcGF0
Y2hpbmdTZWxlY3RTdGFydChldmVudFRhcmdldCwgbmV3U2VsZWN0aW9uLCBncmFudWxhcml0eSk7
CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBjYW5Nb3VzZURvd25TdGFydFNlbGVjdChOb2RlKiBu
b2RlKQorc3RhdGljIGlubGluZSBib29sIGNhbk1vdXNlRG93blN0YXJ0U2VsZWN0KEV2ZW50VGFy
Z2V0KiB0YXJnZXQpCiB7CisgICAgTm9kZSogbm9kZSA9IHRhcmdldC0+dG9Ob2RlKCk7CiAgICAg
aWYgKCFub2RlIHx8ICFub2RlLT5yZW5kZXJlcigpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIApA
QCAtNDY3LDkgKzQ3MCwxMSBAQCBib29sIEV2ZW50SGFuZGxlcjo6aGFuZGxlTW91c2VQcmVzc0V2
ZW50CiAKICAgICBib29sIHNpbmdsZUNsaWNrID0gZXZlbnQuZXZlbnQoKS5jbGlja0NvdW50KCkg
PD0gMTsKIAorICAgIEV2ZW50VGFyZ2V0KiBldmVudFRhcmdldCA9IGV2ZW50VGFyZ2V0RnJvbUhp
dFRlc3RSZXN1bHRzKGV2ZW50KTsKKwogICAgIC8vIElmIHdlIGdvdCB0aGUgZXZlbnQgYmFjaywg
dGhhdCBtdXN0IG1lYW4gaXQgd2Fzbid0IHByZXZlbnRlZCwKICAgICAvLyBzbyBpdCdzIGFsbG93
ZWQgdG8gc3RhcnQgYSBkcmFnIG9yIHNlbGVjdGlvbi4KLSAgICBtX21vdXNlRG93bk1heVN0YXJ0
U2VsZWN0ID0gY2FuTW91c2VEb3duU3RhcnRTZWxlY3QodGFyZ2V0Tm9kZShldmVudCkpOworICAg
IG1fbW91c2VEb3duTWF5U3RhcnRTZWxlY3QgPSBjYW5Nb3VzZURvd25TdGFydFNlbGVjdChldmVu
dFRhcmdldCk7CiAgICAgCiAjaWYgRU5BQkxFKERSQUdfU1VQUE9SVCkKICAgICAvLyBDYXJlZnVs
IHRoYXQgdGhlIGRyYWcgc3RhcnRpbmcgbG9naWMgc3RheXMgaW4gc3luYyB3aXRoIGV2ZW50TWF5
U3RhcnREcmFnKCkKQEAgLTQ5OSw5ICs1MDQsNyBAQCBib29sIEV2ZW50SGFuZGxlcjo6aGFuZGxl
TW91c2VQcmVzc0V2ZW50CiAgICAgaWYgKHNpbmdsZUNsaWNrKQogICAgICAgICBmb2N1c0RvY3Vt
ZW50VmlldygpOwogCi0gICAgTm9kZSogaW5uZXJOb2RlID0gdGFyZ2V0Tm9kZShldmVudCk7Ci0K
LSAgICBtX21vdXNlUHJlc3NOb2RlID0gaW5uZXJOb2RlOworICAgIG1fbW91c2VQcmVzc1Rhcmdl
dCA9IGV2ZW50VGFyZ2V0OwogI2lmIEVOQUJMRShEUkFHX1NVUFBPUlQpCiAgICAgbV9kcmFnU3Rh
cnRQb3MgPSBldmVudC5ldmVudCgpLnBvcygpOwogI2VuZGlmCkBAIC01MTcsOCArNTIwLDkgQEAg
Ym9vbCBFdmVudEhhbmRsZXI6OmhhbmRsZU1vdXNlUHJlc3NFdmVudAogICAgIGVsc2UKICAgICAg
ICAgc3dhbGxvd0V2ZW50ID0gaGFuZGxlTW91c2VQcmVzc0V2ZW50U2luZ2xlQ2xpY2soZXZlbnQp
OwogICAgIAorICAgIE5vZGUqIG1vdXNlUHJlc3NOb2RlID0gbV9tb3VzZVByZXNzVGFyZ2V0ID8g
bV9tb3VzZVByZXNzVGFyZ2V0LT50b05vZGUoKSA6IDA7CiAgICAgbV9tb3VzZURvd25NYXlTdGFy
dEF1dG9zY3JvbGwgPSBtX21vdXNlRG93bk1heVN0YXJ0U2VsZWN0Ci0gICAgICAgIHx8IChtX21v
dXNlUHJlc3NOb2RlICYmIG1fbW91c2VQcmVzc05vZGUtPnJlbmRlckJveCgpICYmIG1fbW91c2VQ
cmVzc05vZGUtPnJlbmRlckJveCgpLT5jYW5CZVByb2dyYW1hdGljYWxseVNjcm9sbGVkKCkpOwor
ICAgICAgICB8fCAobW91c2VQcmVzc05vZGUgJiYgbW91c2VQcmVzc05vZGUtPnJlbmRlckJveCgp
ICYmIG1vdXNlUHJlc3NOb2RlLT5yZW5kZXJCb3goKS0+Y2FuQmVQcm9ncmFtYXRpY2FsbHlTY3Jv
bGxlZCgpKTsKIAogICAgIHJldHVybiBzd2FsbG93RXZlbnQ7CiB9CkBAIC01NTYsNyArNTYwLDgg
QEAgYm9vbCBFdmVudEhhbmRsZXI6OmhhbmRsZU1vdXNlRHJhZ2dlZEV2ZQogICAgIGlmICghbV9t
b3VzZVByZXNzZWQpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIE5vZGUqIHRhcmdldE5v
ZGUgPSBFdmVudEhhbmRsZXI6OnRhcmdldE5vZGUoZXZlbnQpOworICAgIEV2ZW50VGFyZ2V0KiBl
dmVudFRhcmdldCA9IGV2ZW50VGFyZ2V0RnJvbUhpdFRlc3RSZXN1bHRzKGV2ZW50KTsKKyAgICBO
b2RlKiB0YXJnZXROb2RlID0gZXZlbnRUYXJnZXQgPyBldmVudFRhcmdldC0+dG9Ob2RlKCkgOiAw
OwogICAgIGlmIChldmVudC5ldmVudCgpLmJ1dHRvbigpICE9IExlZnRCdXR0b24gfHwgIXRhcmdl
dE5vZGUgfHwgIXRhcmdldE5vZGUtPnJlbmRlcmVyKCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsK
IApAQCAtNjY4LDExICs2NzMsMTIgQEAgdm9pZCBFdmVudEhhbmRsZXI6OnVwZGF0ZVNlbGVjdGlv
bkZvck1vdQogICAgIGlmICghbV9tb3VzZURvd25NYXlTdGFydFNlbGVjdCkKICAgICAgICAgcmV0
dXJuOwogCi0gICAgTm9kZSogdGFyZ2V0ID0gdGFyZ2V0Tm9kZShoaXRUZXN0UmVzdWx0KTsKLSAg
ICBpZiAoIXRhcmdldCkKKyAgICBFdmVudFRhcmdldCogZXZlbnRUYXJnZXQgPSBldmVudFRhcmdl
dEZyb21IaXRUZXN0UmVzdWx0KGhpdFRlc3RSZXN1bHQpOworICAgIE5vZGUqIGlubmVyTm9kZSA9
IGV2ZW50VGFyZ2V0ID8gZXZlbnRUYXJnZXQtPnRvTm9kZSgpIDogMDsKKyAgICBpZiAoIWlubmVy
Tm9kZSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgVmlzaWJsZVBvc2l0aW9uIHRhcmdldFBvc2l0
aW9uID0gc2VsZWN0aW9uRXh0ZW50UmVzcGVjdGluZ0VkaXRpbmdCb3VuZGFyeShtX2ZyYW1lLT5z
ZWxlY3Rpb24oKS0+c2VsZWN0aW9uKCksIGhpdFRlc3RSZXN1bHQubG9jYWxQb2ludCgpLCB0YXJn
ZXQpOworICAgIFZpc2libGVQb3NpdGlvbiB0YXJnZXRQb3NpdGlvbiA9IHNlbGVjdGlvbkV4dGVu
dFJlc3BlY3RpbmdFZGl0aW5nQm91bmRhcnkobV9mcmFtZS0+c2VsZWN0aW9uKCktPnNlbGVjdGlv
bigpLCBoaXRUZXN0UmVzdWx0LmxvY2FsUG9pbnQoKSwgaW5uZXJOb2RlKTsKIAogICAgIC8vIERv
bid0IG1vZGlmeSB0aGUgc2VsZWN0aW9uIGlmIHdlJ3JlIG5vdCBvbiBhIG5vZGUuCiAgICAgaWYg
KHRhcmdldFBvc2l0aW9uLmlzTnVsbCgpKQpAQCAtNjg4LDExICs2OTQsMTEgQEAgdm9pZCBFdmVu
dEhhbmRsZXI6OnVwZGF0ZVNlbGVjdGlvbkZvck1vdQogICAgIGlmIChOb2RlKiBzZWxlY3Rpb25C
YXNlTm9kZSA9IG5ld1NlbGVjdGlvbi5iYXNlKCkuZGVwcmVjYXRlZE5vZGUoKSkKICAgICAgICAg
aWYgKFJlbmRlck9iamVjdCogc2VsZWN0aW9uQmFzZVJlbmRlcmVyID0gc2VsZWN0aW9uQmFzZU5v
ZGUtPnJlbmRlcmVyKCkpCiAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uQmFzZVJlbmRlcmVyLT5p
c1NWR1RleHQoKSkKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LT5yZW5kZXJlcigpLT5jb250
YWluaW5nQmxvY2soKSAhPSBzZWxlY3Rpb25CYXNlUmVuZGVyZXItPmNvbnRhaW5pbmdCbG9jaygp
KQorICAgICAgICAgICAgICAgIGlmIChpbm5lck5vZGUtPnJlbmRlcmVyKCktPmNvbnRhaW5pbmdC
bG9jaygpICE9IHNlbGVjdGlvbkJhc2VSZW5kZXJlci0+Y29udGFpbmluZ0Jsb2NrKCkpCiAgICAg
ICAgICAgICAgICAgICAgIHJldHVybjsKICNlbmRpZgogCi0gICAgaWYgKG1fc2VsZWN0aW9uSW5p
dGlhdGlvblN0YXRlID09IEhhdmVOb3RTdGFydGVkU2VsZWN0aW9uICYmICFkaXNwYXRjaFNlbGVj
dFN0YXJ0KHRhcmdldCkpCisgICAgaWYgKG1fc2VsZWN0aW9uSW5pdGlhdGlvblN0YXRlID09IEhh
dmVOb3RTdGFydGVkU2VsZWN0aW9uICYmICFkaXNwYXRjaFNlbGVjdFN0YXJ0KGV2ZW50VGFyZ2V0
KSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgaWYgKG1fc2VsZWN0aW9uSW5pdGlhdGlvblN0YXRl
ICE9IEV4dGVuZGVkU2VsZWN0aW9uKSB7CkBAIC03NjEsNyArNzY3LDkgQEAgYm9vbCBFdmVudEhh
bmRsZXI6OmhhbmRsZU1vdXNlUmVsZWFzZUV2ZQogICAgICAgICAgICAgJiYgbV9mcmFtZS0+c2Vs
ZWN0aW9uKCktPmlzUmFuZ2UoKQogICAgICAgICAgICAgJiYgZXZlbnQuZXZlbnQoKS5idXR0b24o
KSAhPSBSaWdodEJ1dHRvbikgewogICAgICAgICBWaXNpYmxlU2VsZWN0aW9uIG5ld1NlbGVjdGlv
bjsKLSAgICAgICAgTm9kZSogbm9kZSA9IHRhcmdldE5vZGUoZXZlbnQpOworCisgICAgICAgIEV2
ZW50VGFyZ2V0KiBldmVudFRhcmdldCA9IGV2ZW50VGFyZ2V0RnJvbUhpdFRlc3RSZXN1bHRzKGV2
ZW50KTsKKyAgICAgICAgTm9kZSogbm9kZSA9IGV2ZW50VGFyZ2V0ID8gZXZlbnRUYXJnZXQtPnRv
Tm9kZSgpIDogMDsKICAgICAgICAgYm9vbCBjYXJldEJyb3dzaW5nID0gbV9mcmFtZS0+c2V0dGlu
Z3MoKS0+Y2FyZXRCcm93c2luZ0VuYWJsZWQoKTsKICAgICAgICAgaWYgKG5vZGUgJiYgKGNhcmV0
QnJvd3NpbmcgfHwgbm9kZS0+cmVuZGVyZXJJc0VkaXRhYmxlKCkpICYmIG5vZGUtPnJlbmRlcmVy
KCkpIHsKICAgICAgICAgICAgIFZpc2libGVQb3NpdGlvbiBwb3MgPSBub2RlLT5yZW5kZXJlcigp
LT5wb3NpdGlvbkZvclBvaW50KGV2ZW50LmxvY2FsUG9pbnQoKSk7CkBAIC05OTIsNyArMTAwMCw3
IEBAIHZvaWQgRXZlbnRIYW5kbGVyOjpzdG9wQXV0b3Njcm9sbFRpbWVyKGIKIHsKICAgICBpZiAo
bV9hdXRvc2Nyb2xsSW5Qcm9ncmVzcykgewogICAgICAgICBpZiAobV9tb3VzZURvd25XYXNJblN1
YmZyYW1lKSB7Ci0gICAgICAgICAgICBpZiAoRnJhbWUqIHN1YmZyYW1lID0gc3ViZnJhbWVGb3JU
YXJnZXROb2RlKG1fbW91c2VQcmVzc05vZGUuZ2V0KCkpKQorICAgICAgICAgICAgaWYgKEZyYW1l
KiBzdWJmcmFtZSA9IHN1YmZyYW1lRm9yRXZlbnRUYXJnZXQobV9tb3VzZVByZXNzVGFyZ2V0Lmdl
dCgpKSkKICAgICAgICAgICAgICAgICBzdWJmcmFtZS0+ZXZlbnRIYW5kbGVyKCktPnN0b3BBdXRv
c2Nyb2xsVGltZXIocmVuZGVyZXJJc0JlaW5nRGVzdHJveWVkKTsKICAgICAgICAgICAgIHJldHVy
bjsKICAgICAgICAgfQpAQCAtMTAzMCwxMiArMTAzOCwxMiBAQCB2b2lkIEV2ZW50SGFuZGxlcjo6
c3RvcEF1dG9zY3JvbGxUaW1lcihiCiAKIE5vZGUqIEV2ZW50SGFuZGxlcjo6bW91c2VQcmVzc05v
ZGUoKSBjb25zdAogewotICAgIHJldHVybiBtX21vdXNlUHJlc3NOb2RlLmdldCgpOworICAgIHJl
dHVybiBtX21vdXNlUHJlc3NUYXJnZXQgPyBtX21vdXNlUHJlc3NUYXJnZXQtPnRvTm9kZSgpIDog
MDsKIH0KIAogdm9pZCBFdmVudEhhbmRsZXI6OnNldE1vdXNlUHJlc3NOb2RlKFBhc3NSZWZQdHI8
Tm9kZT4gbm9kZSkKIHsKLSAgICBtX21vdXNlUHJlc3NOb2RlID0gbm9kZTsKKyAgICBtX21vdXNl
UHJlc3NUYXJnZXQgPSBub2RlOwogfQogCiBib29sIEV2ZW50SGFuZGxlcjo6c2Nyb2xsT3ZlcmZs
b3coU2Nyb2xsRGlyZWN0aW9uIGRpcmVjdGlvbiwgU2Nyb2xsR3JhbnVsYXJpdHkgZ3JhbnVsYXJp
dHksIE5vZGUqIHN0YXJ0aW5nTm9kZSkKQEAgLTEwNDYsNyArMTA1NCw3IEBAIGJvb2wgRXZlbnRI
YW5kbGVyOjpzY3JvbGxPdmVyZmxvdyhTY3JvbGwKICAgICAgICAgbm9kZSA9IG1fZnJhbWUtPmRv
Y3VtZW50KCktPmZvY3VzZWROb2RlKCk7CiAKICAgICBpZiAoIW5vZGUpCi0gICAgICAgIG5vZGUg
PSBtX21vdXNlUHJlc3NOb2RlLmdldCgpOworICAgICAgICBub2RlID0gbW91c2VQcmVzc05vZGUo
KTsKICAgICAKICAgICBpZiAobm9kZSkgewogICAgICAgICBSZW5kZXJPYmplY3QqIHIgPSBub2Rl
LT5yZW5kZXJlcigpOwpAQCAtMTA2Nyw3ICsxMDc1LDcgQEAgYm9vbCBFdmVudEhhbmRsZXI6Omxv
Z2ljYWxTY3JvbGxPdmVyZmxvdwogICAgICAgICBub2RlID0gbV9mcmFtZS0+ZG9jdW1lbnQoKS0+
Zm9jdXNlZE5vZGUoKTsKIAogICAgIGlmICghbm9kZSkKLSAgICAgICAgbm9kZSA9IG1fbW91c2VQ
cmVzc05vZGUuZ2V0KCk7CisgICAgICAgIG5vZGUgPSBtb3VzZVByZXNzTm9kZSgpOwogICAgIAog
ICAgIGlmIChub2RlKSB7CiAgICAgICAgIFJlbmRlck9iamVjdCogciA9IG5vZGUtPnJlbmRlcmVy
KCk7CkBAIC0xMTM1LDExICsxMTQzLDEyIEBAIEZyYW1lKiBFdmVudEhhbmRsZXI6OnN1YmZyYW1l
Rm9ySGl0VGVzdFIKIHsKICAgICBpZiAoIWhpdFRlc3RSZXN1bHQuaXNPdmVyV2lkZ2V0KCkpCiAg
ICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBzdWJmcmFtZUZvclRhcmdldE5vZGUodGFyZ2V0
Tm9kZShoaXRUZXN0UmVzdWx0KSk7CisgICAgcmV0dXJuIHN1YmZyYW1lRm9yRXZlbnRUYXJnZXQo
ZXZlbnRUYXJnZXRGcm9tSGl0VGVzdFJlc3VsdHMoaGl0VGVzdFJlc3VsdCkpOwogfQogCi1GcmFt
ZSogRXZlbnRIYW5kbGVyOjpzdWJmcmFtZUZvclRhcmdldE5vZGUoTm9kZSogbm9kZSkKK0ZyYW1l
KiBFdmVudEhhbmRsZXI6OnN1YmZyYW1lRm9yRXZlbnRUYXJnZXQoRXZlbnRUYXJnZXQqIHRhcmdl
dCkKIHsKKyAgICBOb2RlKiBub2RlID0gdGFyZ2V0ID8gdGFyZ2V0LT50b05vZGUoKSA6IDA7CiAg
ICAgaWYgKCFub2RlKQogICAgICAgICByZXR1cm4gMDsKIApAQCAtMTE2Niw4ICsxMTc1LDggQEAg
c3RhdGljIGJvb2wgbm9kZUlzTm90QmVpbmdFZGl0ZWQoTm9kZSogbgogfQogCiBPcHRpb25hbEN1
cnNvciBFdmVudEhhbmRsZXI6OnNlbGVjdEN1cnNvcihjb25zdCBNb3VzZUV2ZW50V2l0aEhpdFRl
c3RSZXN1bHRzJiBldmVudCwgU2Nyb2xsYmFyKiBzY3JvbGxiYXIpCi17Ci0gICAgaWYgKG1fcmVz
aXplTGF5ZXIgJiYgbV9yZXNpemVMYXllci0+aW5SZXNpemVNb2RlKCkpCit7ICAgCisJaWYgKG1f
cmVzaXplTGF5ZXIgJiYgbV9yZXNpemVMYXllci0+aW5SZXNpemVNb2RlKCkpCiAgICAgICAgIHJl
dHVybiBOb0N1cnNvckNoYW5nZTsKIAogICAgIFBhZ2UqIHBhZ2UgPSBtX2ZyYW1lLT5wYWdlKCk7
CkBAIC0xMTc2LDcgKzExODUsOCBAQCBPcHRpb25hbEN1cnNvciBFdmVudEhhbmRsZXI6OnNlbGVj
dEN1cnNvCiAgICAgaWYgKHBhZ2UtPm1haW5GcmFtZSgpLT5ldmVudEhhbmRsZXIoKS0+bV9wYW5T
Y3JvbGxJblByb2dyZXNzKQogICAgICAgICByZXR1cm4gTm9DdXJzb3JDaGFuZ2U7CiAKLSAgICBO
b2RlKiBub2RlID0gdGFyZ2V0Tm9kZShldmVudCk7CisJRXZlbnRUYXJnZXQqIGV2ZW50VGFyZ2V0
ID0gZXZlbnRUYXJnZXRGcm9tSGl0VGVzdFJlc3VsdHMoZXZlbnQpOworICAgIE5vZGUqIG5vZGUg
PSBldmVudFRhcmdldCA/IGV2ZW50VGFyZ2V0LT50b05vZGUoKSA6IDA7CiAgICAgUmVuZGVyT2Jq
ZWN0KiByZW5kZXJlciA9IG5vZGUgPyBub2RlLT5yZW5kZXJlcigpIDogMDsKICAgICBSZW5kZXJT
dHlsZSogc3R5bGUgPSByZW5kZXJlciA/IHJlbmRlcmVyLT5zdHlsZSgpIDogMDsKICAgICBib29s
IGhvcml6b250YWxUZXh0ID0gIXN0eWxlIHx8IHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9k
ZSgpOwpAQCAtMTM0MiwxNCArMTM1MiwxOSBAQCBzdGF0aWMgTGF5b3V0UG9pbnQgZG9jdW1lbnRQ
b2ludEZvcldpbmRvCiAgICAgcmV0dXJuIHZpZXcgPyB2aWV3LT53aW5kb3dUb0NvbnRlbnRzKHdp
bmRvd1BvaW50KSA6IHdpbmRvd1BvaW50OwogfQogCi1Ob2RlKiBFdmVudEhhbmRsZXI6OnRhcmdl
dE5vZGUoY29uc3QgTW91c2VFdmVudFdpdGhIaXRUZXN0UmVzdWx0cyYgZXZlbnQpCitFdmVudFRh
cmdldCogRXZlbnRIYW5kbGVyOjpldmVudFRhcmdldEZyb21IaXRUZXN0UmVzdWx0cyhjb25zdCBN
b3VzZUV2ZW50V2l0aEhpdFRlc3RSZXN1bHRzJiBldmVudCkKIHsKLSAgICByZXR1cm4gdGFyZ2V0
Tm9kZShldmVudC5oaXRUZXN0UmVzdWx0KCkpOworICAgIHJldHVybiBldmVudFRhcmdldEZyb21I
aXRUZXN0UmVzdWx0KGV2ZW50LmhpdFRlc3RSZXN1bHQoKSk7CiB9CiAKLU5vZGUqIEV2ZW50SGFu
ZGxlcjo6dGFyZ2V0Tm9kZShjb25zdCBIaXRUZXN0UmVzdWx0JiBoaXRUZXN0UmVzdWx0KQorRXZl
bnRUYXJnZXQqIEV2ZW50SGFuZGxlcjo6ZXZlbnRUYXJnZXRGcm9tSGl0VGVzdFJlc3VsdChjb25z
dCBIaXRUZXN0UmVzdWx0JiByZXN1bHQpCiB7Ci0gICAgTm9kZSogbm9kZSA9IGhpdFRlc3RSZXN1
bHQuaW5uZXJOb2RlKCk7CisjaWYgRU5BQkxFKFNWRykKKyAgICBpZiAoU1ZHRWxlbWVudEluc3Rh
bmNlKiBpbnN0YW5jZSA9IHJlc3VsdC5pbm5lck5vZGVJbnN0YW5jZSgpKQorICAgICAgICByZXR1
cm4gaW5zdGFuY2U7CisjZW5kaWYKKworICAgIE5vZGUqIG5vZGUgPSByZXN1bHQuaW5uZXJOb2Rl
KCk7CiAgICAgaWYgKCFub2RlKQogICAgICAgICByZXR1cm4gMDsKICAgICBpZiAobm9kZS0+aW5E
b2N1bWVudCgpKQpAQCAtMTM2MCw3ICsxMzc1LDIzIEBAIE5vZGUqIEV2ZW50SGFuZGxlcjo6dGFy
Z2V0Tm9kZShjb25zdCBIaXQKICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAKICAgICByZXR1cm4g
bm9kZTsKK30KKworc3RhdGljIFJlbmRlckxheWVyKiBsYXllckZvckV2ZW50VGFyZ2V0KEV2ZW50
VGFyZ2V0KiB0YXJnZXQpCit7CisgICAgTm9kZSogbm9kZSA9IHRhcmdldCA/IHRhcmdldC0+dG9O
b2RlKCkgOiAwOworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBSZW5k
ZXJPYmplY3QqIHJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIoKTsKKyAgICBpZiAoIXJlbmRlcmVy
KQorICAgICAgICByZXR1cm4gMDsKIAorICAgIFJlbmRlckxheWVyKiBsYXllciA9IHJlbmRlcmVy
LT5lbmNsb3NpbmdMYXllcigpOworICAgIGlmICghbGF5ZXIpCisgICAgICAgIHJldHVybiAwOwor
CisgICAgcmV0dXJuIGxheWVyOwogfQogCiBib29sIEV2ZW50SGFuZGxlcjo6aGFuZGxlTW91c2VQ
cmVzc0V2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgbW91c2VFdmVudCkKQEAgLTEzOTYs
MTIgKzE0MjcsMTMgQEAgYm9vbCBFdmVudEhhbmRsZXI6OmhhbmRsZU1vdXNlUHJlc3NFdmVudAog
ICAgIExheW91dFBvaW50IGRvY3VtZW50UG9pbnQgPSBkb2N1bWVudFBvaW50Rm9yV2luZG93UG9p
bnQobV9mcmFtZSwgbW91c2VFdmVudC5wb3MoKSk7CiAgICAgTW91c2VFdmVudFdpdGhIaXRUZXN0
UmVzdWx0cyBtZXYgPSBtX2ZyYW1lLT5kb2N1bWVudCgpLT5wcmVwYXJlTW91c2VFdmVudChyZXF1
ZXN0LCBkb2N1bWVudFBvaW50LCBtb3VzZUV2ZW50KTsKIAotICAgIGlmICghdGFyZ2V0Tm9kZSht
ZXYpKSB7CisgICAgRXZlbnRUYXJnZXQqIGV2ZW50VGFyZ2V0ID0gZXZlbnRUYXJnZXRGcm9tSGl0
VGVzdFJlc3VsdHMobWV2KTsKKyAgICBpZiAoIWV2ZW50VGFyZ2V0KSB7CiAgICAgICAgIGludmFs
aWRhdGVDbGljaygpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgbV9tb3Vz
ZVByZXNzTm9kZSA9IHRhcmdldE5vZGUobWV2KTsKKyAgICBtX21vdXNlUHJlc3NUYXJnZXQgPSBl
dmVudFRhcmdldDsKIAogICAgIGlmIChJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmhhbmRsZU1v
dXNlUHJlc3MobV9mcmFtZS0+cGFnZSgpKSkgewogICAgICAgICBpbnZhbGlkYXRlQ2xpY2soKTsK
QEAgLTE0MTQsNyArMTQ0Niw3IEBAIGJvb2wgRXZlbnRIYW5kbGVyOjpoYW5kbGVNb3VzZVByZXNz
RXZlbnQKICAgICAgICAgLy8gdGhlIG1fbW91c2VQcmVzc2VkIGZsYWcsIHdoaWNoIG1heSBoYXBw
ZW4gaWYgYW4gQXBwS2l0IHdpZGdldCBlbnRlcmVkIGEgbW9kYWwgZXZlbnQgbG9vcC4KICAgICAg
ICAgbV9jYXB0dXJlc0RyYWdnaW5nID0gc3ViZnJhbWUtPmV2ZW50SGFuZGxlcigpLT5jYXB0dXJl
c0RyYWdnaW5nKCk7CiAgICAgICAgIGlmIChtX21vdXNlUHJlc3NlZCAmJiBtX2NhcHR1cmVzRHJh
Z2dpbmcpIHsKLSAgICAgICAgICAgIG1fY2FwdHVyaW5nTW91c2VFdmVudHNOb2RlID0gdGFyZ2V0
Tm9kZShtZXYpOworICAgICAgICAgICAgbV9jYXB0dXJpbmdNb3VzZUV2ZW50c05vZGUgPSBldmVu
dFRhcmdldCA/IGV2ZW50VGFyZ2V0LT50b05vZGUoKSA6IDA7CiAgICAgICAgICAgICBtX2V2ZW50
SGFuZGxlcldpbGxSZXNldENhcHR1cmluZ01vdXNlRXZlbnRzTm9kZSA9IHRydWU7CiAgICAgICAg
IH0KICAgICAgICAgaW52YWxpZGF0ZUNsaWNrKCk7CkBAIC0xNDM2LDEwICsxNDY4LDEwIEBAIGJv
b2wgRXZlbnRIYW5kbGVyOjpoYW5kbGVNb3VzZVByZXNzRXZlbnQKICNlbmRpZgogCiAgICAgbV9j
bGlja0NvdW50ID0gbW91c2VFdmVudC5jbGlja0NvdW50KCk7Ci0gICAgbV9jbGlja05vZGUgPSB0
YXJnZXROb2RlKG1ldik7CisgICAgbV9jbGlja1RhcmdldCA9IGV2ZW50VGFyZ2V0OwogCiAgICAg
aWYgKEZyYW1lVmlldyogdmlldyA9IG1fZnJhbWUtPnZpZXcoKSkgewotICAgICAgICBSZW5kZXJM
YXllciogbGF5ZXIgPSBtX2NsaWNrTm9kZS0+cmVuZGVyZXIoKSA/IG1fY2xpY2tOb2RlLT5yZW5k
ZXJlcigpLT5lbmNsb3NpbmdMYXllcigpIDogMDsKKyAgICAgICAgUmVuZGVyTGF5ZXIqIGxheWVy
ID0gbGF5ZXJGb3JFdmVudFRhcmdldChtX2NsaWNrVGFyZ2V0LmdldCgpKTsKICAgICAgICAgTGF5
b3V0UG9pbnQgcCA9IHZpZXctPndpbmRvd1RvQ29udGVudHMobW91c2VFdmVudC5wb3MoKSk7CiAg
ICAgICAgIGlmIChsYXllciAmJiBsYXllci0+aXNQb2ludEluUmVzaXplQ29udHJvbChwKSkgewog
ICAgICAgICAgICAgbGF5ZXItPnNldEluUmVzaXplTW9kZSh0cnVlKTsKQEAgLTE0NTIsNyArMTQ4
NCw3IEBAIGJvb2wgRXZlbnRIYW5kbGVyOjpoYW5kbGVNb3VzZVByZXNzRXZlbnQKIAogICAgIG1f
ZnJhbWUtPnNlbGVjdGlvbigpLT5zZXRDYXJldEJsaW5raW5nU3VzcGVuZGVkKHRydWUpOwogCi0g
ICAgYm9vbCBzd2FsbG93RXZlbnQgPSBkaXNwYXRjaE1vdXNlRXZlbnQoZXZlbnROYW1lcygpLm1v
dXNlZG93bkV2ZW50LCB0YXJnZXROb2RlKG1ldiksIHRydWUsIG1fY2xpY2tDb3VudCwgbW91c2VF
dmVudCwgdHJ1ZSk7CisgICAgYm9vbCBzd2FsbG93RXZlbnQgPSBkaXNwYXRjaE1vdXNlRXZlbnQo
ZXZlbnROYW1lcygpLm1vdXNlZG93bkV2ZW50LCBldmVudFRhcmdldCwgdHJ1ZSwgbV9jbGlja0Nv
dW50LCBtb3VzZUV2ZW50LCB0cnVlKTsKICAgICBtX2NhcHR1cmVzRHJhZ2dpbmcgPSAhc3dhbGxv
d0V2ZW50OwogCiAgICAgLy8gSWYgdGhlIGhpdCB0ZXN0aW5nIG9yaWdpbmFsbHkgZGV0ZXJtaW5l
ZCB0aGUgZXZlbnQgd2FzIGluIGEgc2Nyb2xsYmFyLCByZWZldGNoIHRoZSBNb3VzZUV2ZW50V2l0
aEhpdFRlc3RSZXN1bHRzCkBAIC0xNDc4LDcgKzE1MTAsOCBAQCBib29sIEV2ZW50SGFuZGxlcjo6
aGFuZGxlTW91c2VQcmVzc0V2ZW50CiAgICAgICAgIC8vIElmIGEgbW91c2UgZXZlbnQgaGFuZGxl
ciBjaGFuZ2VzIHRoZSBpbnB1dCBlbGVtZW50IHR5cGUgdG8gb25lIHRoYXQgaGFzIGEgd2lkZ2V0
IGFzc29jaWF0ZWQsCiAgICAgICAgIC8vIHdlJ2QgbGlrZSB0byBFdmVudEhhbmRsZXI6OmhhbmRs
ZU1vdXNlUHJlc3NFdmVudCB0byBwYXNzIHRoZSBldmVudCB0byB0aGUgd2lkZ2V0IGFuZCB0aHVz
IHRoZQogICAgICAgICAvLyBldmVudCB0YXJnZXQgbm9kZSBjYW4ndCBzdGlsbCBiZSB0aGUgc2hh
ZG93IG5vZGUuCi0gICAgICAgIGlmICh0YXJnZXROb2RlKG1ldiktPmlzU2hhZG93Um9vdCgpICYm
IHRhcmdldE5vZGUobWV2KS0+c2hhZG93SG9zdCgpLT5oYXNUYWdOYW1lKGlucHV0VGFnKSkgewor
ICAgICAgICBOb2RlKiB0YXJnZXROb2RlID0gZXZlbnRUYXJnZXQgPyBldmVudFRhcmdldC0+dG9O
b2RlKCkgOiAwOworICAgICAgICBpZiAodGFyZ2V0Tm9kZS0+aXNTaGFkb3dSb290KCkgJiYgdGFy
Z2V0Tm9kZS0+c2hhZG93SG9zdCgpLT5oYXNUYWdOYW1lKGlucHV0VGFnKSkgewogICAgICAgICAg
ICAgSGl0VGVzdFJlcXVlc3QgcmVxdWVzdChIaXRUZXN0UmVxdWVzdDo6UmVhZE9ubHkgfCBIaXRU
ZXN0UmVxdWVzdDo6QWN0aXZlKTsKICAgICAgICAgICAgIG1ldiA9IG1fZnJhbWUtPmRvY3VtZW50
KCktPnByZXBhcmVNb3VzZUV2ZW50KHJlcXVlc3QsIGRvY3VtZW50UG9pbnQsIG1vdXNlRXZlbnQp
OwogICAgICAgICB9CkBAIC0xNTE4LDEwICsxNTUxLDEyIEBAIGJvb2wgRXZlbnRIYW5kbGVyOjpo
YW5kbGVNb3VzZURvdWJsZUNsaWMKICAgICBpZiAoc3ViZnJhbWUgJiYgcGFzc01vdXNlUHJlc3NF
dmVudFRvU3ViZnJhbWUobWV2LCBzdWJmcmFtZSkpCiAgICAgICAgIHJldHVybiB0cnVlOwogCisg
ICAgRXZlbnRUYXJnZXQqIGV2ZW50VGFyZ2V0ID0gZXZlbnRUYXJnZXRGcm9tSGl0VGVzdFJlc3Vs
dHMobWV2KTsKKwogICAgIG1fY2xpY2tDb3VudCA9IG1vdXNlRXZlbnQuY2xpY2tDb3VudCgpOwot
ICAgIGJvb2wgc3dhbGxvd01vdXNlVXBFdmVudCA9IGRpc3BhdGNoTW91c2VFdmVudChldmVudE5h
bWVzKCkubW91c2V1cEV2ZW50LCB0YXJnZXROb2RlKG1ldiksIHRydWUsIG1fY2xpY2tDb3VudCwg
bW91c2VFdmVudCwgZmFsc2UpOworICAgIGJvb2wgc3dhbGxvd01vdXNlVXBFdmVudCA9IGRpc3Bh
dGNoTW91c2VFdmVudChldmVudE5hbWVzKCkubW91c2V1cEV2ZW50LCBldmVudFRhcmdldCwgdHJ1
ZSwgbV9jbGlja0NvdW50LCBtb3VzZUV2ZW50LCBmYWxzZSk7CiAKLSAgICBib29sIHN3YWxsb3dD
bGlja0V2ZW50ID0gbW91c2VFdmVudC5idXR0b24oKSAhPSBSaWdodEJ1dHRvbiAmJiB0YXJnZXRO
b2RlKG1ldikgPT0gbV9jbGlja05vZGUgJiYgZGlzcGF0Y2hNb3VzZUV2ZW50KGV2ZW50TmFtZXMo
KS5jbGlja0V2ZW50LCB0YXJnZXROb2RlKG1ldiksIHRydWUsIG1fY2xpY2tDb3VudCwgbW91c2VF
dmVudCwgdHJ1ZSk7CisgICAgYm9vbCBzd2FsbG93Q2xpY2tFdmVudCA9IG1vdXNlRXZlbnQuYnV0
dG9uKCkgIT0gUmlnaHRCdXR0b24gJiYgZXZlbnRUYXJnZXQgPT0gbV9jbGlja1RhcmdldCAmJiBk
aXNwYXRjaE1vdXNlRXZlbnQoZXZlbnROYW1lcygpLmNsaWNrRXZlbnQsIGV2ZW50VGFyZ2V0LCB0
cnVlLCBtX2NsaWNrQ291bnQsIG1vdXNlRXZlbnQsIHRydWUpOwogCiAgICAgaWYgKG1fbGFzdFNj
cm9sbGJhclVuZGVyTW91c2UpCiAgICAgICAgIHN3YWxsb3dNb3VzZVVwRXZlbnQgPSBtX2xhc3RT
Y3JvbGxiYXJVbmRlck1vdXNlLT5tb3VzZVVwKCk7CkBAIC0xNTMzLDIyICsxNTY4LDYgQEAgYm9v
bCBFdmVudEhhbmRsZXI6OmhhbmRsZU1vdXNlRG91YmxlQ2xpYwogICAgIHJldHVybiBzd2FsbG93
TW91c2VVcEV2ZW50IHx8IHN3YWxsb3dDbGlja0V2ZW50IHx8IHN3YWxsb3dNb3VzZVJlbGVhc2VF
dmVudDsKIH0KIAotc3RhdGljIFJlbmRlckxheWVyKiBsYXllckZvck5vZGUoTm9kZSogbm9kZSkK
LXsKLSAgICBpZiAoIW5vZGUpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgUmVuZGVyT2JqZWN0
KiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7Ci0gICAgaWYgKCFyZW5kZXJlcikKLSAgICAg
ICAgcmV0dXJuIDA7Ci0KLSAgICBSZW5kZXJMYXllciogbGF5ZXIgPSByZW5kZXJlci0+ZW5jbG9z
aW5nTGF5ZXIoKTsKLSAgICBpZiAoIWxheWVyKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJl
dHVybiBsYXllcjsKLX0KLQogYm9vbCBFdmVudEhhbmRsZXI6Om1vdXNlTW92ZWQoY29uc3QgUGxh
dGZvcm1Nb3VzZUV2ZW50JiBldmVudCkKIHsKICAgICBIaXRUZXN0UmVzdWx0IGhvdmVyZWROb2Rl
ID0gSGl0VGVzdFJlc3VsdChMYXlvdXRQb2ludCgpKTsKQEAgLTE1NTgsNyArMTU3Nyw3IEBAIGJv
b2wgRXZlbnRIYW5kbGVyOjptb3VzZU1vdmVkKGNvbnN0IFBsYXQKICAgICBpZiAoIXBhZ2UpCiAg
ICAgICAgIHJldHVybiByZXN1bHQ7CiAKLSAgICBpZiAoUmVuZGVyTGF5ZXIqIGxheWVyID0gbGF5
ZXJGb3JOb2RlKGhvdmVyZWROb2RlLmlubmVyTm9kZSgpKSkgeworICAgIGlmIChSZW5kZXJMYXll
ciogbGF5ZXIgPSBsYXllckZvckV2ZW50VGFyZ2V0KGhvdmVyZWROb2RlLmlubmVyRXZlbnRUYXJn
ZXQoKSkpIHsKICAgICAgICAgaWYgKHBhZ2UtPmNvbnRhaW5zU2Nyb2xsYWJsZUFyZWEobGF5ZXIp
KQogICAgICAgICAgICAgbGF5ZXItPnNjcm9sbEFuaW1hdG9yKCktPm1vdXNlTW92ZWRJbkNvbnRl
bnRBcmVhKCk7CiAgICAgfQpAQCAtMTYzOSwxNyArMTY1OCwxOSBAQCBib29sIEV2ZW50SGFuZGxl
cjo6aGFuZGxlTW91c2VNb3ZlRXZlbnQoCiAgICAgfQogCiAgICAgYm9vbCBzd2FsbG93RXZlbnQg
PSBmYWxzZTsKLSAgICBSZWZQdHI8RnJhbWU+IG5ld1N1YmZyYW1lID0gbV9jYXB0dXJpbmdNb3Vz
ZUV2ZW50c05vZGUuZ2V0KCkgPyBzdWJmcmFtZUZvclRhcmdldE5vZGUobV9jYXB0dXJpbmdNb3Vz
ZUV2ZW50c05vZGUuZ2V0KCkpIDogc3ViZnJhbWVGb3JIaXRUZXN0UmVzdWx0KG1ldik7CisgICAg
UmVmUHRyPEZyYW1lPiBuZXdTdWJmcmFtZSA9IG1fY2FwdHVyaW5nTW91c2VFdmVudHNOb2RlLmdl
dCgpID8gc3ViZnJhbWVGb3JFdmVudFRhcmdldChtX2NhcHR1cmluZ01vdXNlRXZlbnRzTm9kZS5n
ZXQoKSkgOiBzdWJmcmFtZUZvckhpdFRlc3RSZXN1bHQobWV2KTsKICAKICAgICAvLyBXZSB3YW50
IG1vdXNlb3V0cyB0byBoYXBwZW4gZmlyc3QsIGZyb20gdGhlIGluc2lkZSBvdXQuICBGaXJzdCBz
ZW5kIGEgbW92ZSBldmVudCB0byB0aGUgbGFzdCBzdWJmcmFtZSBzbyB0aGF0IGl0IHdpbGwgZmly
ZSBtb3VzZW91dHMuCiAgICAgaWYgKG1fbGFzdE1vdXNlTW92ZUV2ZW50U3ViZnJhbWUgJiYgbV9s
YXN0TW91c2VNb3ZlRXZlbnRTdWJmcmFtZS0+dHJlZSgpLT5pc0Rlc2NlbmRhbnRPZihtX2ZyYW1l
KSAmJiBtX2xhc3RNb3VzZU1vdmVFdmVudFN1YmZyYW1lICE9IG5ld1N1YmZyYW1lKQogICAgICAg
ICBwYXNzTW91c2VNb3ZlRXZlbnRUb1N1YmZyYW1lKG1ldiwgbV9sYXN0TW91c2VNb3ZlRXZlbnRT
dWJmcmFtZS5nZXQoKSk7CiAKKyAgICBFdmVudFRhcmdldCogZXZlbnRUYXJnZXQgPSBldmVudFRh
cmdldEZyb21IaXRUZXN0UmVzdWx0cyhtZXYpOworCiAgICAgaWYgKG5ld1N1YmZyYW1lKSB7CiAg
ICAgICAgIC8vIFVwZGF0ZSBvdmVyL291dCBzdGF0ZSBiZWZvcmUgcGFzc2luZyB0aGUgZXZlbnQg
dG8gdGhlIHN1YmZyYW1lLgotICAgICAgICB1cGRhdGVNb3VzZUV2ZW50VGFyZ2V0Tm9kZSh0YXJn
ZXROb2RlKG1ldiksIG1vdXNlRXZlbnQsIHRydWUpOworICAgICAgICB1cGRhdGVNb3VzZUV2ZW50
VGFyZ2V0KGV2ZW50VGFyZ2V0LCBtb3VzZUV2ZW50LCB0cnVlKTsKICAgICAgICAgCi0gICAgICAg
IC8vIEV2ZW50IGRpc3BhdGNoIGluIHVwZGF0ZU1vdXNlRXZlbnRUYXJnZXROb2RlIG1heSBoYXZl
IGNhdXNlZCB0aGUgc3ViZnJhbWUgb2YgdGhlIHRhcmdldAorICAgICAgICAvLyBFdmVudCBkaXNw
YXRjaCBpbiB1cGRhdGVNb3VzZUV2ZW50VGFyZ2V0IG1heSBoYXZlIGNhdXNlZCB0aGUgc3ViZnJh
bWUgb2YgdGhlIHRhcmdldAogICAgICAgICAvLyBub2RlIHRvIGJlIGRldGFjaGVkIGZyb20gaXRz
IEZyYW1lVmlldywgaW4gd2hpY2ggY2FzZSB0aGUgZXZlbnQgc2hvdWxkIG5vdCBiZSBwYXNzZWQu
CiAgICAgICAgIGlmIChuZXdTdWJmcmFtZS0+dmlldygpKQogICAgICAgICAgICAgc3dhbGxvd0V2
ZW50IHw9IHBhc3NNb3VzZU1vdmVFdmVudFRvU3ViZnJhbWUobWV2LCBuZXdTdWJmcmFtZS5nZXQo
KSwgaG92ZXJlZE5vZGUpOwpAQCAtMTY2OCw3ICsxNjg5LDcgQEAgYm9vbCBFdmVudEhhbmRsZXI6
OmhhbmRsZU1vdXNlTW92ZUV2ZW50KAogICAgIGlmIChzd2FsbG93RXZlbnQpCiAgICAgICAgIHJl
dHVybiB0cnVlOwogICAgIAotICAgIHN3YWxsb3dFdmVudCA9IGRpc3BhdGNoTW91c2VFdmVudChl
dmVudE5hbWVzKCkubW91c2Vtb3ZlRXZlbnQsIHRhcmdldE5vZGUobWV2KSwgZmFsc2UsIDAsIG1v
dXNlRXZlbnQsIHRydWUpOworICAgIHN3YWxsb3dFdmVudCA9IGRpc3BhdGNoTW91c2VFdmVudChl
dmVudE5hbWVzKCkubW91c2Vtb3ZlRXZlbnQsIGV2ZW50VGFyZ2V0LCBmYWxzZSwgMCwgbW91c2VF
dmVudCwgdHJ1ZSk7CiAjaWYgRU5BQkxFKERSQUdfU1VQUE9SVCkKICAgICBpZiAoIXN3YWxsb3dF
dmVudCkKICAgICAgICAgc3dhbGxvd0V2ZW50ID0gaGFuZGxlTW91c2VEcmFnZ2VkRXZlbnQobWV2
KTsKQEAgLTE2ODAsNyArMTcwMSw3IEBAIGJvb2wgRXZlbnRIYW5kbGVyOjpoYW5kbGVNb3VzZU1v
dmVFdmVudCgKIHZvaWQgRXZlbnRIYW5kbGVyOjppbnZhbGlkYXRlQ2xpY2soKQogewogICAgIG1f
Y2xpY2tDb3VudCA9IDA7Ci0gICAgbV9jbGlja05vZGUgPSAwOworICAgIG1fY2xpY2tUYXJnZXQg
PSAwOwogfQogCiBib29sIEV2ZW50SGFuZGxlcjo6aGFuZGxlTW91c2VSZWxlYXNlRXZlbnQoY29u
c3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBtb3VzZUV2ZW50KQpAQCAtMTcxNywxNSArMTczOCwxNiBA
QCBib29sIEV2ZW50SGFuZGxlcjo6aGFuZGxlTW91c2VSZWxlYXNlRXZlCiAKICAgICBIaXRUZXN0
UmVxdWVzdCByZXF1ZXN0KEhpdFRlc3RSZXF1ZXN0OjpNb3VzZVVwKTsKICAgICBNb3VzZUV2ZW50
V2l0aEhpdFRlc3RSZXN1bHRzIG1ldiA9IHByZXBhcmVNb3VzZUV2ZW50KHJlcXVlc3QsIG1vdXNl
RXZlbnQpOwotICAgIEZyYW1lKiBzdWJmcmFtZSA9IG1fY2FwdHVyaW5nTW91c2VFdmVudHNOb2Rl
LmdldCgpID8gc3ViZnJhbWVGb3JUYXJnZXROb2RlKG1fY2FwdHVyaW5nTW91c2VFdmVudHNOb2Rl
LmdldCgpKSA6IHN1YmZyYW1lRm9ySGl0VGVzdFJlc3VsdChtZXYpOworICAgIEZyYW1lKiBzdWJm
cmFtZSA9IG1fY2FwdHVyaW5nTW91c2VFdmVudHNOb2RlLmdldCgpID8gc3ViZnJhbWVGb3JFdmVu
dFRhcmdldChtX2NhcHR1cmluZ01vdXNlRXZlbnRzTm9kZS5nZXQoKSkgOiBzdWJmcmFtZUZvckhp
dFRlc3RSZXN1bHQobWV2KTsKICAgICBpZiAobV9ldmVudEhhbmRsZXJXaWxsUmVzZXRDYXB0dXJp
bmdNb3VzZUV2ZW50c05vZGUpCiAgICAgICAgIG1fY2FwdHVyaW5nTW91c2VFdmVudHNOb2RlID0g
MDsKICAgICBpZiAoc3ViZnJhbWUgJiYgcGFzc01vdXNlUmVsZWFzZUV2ZW50VG9TdWJmcmFtZSht
ZXYsIHN1YmZyYW1lKSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICBib29sIHN3YWxsb3dN
b3VzZVVwRXZlbnQgPSBkaXNwYXRjaE1vdXNlRXZlbnQoZXZlbnROYW1lcygpLm1vdXNldXBFdmVu
dCwgdGFyZ2V0Tm9kZShtZXYpLCB0cnVlLCBtX2NsaWNrQ291bnQsIG1vdXNlRXZlbnQsIGZhbHNl
KTsKKyAgICBFdmVudFRhcmdldCogZXZlbnRUYXJnZXQgPSBldmVudFRhcmdldEZyb21IaXRUZXN0
UmVzdWx0cyhtZXYpOworICAgIGJvb2wgc3dhbGxvd01vdXNlVXBFdmVudCA9IGRpc3BhdGNoTW91
c2VFdmVudChldmVudE5hbWVzKCkubW91c2V1cEV2ZW50LCBldmVudFRhcmdldCwgdHJ1ZSwgbV9j
bGlja0NvdW50LCBtb3VzZUV2ZW50LCBmYWxzZSk7CiAKLSAgICBib29sIHN3YWxsb3dDbGlja0V2
ZW50ID0gbV9jbGlja0NvdW50ID4gMCAmJiBtb3VzZUV2ZW50LmJ1dHRvbigpICE9IFJpZ2h0QnV0
dG9uICYmIHRhcmdldE5vZGUobWV2KSA9PSBtX2NsaWNrTm9kZSAmJiBkaXNwYXRjaE1vdXNlRXZl
bnQoZXZlbnROYW1lcygpLmNsaWNrRXZlbnQsIHRhcmdldE5vZGUobWV2KSwgdHJ1ZSwgbV9jbGlj
a0NvdW50LCBtb3VzZUV2ZW50LCB0cnVlKTsKKyAgICBib29sIHN3YWxsb3dDbGlja0V2ZW50ID0g
bV9jbGlja0NvdW50ID4gMCAmJiBtb3VzZUV2ZW50LmJ1dHRvbigpICE9IFJpZ2h0QnV0dG9uICYm
IGV2ZW50VGFyZ2V0ID09IG1fY2xpY2tUYXJnZXQgJiYgZGlzcGF0Y2hNb3VzZUV2ZW50KGV2ZW50
TmFtZXMoKS5jbGlja0V2ZW50LCBldmVudFRhcmdldCwgdHJ1ZSwgbV9jbGlja0NvdW50LCBtb3Vz
ZUV2ZW50LCB0cnVlKTsKIAogICAgIGlmIChtX3Jlc2l6ZUxheWVyKSB7CiAgICAgICAgIG1fcmVz
aXplTGF5ZXItPnNldEluUmVzaXplTW9kZShmYWxzZSk7CkBAIC0xNzQyLDcgKzE3NjQsNyBAQCBi
b29sIEV2ZW50SGFuZGxlcjo6aGFuZGxlTW91c2VSZWxlYXNlRXZlCiB9CiAKICNpZiBFTkFCTEUo
RFJBR19TVVBQT1JUKQotYm9vbCBFdmVudEhhbmRsZXI6OmRpc3BhdGNoRHJhZ0V2ZW50KGNvbnN0
IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBOb2RlKiBkcmFnVGFyZ2V0LCBjb25zdCBQbGF0Zm9y
bU1vdXNlRXZlbnQmIGV2ZW50LCBDbGlwYm9hcmQqIGNsaXBib2FyZCkKK2Jvb2wgRXZlbnRIYW5k
bGVyOjpkaXNwYXRjaERyYWdFdmVudChjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgRXZl
bnRUYXJnZXQqIGRyYWdUYXJnZXQsIGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZlbnQsIENs
aXBib2FyZCogY2xpcGJvYXJkKQogewogICAgIEZyYW1lVmlldyogdmlldyA9IG1fZnJhbWUtPnZp
ZXcoKTsKIApAQCAtMTc2MiwyMSArMTc4NCwyNSBAQCBib29sIEV2ZW50SGFuZGxlcjo6ZGlzcGF0
Y2hEcmFnRXZlbnQoY29uCiAgICAgcmV0dXJuIG1lLT5kZWZhdWx0UHJldmVudGVkKCk7CiB9CiAK
LXN0YXRpYyBib29sIHRhcmdldElzRnJhbWUoTm9kZSogdGFyZ2V0LCBGcmFtZSomIGZyYW1lKQor
c3RhdGljIGJvb2wgdGFyZ2V0SXNGcmFtZShFdmVudFRhcmdldCogdGFyZ2V0LCBGcmFtZSomIGZy
YW1lKQogewotICAgIGlmICghdGFyZ2V0KQorICAgIE5vZGUqIG5vZGUgPSB0YXJnZXQgPyB0YXJn
ZXQtPnRvTm9kZSgpIDogMDsKKyAgICBpZiAoIW5vZGUpCiAgICAgICAgIHJldHVybiBmYWxzZTsK
IAotICAgIGlmICghdGFyZ2V0LT5oYXNUYWdOYW1lKGZyYW1lVGFnKSAmJiAhdGFyZ2V0LT5oYXNU
YWdOYW1lKGlmcmFtZVRhZykpCisgICAgaWYgKCFub2RlLT5oYXNUYWdOYW1lKGZyYW1lVGFnKSAm
JiAhbm9kZS0+aGFzVGFnTmFtZShpZnJhbWVUYWcpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAK
LSAgICBmcmFtZSA9IHN0YXRpY19jYXN0PEhUTUxGcmFtZUVsZW1lbnRCYXNlKj4odGFyZ2V0KS0+
Y29udGVudEZyYW1lKCk7CisgICAgZnJhbWUgPSBzdGF0aWNfY2FzdDxIVE1MRnJhbWVFbGVtZW50
QmFzZSo+KG5vZGUpLT5jb250ZW50RnJhbWUoKTsKIAogICAgIHJldHVybiB0cnVlOwogfQogCi1z
dGF0aWMgYm9vbCBmaW5kRHJvcFpvbmUoTm9kZSogdGFyZ2V0LCBDbGlwYm9hcmQqIGNsaXBib2Fy
ZCkKK3N0YXRpYyBib29sIGZpbmREcm9wWm9uZShFdmVudFRhcmdldCogZXZlbnRUYXJnZXQsIENs
aXBib2FyZCogY2xpcGJvYXJkKQogeworICAgIE5vZGUqIHRhcmdldCA9IGV2ZW50VGFyZ2V0ID8g
ZXZlbnRUYXJnZXQtPnRvTm9kZSgpIDogMDsKKyAgICBBU1NFUlQodGFyZ2V0KTsKKwogICAgIEVs
ZW1lbnQqIGVsZW1lbnQgPSB0YXJnZXQtPmlzRWxlbWVudE5vZGUoKSA/IHRvRWxlbWVudCh0YXJn
ZXQpIDogdGFyZ2V0LT5wYXJlbnRFbGVtZW50KCk7CiAgICAgZm9yICg7IGVsZW1lbnQ7IGVsZW1l
bnQgPSBlbGVtZW50LT5wYXJlbnRFbGVtZW50KCkpIHsKICAgICAgICAgYm9vbCBtYXRjaGVkID0g
ZmFsc2U7CkBAIC0xODIwLDEzICsxODQ2LDE3IEBAIGJvb2wgRXZlbnRIYW5kbGVyOjp1cGRhdGVE
cmFnQW5kRHJvcChjb24KIAogICAgIEhpdFRlc3RSZXF1ZXN0IHJlcXVlc3QoSGl0VGVzdFJlcXVl
c3Q6OlJlYWRPbmx5KTsKICAgICBNb3VzZUV2ZW50V2l0aEhpdFRlc3RSZXN1bHRzIG1ldiA9IHBy
ZXBhcmVNb3VzZUV2ZW50KHJlcXVlc3QsIGV2ZW50KTsKKyAgICBFdmVudFRhcmdldCogZXZlbnRU
YXJnZXQgPSBldmVudFRhcmdldEZyb21IaXRUZXN0UmVzdWx0cyhtZXYpOwogCiAgICAgLy8gRHJh
ZyBldmVudHMgc2hvdWxkIG5ldmVyIGdvIHRvIHRleHQgbm9kZXMgKGZvbGxvd2luZyBJRSwgYW5k
IHByb3BlciBtb3VzZW92ZXIvb3V0IGRpc3BhdGNoKQotICAgIE5vZGUqIG5ld1RhcmdldCA9IHRh
cmdldE5vZGUobWV2KTsKLSAgICBpZiAobmV3VGFyZ2V0ICYmIG5ld1RhcmdldC0+aXNUZXh0Tm9k
ZSgpKQotICAgICAgICBuZXdUYXJnZXQgPSBuZXdUYXJnZXQtPnBhcmVudE5vZGUoKTsKLSAgICBp
ZiAobmV3VGFyZ2V0KQotICAgICAgICBuZXdUYXJnZXQgPSBuZXdUYXJnZXQtPnNoYWRvd0FuY2Vz
dG9yTm9kZSgpOworICAgIEV2ZW50VGFyZ2V0KiBuZXdUYXJnZXQgPSBldmVudFRhcmdldDsKKyAg
ICBOb2RlKiBuZXdUYXJnZXROb2RlID0gZXZlbnRUYXJnZXQgPyBldmVudFRhcmdldC0+dG9Ob2Rl
KCkgOiAwOworICAgIGlmIChuZXdUYXJnZXROb2RlICYmIG5ld1RhcmdldE5vZGUtPmlzVGV4dE5v
ZGUoKSkgeworICAgICAgICBuZXdUYXJnZXROb2RlID0gbmV3VGFyZ2V0Tm9kZS0+cGFyZW50Tm9k
ZSgpOworICAgICAgICBuZXdUYXJnZXQgPSBuZXdUYXJnZXROb2RlOworICAgIH0KKyAgICBpZiAo
bmV3VGFyZ2V0Tm9kZSkKKyAgICAgICAgbmV3VGFyZ2V0ID0gbmV3VGFyZ2V0Tm9kZS0+c2hhZG93
QW5jZXN0b3JOb2RlKCk7CiAKICAgICBpZiAobV9kcmFnVGFyZ2V0ICE9IG5ld1RhcmdldCkgewog
ICAgICAgICAvLyBGSVhNRTogdGhpcyBvcmRlcmluZyB3YXMgZXhwbGljaXRseSBjaG9zZW4gdG8g
bWF0Y2ggV2luSUUuIEhvd2V2ZXIsCkBAIC0xOTMyLDEzNyArMTk2Miw5MCBAQCBNb3VzZUV2ZW50
V2l0aEhpdFRlc3RSZXN1bHRzIEV2ZW50SGFuZGxlCiAgICAgcmV0dXJuIG1fZnJhbWUtPmRvY3Vt
ZW50KCktPnByZXBhcmVNb3VzZUV2ZW50KHJlcXVlc3QsIGRvY3VtZW50UG9pbnRGb3JXaW5kb3dQ
b2ludChtX2ZyYW1lLCBtZXYucG9zKCkpLCBtZXYpOwogfQogCi0jaWYgRU5BQkxFKFNWRykKLXN0
YXRpYyBpbmxpbmUgU1ZHRWxlbWVudEluc3RhbmNlKiBpbnN0YW5jZUFzc29jaWF0ZWRXaXRoU2hh
ZG93VHJlZUVsZW1lbnQoTm9kZSogcmVmZXJlbmNlTm9kZSkKK3ZvaWQgRXZlbnRIYW5kbGVyOjp1
cGRhdGVNb3VzZUV2ZW50VGFyZ2V0KEV2ZW50VGFyZ2V0KiBldmVudFRhcmdldCwgY29uc3QgUGxh
dGZvcm1Nb3VzZUV2ZW50JiBtb3VzZUV2ZW50LCBib29sIGZpcmVNb3VzZU92ZXJPdXQpCiB7Ci0g
ICAgaWYgKCFyZWZlcmVuY2VOb2RlIHx8ICFyZWZlcmVuY2VOb2RlLT5pc1NWR0VsZW1lbnQoKSkK
LSAgICAgICAgcmV0dXJuIDA7CisgICAgRXZlbnRUYXJnZXQqIHJlc3VsdCA9IGV2ZW50VGFyZ2V0
OwogCi0gICAgTm9kZSogc2hhZG93VHJlZUVsZW1lbnQgPSByZWZlcmVuY2VOb2RlLT5zaGFkb3dU
cmVlUm9vdE5vZGUoKTsKLSAgICBpZiAoIXNoYWRvd1RyZWVFbGVtZW50KQotICAgICAgICByZXR1
cm4gMDsKLQotICAgIEVsZW1lbnQqIHNoYWRvd1RyZWVQYXJlbnRFbGVtZW50ID0gc2hhZG93VHJl
ZUVsZW1lbnQtPnNoYWRvd0hvc3QoKTsKLSAgICBpZiAoIXNoYWRvd1RyZWVQYXJlbnRFbGVtZW50
KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIEFTU0VSVChzaGFkb3dUcmVlUGFyZW50RWxlbWVu
dC0+aGFzVGFnTmFtZSh1c2VUYWcpKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U1ZHVXNlRWxl
bWVudCo+KHNoYWRvd1RyZWVQYXJlbnRFbGVtZW50KS0+aW5zdGFuY2VGb3JTaGFkb3dUcmVlRWxl
bWVudChyZWZlcmVuY2VOb2RlKTsKLX0KLSNlbmRpZgotCi12b2lkIEV2ZW50SGFuZGxlcjo6dXBk
YXRlTW91c2VFdmVudFRhcmdldE5vZGUoTm9kZSogdGFyZ2V0Tm9kZSwgY29uc3QgUGxhdGZvcm1N
b3VzZUV2ZW50JiBtb3VzZUV2ZW50LCBib29sIGZpcmVNb3VzZU92ZXJPdXQpCi17Ci0gICAgTm9k
ZSogcmVzdWx0ID0gdGFyZ2V0Tm9kZTsKLSAgICAKICAgICAvLyBJZiB3ZSdyZSBjYXB0dXJpbmcs
IHdlIGFsd2F5cyBnbyByaWdodCB0byB0aGF0IG5vZGUuCiAgICAgaWYgKG1fY2FwdHVyaW5nTW91
c2VFdmVudHNOb2RlKQogICAgICAgICByZXN1bHQgPSBtX2NhcHR1cmluZ01vdXNlRXZlbnRzTm9k
ZS5nZXQoKTsKICAgICBlbHNlIHsKICAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBub2RlIGlzIGEg
dGV4dCBub2RlLCBkaXNwYXRjaCBvbiB0aGUgcGFyZW50IG5vZGUgLSByZGFyOi8vNDE5NjY0Ngot
ICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC0+aXNUZXh0Tm9kZSgpKQotICAgICAgICAgICAg
cmVzdWx0ID0gcmVzdWx0LT5wYXJlbnROb2RlKCk7Ci0gICAgfQotICAgIG1fbm9kZVVuZGVyTW91
c2UgPSByZXN1bHQ7CisgICAgICAgIE5vZGUqIHRhcmdldE5vZGUgPSBldmVudFRhcmdldCA/IGV2
ZW50VGFyZ2V0LT50b05vZGUoKSA6IDA7CisgICAgICAgIGlmICh0YXJnZXROb2RlICYmIHRhcmdl
dE5vZGUtPmlzVGV4dE5vZGUoKSkgewogI2lmIEVOQUJMRShTVkcpCi0gICAgbV9pbnN0YW5jZVVu
ZGVyTW91c2UgPSBpbnN0YW5jZUFzc29jaWF0ZWRXaXRoU2hhZG93VHJlZUVsZW1lbnQocmVzdWx0
KTsKLQotICAgIC8vIDx1c2U+IHNoYWRvdyB0cmVlIGVsZW1lbnRzIG1heSBoYXZlIGJlZW4gcmVj
bG9uZWQsIHVwZGF0ZSBub2RlIHVuZGVyIG1vdXNlIGluIGFueSBjYXNlCi0gICAgaWYgKG1fbGFz
dEluc3RhbmNlVW5kZXJNb3VzZSkgewotICAgICAgICBTVkdFbGVtZW50KiBsYXN0Q29ycmVzcG9u
ZGluZ0VsZW1lbnQgPSBtX2xhc3RJbnN0YW5jZVVuZGVyTW91c2UtPmNvcnJlc3BvbmRpbmdFbGVt
ZW50KCk7Ci0gICAgICAgIFNWR0VsZW1lbnQqIGxhc3RDb3JyZXNwb25kaW5nVXNlRWxlbWVudCA9
IG1fbGFzdEluc3RhbmNlVW5kZXJNb3VzZS0+Y29ycmVzcG9uZGluZ1VzZUVsZW1lbnQoKTsKLQot
ICAgICAgICBpZiAobGFzdENvcnJlc3BvbmRpbmdFbGVtZW50ICYmIGxhc3RDb3JyZXNwb25kaW5n
VXNlRWxlbWVudCkgewotICAgICAgICAgICAgSGFzaFNldDxTVkdFbGVtZW50SW5zdGFuY2UqPiBp
bnN0YW5jZXMgPSBsYXN0Q29ycmVzcG9uZGluZ0VsZW1lbnQtPmluc3RhbmNlc0ZvckVsZW1lbnQo
KTsKLQotICAgICAgICAgICAgLy8gTG9jYXRlIHRoZSByZWNsb25lZCBzaGFkb3cgdHJlZSBlbGVt
ZW50IGZvciBvdXIgY29ycmVzcG9uZGluZyBpbnN0YW5jZQotICAgICAgICAgICAgSGFzaFNldDxT
VkdFbGVtZW50SW5zdGFuY2UqPjo6aXRlcmF0b3IgZW5kID0gaW5zdGFuY2VzLmVuZCgpOwotICAg
ICAgICAgICAgZm9yIChIYXNoU2V0PFNWR0VsZW1lbnRJbnN0YW5jZSo+OjppdGVyYXRvciBpdCA9
IGluc3RhbmNlcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgICAgICAgICBT
VkdFbGVtZW50SW5zdGFuY2UqIGluc3RhbmNlID0gKCppdCk7Ci0gICAgICAgICAgICAgICAgQVNT
RVJUKGluc3RhbmNlLT5jb3JyZXNwb25kaW5nRWxlbWVudCgpID09IGxhc3RDb3JyZXNwb25kaW5n
RWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbV9sYXN0SW5zdGFu
Y2VVbmRlck1vdXNlKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAg
ICAgICAgIGlmIChpbnN0YW5jZS0+Y29ycmVzcG9uZGluZ1VzZUVsZW1lbnQoKSAhPSBsYXN0Q29y
cmVzcG9uZGluZ1VzZUVsZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0g
ICAgICAgICAgICAgICAgU1ZHRWxlbWVudCogc2hhZG93VHJlZUVsZW1lbnQgPSBpbnN0YW5jZS0+
c2hhZG93VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXNoYWRvd1RyZWVFbGVt
ZW50LT5pbkRvY3VtZW50KCkgfHwgbV9sYXN0Tm9kZVVuZGVyTW91c2UgPT0gc2hhZG93VHJlZUVs
ZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAg
bV9sYXN0Tm9kZVVuZGVyTW91c2UgPSBzaGFkb3dUcmVlRWxlbWVudDsKLSAgICAgICAgICAgICAg
ICBtX2xhc3RJbnN0YW5jZVVuZGVyTW91c2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VSVCghZXZlbnRUYXJnZXQtPnRv
U1ZHRWxlbWVudEluc3RhbmNlKCkpOworI2VuZGlmCisgICAgICAgICAgICByZXN1bHQgPSB0YXJn
ZXROb2RlLT5wYXJlbnROb2RlKCk7CiAgICAgICAgIH0KICAgICB9Ci0jZW5kaWYKKyAgICBtX3Rh
cmdldFVuZGVyTW91c2UgPSByZXN1bHQ7CiAKICAgICAvLyBGaXJlIG1vdXNlb3V0L21vdXNlb3Zl
ciBpZiB0aGUgbW91c2UgaGFzIHNoaWZ0ZWQgdG8gYSBkaWZmZXJlbnQgbm9kZS4KLSAgICBpZiAo
ZmlyZU1vdXNlT3Zlck91dCkgewotICAgICAgICBSZW5kZXJMYXllciogbGF5ZXJGb3JMYXN0Tm9k
ZSA9IGxheWVyRm9yTm9kZShtX2xhc3ROb2RlVW5kZXJNb3VzZS5nZXQoKSk7Ci0gICAgICAgIFJl
bmRlckxheWVyKiBsYXllckZvck5vZGVVbmRlck1vdXNlID0gbGF5ZXJGb3JOb2RlKG1fbm9kZVVu
ZGVyTW91c2UuZ2V0KCkpOwotICAgICAgICBQYWdlKiBwYWdlID0gbV9mcmFtZS0+cGFnZSgpOwor
ICAgIGlmICghZmlyZU1vdXNlT3Zlck91dCkKKyAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIGlm
IChtX2xhc3ROb2RlVW5kZXJNb3VzZSAmJiAoIW1fbm9kZVVuZGVyTW91c2UgfHwgbV9ub2RlVW5k
ZXJNb3VzZS0+ZG9jdW1lbnQoKSAhPSBtX2ZyYW1lLT5kb2N1bWVudCgpKSkgewotICAgICAgICAg
ICAgLy8gVGhlIG1vdXNlIGhhcyBtb3ZlZCBiZXR3ZWVuIGZyYW1lcy4KLSAgICAgICAgICAgIGlm
IChGcmFtZSogZnJhbWUgPSBtX2xhc3ROb2RlVW5kZXJNb3VzZS0+ZG9jdW1lbnQoKS0+ZnJhbWUo
KSkgewotICAgICAgICAgICAgICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IGZyYW1lLT52
aWV3KCkpCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lVmlldy0+c2Nyb2xsQW5pbWF0b3IoKS0+
bW91c2VFeGl0ZWRDb250ZW50QXJlYSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2Ug
aWYgKHBhZ2UgJiYgKGxheWVyRm9yTGFzdE5vZGUgJiYgKCFsYXllckZvck5vZGVVbmRlck1vdXNl
IHx8IGxheWVyRm9yTm9kZVVuZGVyTW91c2UgIT0gbGF5ZXJGb3JMYXN0Tm9kZSkpKSB7Ci0gICAg
ICAgICAgICAvLyBUaGUgbW91c2UgaGFzIG1vdmVkIGJldHdlZW4gbGF5ZXJzLgotICAgICAgICAg
ICAgaWYgKHBhZ2UtPmNvbnRhaW5zU2Nyb2xsYWJsZUFyZWEobGF5ZXJGb3JMYXN0Tm9kZSkpCi0g
ICAgICAgICAgICAgICAgbGF5ZXJGb3JMYXN0Tm9kZS0+c2Nyb2xsQW5pbWF0b3IoKS0+bW91c2VF
eGl0ZWRDb250ZW50QXJlYSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobV9u
b2RlVW5kZXJNb3VzZSAmJiAoIW1fbGFzdE5vZGVVbmRlck1vdXNlIHx8IG1fbGFzdE5vZGVVbmRl
ck1vdXNlLT5kb2N1bWVudCgpICE9IG1fZnJhbWUtPmRvY3VtZW50KCkpKSB7Ci0gICAgICAgICAg
ICAvLyBUaGUgbW91c2UgaGFzIG1vdmVkIGJldHdlZW4gZnJhbWVzLgotICAgICAgICAgICAgaWYg
KEZyYW1lKiBmcmFtZSA9IG1fbm9kZVVuZGVyTW91c2UtPmRvY3VtZW50KCktPmZyYW1lKCkpIHsK
LSAgICAgICAgICAgICAgICBpZiAoRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBmcmFtZS0+dmlldygp
KQotICAgICAgICAgICAgICAgICAgICBmcmFtZVZpZXctPnNjcm9sbEFuaW1hdG9yKCktPm1vdXNl
RW50ZXJlZENvbnRlbnRBcmVhKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAo
cGFnZSAmJiAobGF5ZXJGb3JOb2RlVW5kZXJNb3VzZSAmJiAoIWxheWVyRm9yTGFzdE5vZGUgfHwg
bGF5ZXJGb3JOb2RlVW5kZXJNb3VzZSAhPSBsYXllckZvckxhc3ROb2RlKSkpIHsKLSAgICAgICAg
ICAgIC8vIFRoZSBtb3VzZSBoYXMgbW92ZWQgYmV0d2VlbiBsYXllcnMuCi0gICAgICAgICAgICBp
ZiAocGFnZS0+Y29udGFpbnNTY3JvbGxhYmxlQXJlYShsYXllckZvck5vZGVVbmRlck1vdXNlKSkK
LSAgICAgICAgICAgICAgICBsYXllckZvck5vZGVVbmRlck1vdXNlLT5zY3JvbGxBbmltYXRvcigp
LT5tb3VzZUVudGVyZWRDb250ZW50QXJlYSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAg
ICBpZiAobV9sYXN0Tm9kZVVuZGVyTW91c2UgJiYgbV9sYXN0Tm9kZVVuZGVyTW91c2UtPmRvY3Vt
ZW50KCkgIT0gbV9mcmFtZS0+ZG9jdW1lbnQoKSkgewotICAgICAgICAgICAgbV9sYXN0Tm9kZVVu
ZGVyTW91c2UgPSAwOwotICAgICAgICAgICAgbV9sYXN0U2Nyb2xsYmFyVW5kZXJNb3VzZSA9IDA7
Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgICAgIG1fbGFzdEluc3RhbmNlVW5kZXJNb3VzZSA9
IDA7Ci0jZW5kaWYKKyAgICBOb2RlKiBub2RlVW5kZXJNb3VzZSA9IG1fdGFyZ2V0VW5kZXJNb3Vz
ZSA/IG1fdGFyZ2V0VW5kZXJNb3VzZS0+dG9Ob2RlKCkgOiAwOworICAgIE5vZGUqIGxhc3ROb2Rl
VW5kZXJNb3VzZSA9IG1fbGFzdFRhcmdldFVuZGVyTW91c2UgPyBtX2xhc3RUYXJnZXRVbmRlck1v
dXNlLT50b05vZGUoKSA6IDA7CisKKyAgICBSZW5kZXJMYXllciogbGF5ZXJGb3JMYXN0VGFyZ2V0
ID0gbGF5ZXJGb3JFdmVudFRhcmdldChtX2xhc3RUYXJnZXRVbmRlck1vdXNlLmdldCgpKTsKKyAg
ICBSZW5kZXJMYXllciogbGF5ZXJGb3JUYXJnZXRVbmRlck1vdXNlID0gbGF5ZXJGb3JFdmVudFRh
cmdldChtX3RhcmdldFVuZGVyTW91c2UuZ2V0KCkpOworICAgIFBhZ2UqIHBhZ2UgPSBtX2ZyYW1l
LT5wYWdlKCk7CisKKyAgICBpZiAobGFzdE5vZGVVbmRlck1vdXNlICYmICghbV90YXJnZXRVbmRl
ck1vdXNlIHx8IG1fdGFyZ2V0VW5kZXJNb3VzZS0+dG9Ob2RlKCktPmRvY3VtZW50KCkgIT0gbV9m
cmFtZS0+ZG9jdW1lbnQoKSkpIHsKKyAgICAgICAgLy8gVGhlIG1vdXNlIGhhcyBtb3ZlZCBiZXR3
ZWVuIGZyYW1lcy4KKyAgICAgICAgaWYgKEZyYW1lKiBmcmFtZSA9IGxhc3ROb2RlVW5kZXJNb3Vz
ZS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSkgeworICAgICAgICAgICAgaWYgKEZyYW1lVmlldyogZnJh
bWVWaWV3ID0gZnJhbWUtPnZpZXcoKSkKKyAgICAgICAgICAgICAgICBmcmFtZVZpZXctPnNjcm9s
bEFuaW1hdG9yKCktPm1vdXNlRXhpdGVkQ29udGVudEFyZWEoKTsKICAgICAgICAgfQorICAgIH0g
ZWxzZSBpZiAocGFnZSAmJiAobGF5ZXJGb3JMYXN0VGFyZ2V0ICYmICghbGF5ZXJGb3JUYXJnZXRV
bmRlck1vdXNlIHx8IGxheWVyRm9yVGFyZ2V0VW5kZXJNb3VzZSAhPSBsYXllckZvckxhc3RUYXJn
ZXQpKSkgeworICAgICAgICAvLyBUaGUgbW91c2UgaGFzIG1vdmVkIGJldHdlZW4gbGF5ZXJzLgor
ICAgICAgICBpZiAocGFnZS0+Y29udGFpbnNTY3JvbGxhYmxlQXJlYShsYXllckZvckxhc3RUYXJn
ZXQpKQorICAgICAgICAgICAgbGF5ZXJGb3JMYXN0VGFyZ2V0LT5zY3JvbGxBbmltYXRvcigpLT5t
b3VzZUV4aXRlZENvbnRlbnRBcmVhKCk7CisgICAgfQogCi0gICAgICAgIGlmIChtX2xhc3ROb2Rl
VW5kZXJNb3VzZSAhPSBtX25vZGVVbmRlck1vdXNlKSB7Ci0gICAgICAgICAgICAvLyBzZW5kIG1v
dXNlb3V0IGV2ZW50IHRvIHRoZSBvbGQgbm9kZQotICAgICAgICAgICAgaWYgKG1fbGFzdE5vZGVV
bmRlck1vdXNlKQotICAgICAgICAgICAgICAgIG1fbGFzdE5vZGVVbmRlck1vdXNlLT5kaXNwYXRj
aE1vdXNlRXZlbnQobW91c2VFdmVudCwgZXZlbnROYW1lcygpLm1vdXNlb3V0RXZlbnQsIDAsIG1f
bm9kZVVuZGVyTW91c2UuZ2V0KCkpOwotICAgICAgICAgICAgLy8gc2VuZCBtb3VzZW92ZXIgZXZl
bnQgdG8gdGhlIG5ldyBub2RlCi0gICAgICAgICAgICBpZiAobV9ub2RlVW5kZXJNb3VzZSkKLSAg
ICAgICAgICAgICAgICBtX25vZGVVbmRlck1vdXNlLT5kaXNwYXRjaE1vdXNlRXZlbnQobW91c2VF
dmVudCwgZXZlbnROYW1lcygpLm1vdXNlb3ZlckV2ZW50LCAwLCBtX2xhc3ROb2RlVW5kZXJNb3Vz
ZS5nZXQoKSk7CisgICAgaWYgKG5vZGVVbmRlck1vdXNlICYmICghbGFzdE5vZGVVbmRlck1vdXNl
IHx8IGxhc3ROb2RlVW5kZXJNb3VzZS0+ZG9jdW1lbnQoKSAhPSBtX2ZyYW1lLT5kb2N1bWVudCgp
KSkgeworICAgICAgICAvLyBUaGUgbW91c2UgaGFzIG1vdmVkIGJldHdlZW4gZnJhbWVzLgorICAg
ICAgICBpZiAoRnJhbWUqIGZyYW1lID0gbm9kZVVuZGVyTW91c2UtPmRvY3VtZW50KCktPmZyYW1l
KCkpIHsKKyAgICAgICAgICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IGZyYW1lLT52aWV3
KCkpCisgICAgICAgICAgICAgICAgZnJhbWVWaWV3LT5zY3JvbGxBbmltYXRvcigpLT5tb3VzZUVu
dGVyZWRDb250ZW50QXJlYSgpOwogICAgICAgICB9Ci0gICAgICAgIG1fbGFzdE5vZGVVbmRlck1v
dXNlID0gbV9ub2RlVW5kZXJNb3VzZTsKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICBtX2xhc3RJ
bnN0YW5jZVVuZGVyTW91c2UgPSBpbnN0YW5jZUFzc29jaWF0ZWRXaXRoU2hhZG93VHJlZUVsZW1l
bnQobV9ub2RlVW5kZXJNb3VzZS5nZXQoKSk7Ci0jZW5kaWYKKyAgICB9IGVsc2UgaWYgKHBhZ2Ug
JiYgKGxheWVyRm9yVGFyZ2V0VW5kZXJNb3VzZSAmJiAoIWxheWVyRm9yTGFzdFRhcmdldCB8fCBs
YXllckZvclRhcmdldFVuZGVyTW91c2UgIT0gbGF5ZXJGb3JMYXN0VGFyZ2V0KSkpIHsKKyAgICAg
ICAgLy8gVGhlIG1vdXNlIGhhcyBtb3ZlZCBiZXR3ZWVuIGxheWVycy4KKyAgICAgICAgaWYgKHBh
Z2UtPmNvbnRhaW5zU2Nyb2xsYWJsZUFyZWEobGF5ZXJGb3JUYXJnZXRVbmRlck1vdXNlKSkKKyAg
ICAgICAgICAgIGxheWVyRm9yVGFyZ2V0VW5kZXJNb3VzZS0+c2Nyb2xsQW5pbWF0b3IoKS0+bW91
c2VFbnRlcmVkQ29udGVudEFyZWEoKTsKICAgICB9CisKKyAgICBpZiAobGFzdE5vZGVVbmRlck1v
dXNlICYmIGxhc3ROb2RlVW5kZXJNb3VzZS0+ZG9jdW1lbnQoKSAhPSBtX2ZyYW1lLT5kb2N1bWVu
dCgpKSB7CisgICAgICAgIG1fbGFzdFRhcmdldFVuZGVyTW91c2UgPSAwOworICAgICAgICBtX2xh
c3RTY3JvbGxiYXJVbmRlck1vdXNlID0gMDsKKyAgICAgICAgbGFzdE5vZGVVbmRlck1vdXNlID0g
MDsKKyAgICB9CisKKyAgICBpZiAobV9sYXN0VGFyZ2V0VW5kZXJNb3VzZSAhPSBtX3RhcmdldFVu
ZGVyTW91c2UpIHsKKyAgICAgICAgLy8gc2VuZCBtb3VzZW91dCBldmVudCB0byB0aGUgb2xkIHRh
cmdldAorICAgICAgICBpZiAobGFzdE5vZGVVbmRlck1vdXNlKQorICAgICAgICAgICAgRXZlbnRE
aXNwYXRjaGVyOjpkaXNwYXRjaEV2ZW50KG1fbGFzdFRhcmdldFVuZGVyTW91c2UuZ2V0KCksIE1v
dXNlRXZlbnREaXNwYXRjaE1lZGlhdG9yOjpjcmVhdGUoTW91c2VFdmVudDo6Y3JlYXRlKGV2ZW50
TmFtZXMoKS5tb3VzZW91dEV2ZW50LCBsYXN0Tm9kZVVuZGVyTW91c2UtPmRvY3VtZW50KCktPmRl
ZmF1bHRWaWV3KCksIG1vdXNlRXZlbnQsIDAsIG5vZGVVbmRlck1vdXNlKSkpOworCisgICAgICAg
IC8vIHNlbmQgbW91c2VvdmVyIGV2ZW50IHRvIHRoZSBuZXcgdGFyZ2V0CisgICAgICAgIGlmIChu
b2RlVW5kZXJNb3VzZSkKKyAgICAgICAgICAgIEV2ZW50RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hFdmVu
dChtX3RhcmdldFVuZGVyTW91c2UuZ2V0KCksIE1vdXNlRXZlbnREaXNwYXRjaE1lZGlhdG9yOjpj
cmVhdGUoTW91c2VFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS5tb3VzZW92ZXJFdmVudCwgbm9k
ZVVuZGVyTW91c2UtPmRvY3VtZW50KCktPmRlZmF1bHRWaWV3KCksIG1vdXNlRXZlbnQsIDAsIGxh
c3ROb2RlVW5kZXJNb3VzZSkpKTsKKyAgICB9CisKKyAgICBtX2xhc3RUYXJnZXRVbmRlck1vdXNl
ID0gbV90YXJnZXRVbmRlck1vdXNlOwogfQogCi1ib29sIEV2ZW50SGFuZGxlcjo6ZGlzcGF0Y2hN
b3VzZUV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBOb2RlKiB0YXJnZXROb2Rl
LCBib29sIC8qY2FuY2VsYWJsZSovLCBpbnQgY2xpY2tDb3VudCwgY29uc3QgUGxhdGZvcm1Nb3Vz
ZUV2ZW50JiBtb3VzZUV2ZW50LCBib29sIHNldFVuZGVyKQorYm9vbCBFdmVudEhhbmRsZXI6OmRp
c3BhdGNoTW91c2VFdmVudChjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgRXZlbnRUYXJn
ZXQqIGV2ZW50VGFyZ2V0LCBib29sIC8qY2FuY2VsYWJsZSovLCBpbnQgY2xpY2tDb3VudCwgY29u
c3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBtb3VzZUV2ZW50LCBib29sIHNldFVuZGVyKQogewogICAg
IGlmIChGcmFtZVZpZXcqIHZpZXcgPSBtX2ZyYW1lLT52aWV3KCkpCiAgICAgICAgIHZpZXctPnJl
c2V0RGVmZXJyZWRSZXBhaW50RGVsYXkoKTsKIAotICAgIHVwZGF0ZU1vdXNlRXZlbnRUYXJnZXRO
b2RlKHRhcmdldE5vZGUsIG1vdXNlRXZlbnQsIHNldFVuZGVyKTsKKyAgICB1cGRhdGVNb3VzZUV2
ZW50VGFyZ2V0KGV2ZW50VGFyZ2V0LCBtb3VzZUV2ZW50LCBzZXRVbmRlcik7CiAKICAgICBib29s
IHN3YWxsb3dFdmVudCA9IGZhbHNlOwogCi0gICAgaWYgKG1fbm9kZVVuZGVyTW91c2UpCi0gICAg
ICAgIHN3YWxsb3dFdmVudCA9IG1fbm9kZVVuZGVyTW91c2UtPmRpc3BhdGNoTW91c2VFdmVudCht
b3VzZUV2ZW50LCBldmVudFR5cGUsIGNsaWNrQ291bnQpOworICAgIGlmIChtX3RhcmdldFVuZGVy
TW91c2UpCisgICAgICAgIHN3YWxsb3dFdmVudCA9IEV2ZW50RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hF
dmVudChtX3RhcmdldFVuZGVyTW91c2UuZ2V0KCksIE1vdXNlRXZlbnREaXNwYXRjaE1lZGlhdG9y
OjpjcmVhdGUoTW91c2VFdmVudDo6Y3JlYXRlKGV2ZW50VHlwZSwgbV9sYXN0VGFyZ2V0VW5kZXJN
b3VzZS0+dG9Ob2RlKCktPmRvY3VtZW50KCktPmRlZmF1bHRWaWV3KCksIG1vdXNlRXZlbnQsIGNs
aWNrQ291bnQsIDApKSk7CiAKICAgICBpZiAoIXN3YWxsb3dFdmVudCAmJiBldmVudFR5cGUgPT0g
ZXZlbnROYW1lcygpLm1vdXNlZG93bkV2ZW50KSB7CiAKQEAgLTIwNzgsNyArMjA2MSw3IEBAIGJv
b2wgRXZlbnRIYW5kbGVyOjpkaXNwYXRjaE1vdXNlRXZlbnQoY28KICAgICAgICAgLy8gQmx1ciBj
dXJyZW50IGZvY3VzIG5vZGUgd2hlbiBhIGxpbmsvYnV0dG9uIGlzIGNsaWNrZWQ7IHRoaXMKICAg
ICAgICAgLy8gaXMgZXhwZWN0ZWQgYnkgc29tZSBzaXRlcyB0aGF0IHJlbHkgb24gb25DaGFuZ2Ug
aGFuZGxlcnMgcnVubmluZwogICAgICAgICAvLyBmcm9tIGZvcm0gZmllbGRzIGJlZm9yZSB0aGUg
YnV0dG9uIGNsaWNrIGlzIHByb2Nlc3NlZC4KLSAgICAgICAgTm9kZSogbm9kZSA9IG1fbm9kZVVu
ZGVyTW91c2UuZ2V0KCk7CisgICAgICAgIE5vZGUqIG5vZGUgPSBtX3RhcmdldFVuZGVyTW91c2Ug
PyBtX3RhcmdldFVuZGVyTW91c2UtPnRvTm9kZSgpIDogMDsKIAogICAgICAgICAvLyBXYWxrIHVw
IHRoZSBET00gdHJlZSB0byBzZWFyY2ggZm9yIGEgbm9kZSB0byBmb2N1cy4KICAgICAgICAgd2hp
bGUgKG5vZGUpIHsKQEAgLTIyNzcsMTggKzIyNjAsMjAgQEAgYm9vbCBFdmVudEhhbmRsZXI6OnNl
bmRDb250ZXh0TWVudUV2ZW50KAogICAgIExheW91dFBvaW50IHZpZXdwb3J0UG9zID0gdi0+d2lu
ZG93VG9Db250ZW50cyhldmVudC5wb3MoKSk7CiAgICAgSGl0VGVzdFJlcXVlc3QgcmVxdWVzdChI
aXRUZXN0UmVxdWVzdDo6QWN0aXZlKTsKICAgICBNb3VzZUV2ZW50V2l0aEhpdFRlc3RSZXN1bHRz
IG1ldiA9IGRvYy0+cHJlcGFyZU1vdXNlRXZlbnQocmVxdWVzdCwgdmlld3BvcnRQb3MsIGV2ZW50
KTsKKyAgICBFdmVudFRhcmdldCogZXZlbnRUYXJnZXQgPSBldmVudFRhcmdldEZyb21IaXRUZXN0
UmVzdWx0cyhtZXYpOworICAgIE5vZGUqIHRhcmdldE5vZGUgPSBldmVudFRhcmdldCA/IGV2ZW50
VGFyZ2V0LT50b05vZGUoKSA6IDA7CiAKICAgICBpZiAobV9mcmFtZS0+ZWRpdG9yKCktPmJlaGF2
aW9yKCkuc2hvdWxkU2VsZWN0T25Db250ZXh0dWFsTWVudUNsaWNrKCkKICAgICAgICAgJiYgIW1f
ZnJhbWUtPnNlbGVjdGlvbigpLT5jb250YWlucyh2aWV3cG9ydFBvcykKICAgICAgICAgLy8gRklY
TUU6IEluIHRoZSBlZGl0YWJsZSBjYXNlLCB3b3JkIHNlbGVjdGlvbiBzb21ldGltZXMgc2VsZWN0
cyBjb250ZW50IHRoYXQgaXNuJ3QgdW5kZXJuZWF0aCB0aGUgbW91c2UuCiAgICAgICAgIC8vIElm
IHRoZSBzZWxlY3Rpb24gaXMgbm9uLWVkaXRhYmxlLCB3ZSBkbyB3b3JkIHNlbGVjdGlvbiB0byBt
YWtlIGl0IGVhc2llciB0byB1c2UgdGhlIGNvbnRleHR1YWwgbWVudSBpdGVtcwogICAgICAgICAv
LyBhdmFpbGFibGUgZm9yIHRleHQgc2VsZWN0aW9ucy4gIEJ1dCBvbmx5IGlmIHdlJ3JlIGFib3Zl
IHRleHQuCi0gICAgICAgICYmIChtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+aXNDb250ZW50RWRpdGFi
bGUoKSB8fCAodGFyZ2V0Tm9kZShtZXYpICYmIHRhcmdldE5vZGUobWV2KS0+aXNUZXh0Tm9kZSgp
KSkpIHsKKyAgICAgICAgJiYgKG1fZnJhbWUtPnNlbGVjdGlvbigpLT5pc0NvbnRlbnRFZGl0YWJs
ZSgpIHx8ICh0YXJnZXROb2RlICYmIHRhcmdldE5vZGUtPmlzVGV4dE5vZGUoKSkpKSB7CiAgICAg
ICAgIG1fbW91c2VEb3duTWF5U3RhcnRTZWxlY3QgPSB0cnVlOyAvLyBjb250ZXh0IG1lbnUgZXZl
bnRzIGFyZSBhbHdheXMgYWxsb3dlZCB0byBwZXJmb3JtIGEgc2VsZWN0aW9uCiAgICAgICAgIHNl
bGVjdENsb3Nlc3RXb3JkT3JMaW5rRnJvbU1vdXNlRXZlbnQobWV2KTsKICAgICB9CiAKLSAgICBz
d2FsbG93RXZlbnQgPSBkaXNwYXRjaE1vdXNlRXZlbnQoZXZlbnROYW1lcygpLmNvbnRleHRtZW51
RXZlbnQsIHRhcmdldE5vZGUobWV2KSwgdHJ1ZSwgMCwgZXZlbnQsIGZhbHNlKTsKKyAgICBzd2Fs
bG93RXZlbnQgPSBkaXNwYXRjaE1vdXNlRXZlbnQoZXZlbnROYW1lcygpLmNvbnRleHRtZW51RXZl
bnQsIGV2ZW50VGFyZ2V0LCB0cnVlLCAwLCBldmVudCwgZmFsc2UpOwogICAgIAogICAgIHJldHVy
biBzd2FsbG93RXZlbnQ7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL0V2ZW50SGFuZGxl
ci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2UvRXZlbnRIYW5kbGVyLmgJKHJl
dmlzaW9uIDk2NTc1KQorKysgU291cmNlL1dlYkNvcmUvcGFnZS9FdmVudEhhbmRsZXIuaAkod29y
a2luZyBjb3B5KQpAQCAtNjgsNyArNjgsNiBAQCBjbGFzcyBQbGF0Zm9ybVdoZWVsRXZlbnQ7CiBj
bGFzcyBSZW5kZXJMYXllcjsKIGNsYXNzIFJlbmRlck9iamVjdDsKIGNsYXNzIFJlbmRlcldpZGdl
dDsKLWNsYXNzIFNWR0VsZW1lbnRJbnN0YW5jZTsKIGNsYXNzIFNjcm9sbGJhcjsKIGNsYXNzIFRl
eHRFdmVudDsKIGNsYXNzIFRvdWNoRXZlbnQ7CkBAIC0xMzgsNyArMTM3LDcgQEAgcHVibGljOgog
CiAgICAgTGF5b3V0UG9pbnQgY3VycmVudE1vdXNlUG9zaXRpb24oKSBjb25zdDsKIAotICAgIHN0
YXRpYyBGcmFtZSogc3ViZnJhbWVGb3JUYXJnZXROb2RlKE5vZGUqKTsKKyAgICBzdGF0aWMgRnJh
bWUqIHN1YmZyYW1lRm9yRXZlbnRUYXJnZXQoRXZlbnRUYXJnZXQqKTsKICAgICBzdGF0aWMgRnJh
bWUqIHN1YmZyYW1lRm9ySGl0VGVzdFJlc3VsdChjb25zdCBNb3VzZUV2ZW50V2l0aEhpdFRlc3RS
ZXN1bHRzJik7CiAKICAgICBib29sIHNjcm9sbE92ZXJmbG93KFNjcm9sbERpcmVjdGlvbiwgU2Ny
b2xsR3JhbnVsYXJpdHksIE5vZGUqIHN0YXJ0aW5nTm9kZSA9IDApOwpAQCAtMjIwLDEyICsyMTks
MTQgQEAgcHJpdmF0ZToKICNlbmRpZiAvLyBFTkFCTEUoRFJBR19TVVBQT1JUKQogCiAgICAgYm9v
bCBldmVudEFjdGl2YXRlZFZpZXcoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JikgY29uc3Q7Ci0g
ICAgYm9vbCB1cGRhdGVTZWxlY3Rpb25Gb3JNb3VzZURvd25EaXNwYXRjaGluZ1NlbGVjdFN0YXJ0
KE5vZGUqLCBjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiwgVGV4dEdyYW51bGFyaXR5KTsKKyAgICBi
b29sIHVwZGF0ZVNlbGVjdGlvbkZvck1vdXNlRG93bkRpc3BhdGNoaW5nU2VsZWN0U3RhcnQoRXZl
bnRUYXJnZXQqLCBjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiwgVGV4dEdyYW51bGFyaXR5KTsKICAg
ICB2b2lkIHNlbGVjdENsb3Nlc3RXb3JkRnJvbU1vdXNlRXZlbnQoY29uc3QgTW91c2VFdmVudFdp
dGhIaXRUZXN0UmVzdWx0cyYpOwogICAgIHZvaWQgc2VsZWN0Q2xvc2VzdFdvcmRPckxpbmtGcm9t
TW91c2VFdmVudChjb25zdCBNb3VzZUV2ZW50V2l0aEhpdFRlc3RSZXN1bHRzJik7CiAKICAgICBi
b29sIGhhbmRsZU1vdXNlRG91YmxlQ2xpY2tFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQm
KTsKIAorICAgIHN0YXRpYyBFdmVudFRhcmdldCogZXZlbnRUYXJnZXRGcm9tSGl0VGVzdFJlc3Vs
dHMoY29uc3QgTW91c2VFdmVudFdpdGhIaXRUZXN0UmVzdWx0cyYpOworICAgIHN0YXRpYyBFdmVu
dFRhcmdldCogZXZlbnRUYXJnZXRGcm9tSGl0VGVzdFJlc3VsdChjb25zdCBIaXRUZXN0UmVzdWx0
Jik7CiAgICAgc3RhdGljIE5vZGUqIHRhcmdldE5vZGUoY29uc3QgTW91c2VFdmVudFdpdGhIaXRU
ZXN0UmVzdWx0cyYpOwogICAgIHN0YXRpYyBOb2RlKiB0YXJnZXROb2RlKGNvbnN0IEhpdFRlc3RS
ZXN1bHQmKTsKIApAQCAtMjY0LDE0ICsyNjUsMTQgQEAgcHJpdmF0ZToKIAogICAgIE5vZGUqIG5v
ZGVVbmRlck1vdXNlKCkgY29uc3Q7CiAgICAgCi0gICAgdm9pZCB1cGRhdGVNb3VzZUV2ZW50VGFy
Z2V0Tm9kZShOb2RlKiwgY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiwgYm9vbCBmaXJlTW91c2VP
dmVyT3V0KTsKKyAgICB2b2lkIHVwZGF0ZU1vdXNlRXZlbnRUYXJnZXQoRXZlbnRUYXJnZXQqLCBj
b25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmLCBib29sIGZpcmVNb3VzZU92ZXJPdXQpOwogICAgIHZv
aWQgZmlyZU1vdXNlT3Zlck91dChib29sIGZpcmVNb3VzZU92ZXIgPSB0cnVlLCBib29sIGZpcmVN
b3VzZU91dCA9IHRydWUsIGJvb2wgdXBkYXRlTGFzdE5vZGVVbmRlck1vdXNlID0gdHJ1ZSk7CiAg
ICAgCiAgICAgTW91c2VFdmVudFdpdGhIaXRUZXN0UmVzdWx0cyBwcmVwYXJlTW91c2VFdmVudChj
b25zdCBIaXRUZXN0UmVxdWVzdCYsIGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOwogCi0gICAg
Ym9vbCBkaXNwYXRjaE1vdXNlRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUsIE5v
ZGUqIHRhcmdldCwgYm9vbCBjYW5jZWxhYmxlLCBpbnQgY2xpY2tDb3VudCwgY29uc3QgUGxhdGZv
cm1Nb3VzZUV2ZW50JiwgYm9vbCBzZXRVbmRlcik7CisgICAgYm9vbCBkaXNwYXRjaE1vdXNlRXZl
bnQoY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUsIEV2ZW50VGFyZ2V0KiwgYm9vbCBjYW5j
ZWxhYmxlLCBpbnQgY2xpY2tDb3VudCwgY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiwgYm9vbCBz
ZXRVbmRlcik7CiAjaWYgRU5BQkxFKERSQUdfU1VQUE9SVCkKLSAgICBib29sIGRpc3BhdGNoRHJh
Z0V2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBOb2RlKiB0YXJnZXQsIGNvbnN0
IFBsYXRmb3JtTW91c2VFdmVudCYsIENsaXBib2FyZCopOworICAgIGJvb2wgZGlzcGF0Y2hEcmFn
RXZlbnQoY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUsIEV2ZW50VGFyZ2V0KiwgY29uc3Qg
UGxhdGZvcm1Nb3VzZUV2ZW50JiwgQ2xpcGJvYXJkKik7CiAKICAgICB2b2lkIGZyZWVDbGlwYm9h
cmQoKTsKIApAQCAtMzQxLDcgKzM0Miw3IEBAIHByaXZhdGU6CiAKICAgICBib29sIG1fbW91c2VQ
cmVzc2VkOwogICAgIGJvb2wgbV9jYXB0dXJlc0RyYWdnaW5nOwotICAgIFJlZlB0cjxOb2RlPiBt
X21vdXNlUHJlc3NOb2RlOworICAgIFJlZlB0cjxFdmVudFRhcmdldD4gbV9tb3VzZVByZXNzVGFy
Z2V0OwogCiAgICAgYm9vbCBtX21vdXNlRG93bk1heVN0YXJ0U2VsZWN0OwogI2lmIEVOQUJMRShE
UkFHX1NVUFBPUlQpCkBAIC0zNzQsOCArMzc1LDYgQEAgcHJpdmF0ZToKIAogI2lmIEVOQUJMRShT
VkcpCiAgICAgYm9vbCBtX3N2Z1BhbjsKLSAgICBSZWZQdHI8U1ZHRWxlbWVudEluc3RhbmNlPiBt
X2luc3RhbmNlVW5kZXJNb3VzZTsKLSAgICBSZWZQdHI8U1ZHRWxlbWVudEluc3RhbmNlPiBtX2xh
c3RJbnN0YW5jZVVuZGVyTW91c2U7CiAjZW5kaWYKIAogICAgIFJlbmRlckxheWVyKiBtX3Jlc2l6
ZUxheWVyOwpAQCAtMzgzLDE2ICszODIsMTYgQEAgcHJpdmF0ZToKICAgICBSZWZQdHI8Tm9kZT4g
bV9jYXB0dXJpbmdNb3VzZUV2ZW50c05vZGU7CiAgICAgYm9vbCBtX2V2ZW50SGFuZGxlcldpbGxS
ZXNldENhcHR1cmluZ01vdXNlRXZlbnRzTm9kZTsKICAgICAKLSAgICBSZWZQdHI8Tm9kZT4gbV9u
b2RlVW5kZXJNb3VzZTsKLSAgICBSZWZQdHI8Tm9kZT4gbV9sYXN0Tm9kZVVuZGVyTW91c2U7Cisg
ICAgUmVmUHRyPEV2ZW50VGFyZ2V0PiBtX3RhcmdldFVuZGVyTW91c2U7CisgICAgUmVmUHRyPEV2
ZW50VGFyZ2V0PiBtX2xhc3RUYXJnZXRVbmRlck1vdXNlOwogICAgIFJlZlB0cjxGcmFtZT4gbV9s
YXN0TW91c2VNb3ZlRXZlbnRTdWJmcmFtZTsKICAgICBSZWZQdHI8U2Nyb2xsYmFyPiBtX2xhc3RT
Y3JvbGxiYXJVbmRlck1vdXNlOwogCiAgICAgaW50IG1fY2xpY2tDb3VudDsKLSAgICBSZWZQdHI8
Tm9kZT4gbV9jbGlja05vZGU7CisgICAgUmVmUHRyPEV2ZW50VGFyZ2V0PiBtX2NsaWNrVGFyZ2V0
OwogCiAjaWYgRU5BQkxFKERSQUdfU1VQUE9SVCkKLSAgICBSZWZQdHI8Tm9kZT4gbV9kcmFnVGFy
Z2V0OworICAgIFJlZlB0cjxFdmVudFRhcmdldD4gbV9kcmFnVGFyZ2V0OwogICAgIGJvb2wgbV9z
aG91bGRPbmx5RmlyZURyYWdPdmVyRXZlbnQ7CiAjZW5kaWYKICAgICAKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BhZ2UvbWFjL0V2ZW50SGFuZGxlck1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9wYWdlL21hYy9FdmVudEhhbmRsZXJNYWMubW0JKHJldmlzaW9uIDk2NTc1KQorKysg
U291cmNlL1dlYkNvcmUvcGFnZS9tYWMvRXZlbnRIYW5kbGVyTWFjLm1tCSh3b3JraW5nIGNvcHkp
CkBAIC0xNDMsNyArMTQzLDkgQEAgdm9pZCBFdmVudEhhbmRsZXI6OmZvY3VzRG9jdW1lbnRWaWV3
KCkKIGJvb2wgRXZlbnRIYW5kbGVyOjpwYXNzV2lkZ2V0TW91c2VEb3duRXZlbnRUb1dpZGdldChj
b25zdCBNb3VzZUV2ZW50V2l0aEhpdFRlc3RSZXN1bHRzJiBldmVudCkKIHsKICAgICAvLyBGaWd1
cmUgb3V0IHdoaWNoIHZpZXcgdG8gc2VuZCB0aGUgZXZlbnQgdG8uCi0gICAgUmVuZGVyT2JqZWN0
KiB0YXJnZXQgPSB0YXJnZXROb2RlKGV2ZW50KSA/IHRhcmdldE5vZGUoZXZlbnQpLT5yZW5kZXJl
cigpIDogMDsKKyAgICBFdmVudFRhcmdldCogZXZlbnRUYXJnZXQgPSBldmVudFRhcmdldEZyb21I
aXRUZXN0UmVzdWx0cyhldmVudCk7CisgICAgTm9kZSogdGFyZ2V0Tm9kZSA9IGV2ZW50VGFyZ2V0
ID8gZXZlbnRUYXJnZXQtPnRvTm9kZSgpIDogMDsKKyAgICBSZW5kZXJPYmplY3QqIHRhcmdldCA9
IHRhcmdldE5vZGUgPyB0YXJnZXROb2RlLT5yZW5kZXJlcigpIDogMDsKICAgICBpZiAoIXRhcmdl
dCB8fCAhdGFyZ2V0LT5pc1dpZGdldCgpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgCkBA
IC0zNTcsNyArMzU5LDggQEAgYm9vbCBFdmVudEhhbmRsZXI6OnBhc3NTdWJmcmFtZUV2ZW50VG9T
dQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIAogICAgICAgICBjYXNlIE5TTGVm
dE1vdXNlRG93bjogewotICAgICAgICAgICAgTm9kZSogbm9kZSA9IHRhcmdldE5vZGUoZXZlbnQp
OworICAgICAgICAgICAgRXZlbnRUYXJnZXQqIGV2ZW50VGFyZ2V0ID0gZXZlbnRUYXJnZXRGcm9t
SGl0VGVzdFJlc3VsdHMoZXZlbnQpOworICAgICAgICAgICAgTm9kZSogbm9kZSA9IGV2ZW50VGFy
Z2V0ID8gZXZlbnRUYXJnZXQtPnRvTm9kZSgpIDogMDsKICAgICAgICAgICAgIGlmICghbm9kZSkK
ICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICBSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIoKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0ltYWdlU291cmNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvSW1hZ2VTb3VyY2UuaAkocmV2aXNpb24gOTY1NzUpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9JbWFnZVNvdXJjZS5oCSh3b3JraW5nIGNvcHkp
CkBAIC02MSw2ICs2MSw4IEBAIGNsYXNzIEludFNpemU7CiBjbGFzcyBTaGFyZWRCdWZmZXI7CiAK
ICNpZiBVU0UoQ0cpCitjbGFzcyBJbWFnZUJ1ZmZlcjsKK3ZvaWQgZHVtcENHSW1hZ2UoSW1hZ2VC
dWZmZXIqKTsKICNpZiBVU0UoV0VCS0lUX0lNQUdFX0RFQ09ERVJTKQogY2xhc3MgSW1hZ2VEZWNv
ZGVyOwogdHlwZWRlZiBJbWFnZURlY29kZXIqIE5hdGl2ZUltYWdlU291cmNlUHRyOwpJbmRleDog
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvSW1hZ2VTb3VyY2VDR01hYy5tbQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9JbWFnZVNv
dXJjZUNHTWFjLm1tCShyZXZpc2lvbiA5NjU3NSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2NnL0ltYWdlU291cmNlQ0dNYWMubW0JKHdvcmtpbmcgY29weSkKQEAgLTI5LDYg
KzI5LDQ0IEBACiAjaW1wb3J0ICJQbGF0Zm9ybVN0cmluZy5oIgogI2ltcG9ydCAid3RmL1JldGFp
blB0ci5oIgogCisjaWZuZGVmIE5ERUJVRworI2ltcG9ydCAiSW1hZ2VCdWZmZXIuaCIKKyNpbXBv
cnQgIkltYWdlLmgiCisKKy8vIEV4dHJlbWx5IGhlbHBmdWwgZGVidWdnaW5nIHV0aWxpdGllcyBm
b3IgYW55IHBhaW50IHNlcnZlciAvIHJlc291cmNlIHRoYXQgY3JlYXRlcworLy8gaW50ZXJuYWwg
aW1hZ2UgYnVmZmVycyAoaWUuIGdyYWRpZW50cyBvbiB0ZXh0LCBtYXNrcywgZmlsdGVycy4uLikK
K3N0YXRpYyB2b2lkIGR1bXBDSU91dHB1dEltYWdlKENJSW1hZ2UqIG91dHB1dEltYWdlLCBOU1N0
cmluZyogZmlsZU5hbWUpCit7CisgICAgQ0dTaXplIGV4dGVudFNpemUgPSBbb3V0cHV0SW1hZ2Ug
ZXh0ZW50XS5zaXplOworICAgIE5TSW1hZ2UqIGltYWdlID0gW1tbTlNJbWFnZSBhbGxvY10gaW5p
dFdpdGhTaXplOk5TTWFrZVNpemUoZXh0ZW50U2l6ZS53aWR0aCwgZXh0ZW50U2l6ZS5oZWlnaHQp
XSBhdXRvcmVsZWFzZV07CisgICAgW2ltYWdlIGFkZFJlcHJlc2VudGF0aW9uOltOU0NJSW1hZ2VS
ZXAgaW1hZ2VSZXBXaXRoQ0lJbWFnZTpvdXRwdXRJbWFnZV1dOworCisgICAgTlNEYXRhKiBpbWFn
ZURhdGEgPSBbaW1hZ2UgVElGRlJlcHJlc2VudGF0aW9uXTsKKyAgICBOU0JpdG1hcEltYWdlUmVw
KiBpbWFnZVJlcCA9IFtOU0JpdG1hcEltYWdlUmVwIGltYWdlUmVwV2l0aERhdGE6aW1hZ2VEYXRh
XTsKKyAgICBpbWFnZURhdGEgPSBbaW1hZ2VSZXAgcmVwcmVzZW50YXRpb25Vc2luZ1R5cGU6TlNK
UEVHRmlsZVR5cGUgcHJvcGVydGllczpuaWxdOworCisgICAgW2ltYWdlRGF0YSB3cml0ZVRvRmls
ZTpmaWxlTmFtZSBhdG9taWNhbGx5OllFU107Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBDR091dHB1
dEltYWdlKENHSW1hZ2VSZWYgb3V0cHV0SW1hZ2UsIE5TU3RyaW5nKiBmaWxlTmFtZSkKK3sKKyAg
ICBpZiAoQ0lJbWFnZSogY2lPdXRwdXRJbWFnZSA9IFtDSUltYWdlIGltYWdlV2l0aENHSW1hZ2U6
b3V0cHV0SW1hZ2VdKQorICAgICAgICBkdW1wQ0lPdXRwdXRJbWFnZShjaU91dHB1dEltYWdlLCBm
aWxlTmFtZSk7Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK3ZvaWQgZHVtcENHSW1hZ2UoV2Vi
Q29yZTo6SW1hZ2VCdWZmZXIqIGZvbykKK3sKKyAgICBzdGF0aWMgaW50IHNfY291bnRlciA9IDA7
CisgICAgKytzX2NvdW50ZXI7CisKKyAgICBOU1N0cmluZyogZmlsZU5hbWUgPSBbTlNTdHJpbmcg
c3RyaW5nV2l0aEZvcm1hdDogQCJmb28lZC5qcGciLCBzX2NvdW50ZXJdOworICAgIFJlZlB0cjxX
ZWJDb3JlOjpJbWFnZT4gaW1hZ2UgPSBmb28tPmNvcHlJbWFnZSgpOworICAgIGR1bXBDR091dHB1
dEltYWdlKGltYWdlLT5nZXRDR0ltYWdlUmVmKCksIGZpbGVOYW1lKTsKK30KK30KKyNlbmRpZgor
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIFN0cmluZyBNSU1FVHlwZUZvckltYWdlU291cmNlVHlw
ZShjb25zdCBTdHJpbmcmIHV0aSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9IaXRU
ZXN0UmVzdWx0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSGl0
VGVzdFJlc3VsdC5jcHAJKHJldmlzaW9uIDk2NTc1KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL0hpdFRlc3RSZXN1bHQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04OSw2ICs4OSw5IEBAIEhp
dFRlc3RSZXN1bHQ6OkhpdFRlc3RSZXN1bHQoY29uc3QgTGF5b3UKIEhpdFRlc3RSZXN1bHQ6Okhp
dFRlc3RSZXN1bHQoY29uc3QgSGl0VGVzdFJlc3VsdCYgb3RoZXIpCiAgICAgOiBtX2lubmVyTm9k
ZShvdGhlci5pbm5lck5vZGUoKSkKICAgICAsIG1faW5uZXJOb25TaGFyZWROb2RlKG90aGVyLmlu
bmVyTm9uU2hhcmVkTm9kZSgpKQorI2lmIEVOQUJMRShTVkcpCisgICAgLCBtX2lubmVyTm9kZUlu
c3RhbmNlKG90aGVyLmlubmVyTm9kZUluc3RhbmNlKCkpCisjZW5kaWYKICAgICAsIG1fcG9pbnQo
b3RoZXIucG9pbnQoKSkKICAgICAsIG1fbG9jYWxQb2ludChvdGhlci5sb2NhbFBvaW50KCkpCiAg
ICAgLCBtX2lubmVyVVJMRWxlbWVudChvdGhlci5VUkxFbGVtZW50KCkpCkBAIC0xMTcsNiArMTIw
LDkgQEAgSGl0VGVzdFJlc3VsdCYgSGl0VGVzdFJlc3VsdDo6b3BlcmF0b3I9KAogewogICAgIG1f
aW5uZXJOb2RlID0gb3RoZXIuaW5uZXJOb2RlKCk7CiAgICAgbV9pbm5lck5vblNoYXJlZE5vZGUg
PSBvdGhlci5pbm5lck5vblNoYXJlZE5vZGUoKTsKKyNpZiBFTkFCTEUoU1ZHKQorICAgIG1faW5u
ZXJOb2RlSW5zdGFuY2UgPSBvdGhlci5pbm5lck5vZGVJbnN0YW5jZSgpOworI2VuZGlmCiAgICAg
bV9wb2ludCA9IG90aGVyLnBvaW50KCk7CiAgICAgbV9sb2NhbFBvaW50ID0gb3RoZXIubG9jYWxQ
b2ludCgpOwogICAgIG1faW5uZXJVUkxFbGVtZW50ID0gb3RoZXIuVVJMRWxlbWVudCgpOwpAQCAt
MTYxLDYgKzE2NywxMyBAQCB2b2lkIEhpdFRlc3RSZXN1bHQ6OnNldElubmVyTm9uU2hhcmVkTm9k
CiAgICAgbV9pbm5lck5vblNoYXJlZE5vZGUgPSBuOwogfQogCisjaWYgRU5BQkxFKFNWRykKK3Zv
aWQgSGl0VGVzdFJlc3VsdDo6c2V0SW5uZXJOb2RlSW5zdGFuY2UoU1ZHRWxlbWVudEluc3RhbmNl
KiBuKQoreworICAgIG1faW5uZXJOb2RlSW5zdGFuY2UgPSBuOworfQorI2VuZGlmCisKIHZvaWQg
SGl0VGVzdFJlc3VsdDo6c2V0VVJMRWxlbWVudChFbGVtZW50KiBuKSAKIHsgCiAgICAgbV9pbm5l
clVSTEVsZW1lbnQgPSBuOyAKQEAgLTYxMSw2ICs2MjQsOSBAQCB2b2lkIEhpdFRlc3RSZXN1bHQ6
OmFwcGVuZChjb25zdCBIaXRUZXN0CiAgICAgaWYgKCFtX2lubmVyTm9kZSAmJiBvdGhlci5pbm5l
ck5vZGUoKSkgewogICAgICAgICBtX2lubmVyTm9kZSA9IG90aGVyLmlubmVyTm9kZSgpOwogICAg
ICAgICBtX2lubmVyTm9uU2hhcmVkTm9kZSA9IG90aGVyLmlubmVyTm9uU2hhcmVkTm9kZSgpOwor
I2lmIEVOQUJMRShTVkcpCisgICAgICAgIG1faW5uZXJOb2RlSW5zdGFuY2UgPSBvdGhlci5pbm5l
ck5vZGVJbnN0YW5jZSgpOworI2VuZGlmCiAgICAgICAgIG1fbG9jYWxQb2ludCA9IG90aGVyLmxv
Y2FsUG9pbnQoKTsKICAgICAgICAgbV9pbm5lclVSTEVsZW1lbnQgPSBvdGhlci5VUkxFbGVtZW50
KCk7CiAgICAgICAgIG1fc2Nyb2xsYmFyID0gb3RoZXIuc2Nyb2xsYmFyKCk7CkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvSGl0VGVzdFJlc3VsdC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9IaXRUZXN0UmVzdWx0LmgJKHJldmlzaW9uIDk2NTc1KQorKysg
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0hpdFRlc3RSZXN1bHQuaAkod29ya2luZyBjb3B5KQpA
QCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgogI2luY2x1ZGUgIkxheW91
dFR5cGVzLmgiCiAjaW5jbHVkZSAiVGV4dERpcmVjdGlvbi5oIgorI2luY2x1ZGUgIlNWR0VsZW1l
bnRJbnN0YW5jZS5oIgogI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CiAjaW5jbHVkZSA8d3RmL0xp
c3RIYXNoU2V0Lmg+CiAjaW5jbHVkZSA8d3RmL093blB0ci5oPgpAQCAtNTUsNiArNTYsMTAgQEAg
cHVibGljOgogCiAgICAgTm9kZSogaW5uZXJOb2RlKCkgY29uc3QgeyByZXR1cm4gbV9pbm5lck5v
ZGUuZ2V0KCk7IH0KICAgICBOb2RlKiBpbm5lck5vblNoYXJlZE5vZGUoKSBjb25zdCB7IHJldHVy
biBtX2lubmVyTm9uU2hhcmVkTm9kZS5nZXQoKTsgfQorI2lmIEVOQUJMRShTVkcpCisgICAgU1ZH
RWxlbWVudEluc3RhbmNlKiBpbm5lck5vZGVJbnN0YW5jZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5u
ZXJOb2RlSW5zdGFuY2UuZ2V0KCk7IH0KKyNlbmRpZgorICAgIEV2ZW50VGFyZ2V0KiBpbm5lckV2
ZW50VGFyZ2V0KCkgY29uc3Q7CiAgICAgTGF5b3V0UG9pbnQgcG9pbnQoKSBjb25zdCB7IHJldHVy
biBtX3BvaW50OyB9CiAgICAgTGF5b3V0UG9pbnQgbG9jYWxQb2ludCgpIGNvbnN0IHsgcmV0dXJu
IG1fbG9jYWxQb2ludDsgfQogICAgIEVsZW1lbnQqIFVSTEVsZW1lbnQoKSBjb25zdCB7IHJldHVy
biBtX2lubmVyVVJMRWxlbWVudC5nZXQoKTsgfQpAQCAtNjgsNiArNzMsOSBAQCBwdWJsaWM6CiAK
ICAgICB2b2lkIHNldElubmVyTm9kZShOb2RlKik7CiAgICAgdm9pZCBzZXRJbm5lck5vblNoYXJl
ZE5vZGUoTm9kZSopOworI2lmIEVOQUJMRShTVkcpCisgICAgdm9pZCBzZXRJbm5lck5vZGVJbnN0
YW5jZShTVkdFbGVtZW50SW5zdGFuY2UqKTsKKyNlbmRpZgogICAgIHZvaWQgc2V0UG9pbnQoY29u
c3QgTGF5b3V0UG9pbnQmIHApIHsgbV9wb2ludCA9IHA7IH0KICAgICB2b2lkIHNldExvY2FsUG9p
bnQoY29uc3QgTGF5b3V0UG9pbnQmIHApIHsgbV9sb2NhbFBvaW50ID0gcDsgfQogICAgIHZvaWQg
c2V0VVJMRWxlbWVudChFbGVtZW50Kik7CkBAIC0xMzIsNiArMTQwLDkgQEAgcHJpdmF0ZToKIAog
ICAgIFJlZlB0cjxOb2RlPiBtX2lubmVyTm9kZTsKICAgICBSZWZQdHI8Tm9kZT4gbV9pbm5lck5v
blNoYXJlZE5vZGU7CisjaWYgRU5BQkxFKFNWRykKKyAgICBSZWZQdHI8U1ZHRWxlbWVudEluc3Rh
bmNlPiBtX2lubmVyTm9kZUluc3RhbmNlOworI2VuZGlmCiAgICAgTGF5b3V0UG9pbnQgbV9wb2lu
dDsKICAgICBMYXlvdXRQb2ludCBtX2xvY2FsUG9pbnQ7IC8vIEEgcG9pbnQgaW4gdGhlIGxvY2Fs
IGNvb3JkaW5hdGUgc3BhY2Ugb2YgbV9pbm5lck5vblNoYXJlZE5vZGUncyByZW5kZXJlci4gQWxs
b3dzIHVzIHRvIGVmZmljaWVudGx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBk
ZXRlcm1pbmUgd2hlcmUgaW5zaWRlIHRoZSByZW5kZXJlciB3ZSBoaXQgb24gc3Vic2VxdWVudCBv
cGVyYXRpb25zLgpAQCAtMTYxLDYgKzE3MiwxNSBAQCBpbmxpbmUgTGF5b3V0UmVjdCBIaXRUZXN0
UmVzdWx0OjpyZWN0Rm9yCiAKIFN0cmluZyBkaXNwbGF5U3RyaW5nKGNvbnN0IFN0cmluZyYsIGNv
bnN0IE5vZGUqKTsKIAoraW5saW5lIEV2ZW50VGFyZ2V0KiBIaXRUZXN0UmVzdWx0Ojppbm5lckV2
ZW50VGFyZ2V0KCkgY29uc3QKK3sKKyNpZiBFTkFCTEUoU1ZHKQorICAgIGlmIChTVkdFbGVtZW50
SW5zdGFuY2UqIGluc3RhbmNlID0gaW5uZXJOb2RlSW5zdGFuY2UoKSkKKyAgICAgICAgcmV0dXJu
IGluc3RhbmNlOworI2VuZGlmCisgICAgcmV0dXJuIGlubmVyTm9kZSgpOworfQorCiB9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCiAKICNlbmRpZiAvLyBIaXRUZXN0UmVzdWx0X2gKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCShyZXZpc2lvbiA5NjU3NSkKKysr
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC04Niw2ICs4Niw3IEBAIHN0YXRpYyB2b2lkKiBiYXNlT2ZSZW5kZXJPYmplY3RCZWluZ0Rl
bGUKICNlbmRpZgogCiBib29sIFJlbmRlck9iamVjdDo6c19hZmZlY3RzUGFyZW50QmxvY2sgPSBm
YWxzZTsKK2Jvb2wgUmVuZGVyT2JqZWN0OjpzX21hcmtDb250YWluaW5nQmxvY2tzRm9yTGF5b3V0
QWxsb3dlZCA9IHRydWU7CiAKIHZvaWQqIFJlbmRlck9iamVjdDo6b3BlcmF0b3IgbmV3KHNpemVf
dCBzeiwgUmVuZGVyQXJlbmEqIHJlbmRlckFyZW5hKSB0aHJvdygpCiB7CkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5oCShyZXZpc2lvbiA5NjU3NSkKKysrIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuaAkod29ya2luZyBjb3B5KQpAQCAtMzky
LDYgKzM5Miw3IEBAIHB1YmxpYzoKICAgICAvLyB0byBhZGQgU1ZHIHJlbmRlcmVyIG1ldGhvZHMg
dG8gUmVuZGVyT2JqZWN0IHdpdGggYW4gQVNTRVJUX05PVF9SRUFDSEVEKCkgZGVmYXVsdCBpbXBs
ZW1lbnRhdGlvbi4KICAgICB2aXJ0dWFsIGJvb2wgaXNTVkdSb290KCkgY29uc3QgeyByZXR1cm4g
ZmFsc2U7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNTVkdDb250YWluZXIoKSBjb25zdCB7IHJldHVy
biBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpc1NWR0R1cGxpY2F0ZSgpIGNvbnN0IHsgcmV0
dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCBib29sIGlzU1ZHVmlld3BvcnRDb250YWluZXIoKSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfSAKICAgICB2aXJ0dWFsIGJvb2wgaXNTVkdHcmFkaWVudFN0
b3AoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwgYm9vbCBpc1NWR0hpZGRl
bkNvbnRhaW5lcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CkBAIC00MDUsNyArNDA2LDYgQEAg
cHVibGljOgogICAgIHZpcnR1YWwgYm9vbCBpc1NWR1Jlc291cmNlQ29udGFpbmVyKCkgY29uc3Qg
eyByZXR1cm4gZmFsc2U7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNTVkdSZXNvdXJjZUZpbHRlcigp
IGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCBib29sIGlzU1ZHUmVzb3VyY2VG
aWx0ZXJQcmltaXRpdmUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9v
bCBpc1NWR1NoYWRvd1RyZWVSb290Q29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0K
IAogICAgIHZpcnR1YWwgUmVuZGVyU1ZHUmVzb3VyY2VDb250YWluZXIqIHRvUmVuZGVyU1ZHUmVz
b3VyY2VDb250YWluZXIoKTsKIApAQCAtNzg2LDYgKzc4Niw4IEBAIHB1YmxpYzoKIAogICAgIHZp
cnR1YWwgdm9pZCBkZXN0cm95KCk7CiAKKyAgICBzdGF0aWMgdm9pZCBzZXRNYXJrQ29udGFpbmlu
Z0Jsb2Nrc0ZvckxheW91dEFsbG93ZWQoYm9vbCB2YWx1ZSkgeyBzX21hcmtDb250YWluaW5nQmxv
Y2tzRm9yTGF5b3V0QWxsb3dlZCA9IHZhbHVlOyB9CisKICAgICAvLyBWaXJ0dWFsIGZ1bmN0aW9u
IGhlbHBlcnMgZm9yIHRoZSBkZXByZWNhdGVkIEZsZXhpYmxlIEJveCBMYXlvdXQgKGRpc3BsYXk6
IC13ZWJraXQtYm94KS4KICAgICB2aXJ0dWFsIGJvb2wgaXNEZXByZWNhdGVkRmxleGlibGVCb3go
KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwgYm9vbCBpc0ZsZXhpbmdDaGls
ZHJlbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CkBAIC05MjgsNiArOTMwLDkgQEAgcHJpdmF0
ZToKIHByaXZhdGU6CiAgICAgLy8gU3RvcmUgc3RhdGUgYmV0d2VlbiBzdHlsZVdpbGxDaGFuZ2Ug
YW5kIHN0eWxlRGlkQ2hhbmdlCiAgICAgc3RhdGljIGJvb2wgc19hZmZlY3RzUGFyZW50QmxvY2s7
CisgCisgICAgLy8gVXNlZCB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIG1hcmtDb250YWluaW5nQmxv
Y2tzRm9yTGF5b3V0KCksIHdoZW4gbGF5aW5nIG91dCBvbmx5IGEgcGFydCBvZiBhIHRyZWUuCisg
ICAgc3RhdGljIGJvb2wgc19tYXJrQ29udGFpbmluZ0Jsb2Nrc0ZvckxheW91dEFsbG93ZWQ7CiB9
OwogCiBpbmxpbmUgYm9vbCBSZW5kZXJPYmplY3Q6OmRvY3VtZW50QmVpbmdEZXN0cm95ZWQoKSBj
b25zdApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdBbGxJbk9u
ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJT
VkdBbGxJbk9uZS5jcHAJKHJldmlzaW9uIDk2NTc1KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL3N2Zy9SZW5kZXJTVkdBbGxJbk9uZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3
LDcgQEAKIAogI2luY2x1ZGUgIlJlbmRlclNWR0Jsb2NrLmNwcCIKICNpbmNsdWRlICJSZW5kZXJT
VkdDb250YWluZXIuY3BwIgorI2luY2x1ZGUgIlJlbmRlclNWR0R1cGxpY2F0ZS5jcHAiCiAjaW5j
bHVkZSAiUmVuZGVyU1ZHRm9yZWlnbk9iamVjdC5jcHAiCiAjaW5jbHVkZSAiUmVuZGVyU1ZHR3Jh
ZGllbnRTdG9wLmNwcCIKICNpbmNsdWRlICJSZW5kZXJTVkdIaWRkZW5Db250YWluZXIuY3BwIgpA
QCAtNDgsNyArNDksNiBAQAogI2luY2x1ZGUgIlJlbmRlclNWR1Jlc291cmNlUmFkaWFsR3JhZGll
bnQuY3BwIgogI2luY2x1ZGUgIlJlbmRlclNWR1Jlc291cmNlU29saWRDb2xvci5jcHAiCiAjaW5j
bHVkZSAiUmVuZGVyU1ZHUm9vdC5jcHAiCi0jaW5jbHVkZSAiUmVuZGVyU1ZHU2hhZG93VHJlZVJv
b3RDb250YWluZXIuY3BwIgogI2luY2x1ZGUgIlJlbmRlclNWR1RTcGFuLmNwcCIKICNpbmNsdWRl
ICJSZW5kZXJTVkdUZXh0LmNwcCIKICNpbmNsdWRlICJSZW5kZXJTVkdUZXh0UGF0aC5jcHAiCkBA
IC02NCw3ICs2NCw2IEBACiAjaW5jbHVkZSAiU1ZHUmVzb3VyY2VzQ2FjaGUuY3BwIgogI2luY2x1
ZGUgIlNWR1Jlc291cmNlc0N5Y2xlU29sdmVyLmNwcCIKICNpbmNsdWRlICJTVkdSb290SW5saW5l
Qm94LmNwcCIKLSNpbmNsdWRlICJTVkdTaGFkb3dUcmVlRWxlbWVudHMuY3BwIgogI2luY2x1ZGUg
IlNWR1RleHRDaHVuay5jcHAiCiAjaW5jbHVkZSAiU1ZHVGV4dENodW5rQnVpbGRlci5jcHAiCiAj
aW5jbHVkZSAiU1ZHVGV4dExheW91dEF0dHJpYnV0ZXMuY3BwIgpJbmRleDogU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdEdXBsaWNhdGUuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHRHVwbGljYXRlLmNwcAkocmV2aXNp
b24gMCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHRHVwbGljYXRl
LmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw0NjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwor
ICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShTVkcpCisjaW5jbHVkZSAiUmVuZGVyU1ZH
RHVwbGljYXRlLmgiCisKKyNpbmNsdWRlICJDU1NTdHlsZVNlbGVjdG9yLmgiCisjaW5jbHVkZSAi
SGl0VGVzdFJlc3VsdC5oIgorI2luY2x1ZGUgIlJlbmRlclNWR1Jlc291cmNlQ2xpcHBlci5oIgor
I2luY2x1ZGUgIlJlbmRlclNWR1Jvb3QuaCIKKyNpbmNsdWRlICJSZW5kZXJTVkdWaWV3cG9ydENv
bnRhaW5lci5oIgorI2luY2x1ZGUgIlNWR0VsZW1lbnRJbnN0YW5jZS5oIgorI2luY2x1ZGUgIlNW
R0ltYWdlQnVmZmVyVG9vbHMuaCIKKyNpbmNsdWRlICJTVkdOYW1lcy5oIgorI2luY2x1ZGUgIlNW
R1VzZUVsZW1lbnQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitSZW5kZXJTVkdEdXBsaWNh
dGU6OlJlbmRlclNWR0R1cGxpY2F0ZShTVkdVc2VFbGVtZW50KiB1c2UpCisgICAgOiBSZW5kZXJT
VkdNb2RlbE9iamVjdCh1c2UpCisgICAgLCBtX25lZWRzQm91bmRhcmllc1VwZGF0ZSh0cnVlKQor
ICAgICwgbV9uZWVkc1RyYW5zZm9ybVVwZGF0ZSh0cnVlKQorICAgICwgbV9uZWVkc0ltYWdlVXBk
YXRlKHRydWUpCisgICAgLCBtX3VwZGF0ZXNBbGxvd2VkKHRydWUpCisgICAgLCBtX3JlZmVyZW5j
ZWRSZW5kZXJlcigwKQoreworfQorCitSZW5kZXJTVkdEdXBsaWNhdGU6On5SZW5kZXJTVkdEdXBs
aWNhdGUoKQoreworfQorCitib29sIFJlbmRlclNWR0R1cGxpY2F0ZTo6aGFzVmFsaWRWaWV3cG9y
dCgpIGNvbnN0Cit7CisgICAgUmVuZGVyT2JqZWN0KiBwYXJlbnQgPSB0aGlzLT5wYXJlbnQoKTsK
KyAgICB3aGlsZSAocGFyZW50KSB7CisgICAgICAgIGlmIChwYXJlbnQtPmlzU1ZHVmlld3BvcnRD
b250YWluZXIoKSkgeworICAgICAgICAgICAgaWYgKHRvUmVuZGVyU1ZHVmlld3BvcnRDb250YWlu
ZXIocGFyZW50KS0+dmlld3BvcnQoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBhcmVudCA9IHBhcmVudC0+cGFyZW50KCk7Cisg
ICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFJlbmRlclNWR0R1cGxpY2F0ZTo6bGF5
b3V0KCkKK3sKKyAgICBBU1NFUlQobmVlZHNMYXlvdXQoKSk7CisgICAgaWYgKCFtX3VwZGF0ZXNB
bGxvd2VkKSB7CisgICAgICAgIHNldE5lZWRzTGF5b3V0KGZhbHNlKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIExheW91dFJlcGFpbnRlciByZXBhaW50ZXIoKnRoaXMsIGNoZWNrRm9y
UmVwYWludER1cmluZ0xheW91dCgpICYmIHNlbGZOZWVkc0xheW91dCgpKTsKKyAgICBTVkdVc2VF
bGVtZW50KiB1c2UgPSBzdGF0aWNfY2FzdDxTVkdVc2VFbGVtZW50Kj4obm9kZSgpKTsKKworICAg
IGJvb2wgdHJhbnNmb3JtT3JCb3VuZGFyaWVzVXBkYXRlID0gbV9uZWVkc1RyYW5zZm9ybVVwZGF0
ZSB8fCBtX25lZWRzQm91bmRhcmllc1VwZGF0ZTsKKyAgICBpZiAobV9uZWVkc1RyYW5zZm9ybVVw
ZGF0ZSkgeworICAgICAgICBtX2xvY2FsVHJhbnNmb3JtID0gdXNlLT5hbmltYXRlZExvY2FsVHJh
bnNmb3JtKCk7CisgICAgICAgIG1fbmVlZHNUcmFuc2Zvcm1VcGRhdGUgPSBmYWxzZTsKKyAgICB9
CisKKyAgICAvLyBJbnZhbGlkYXRlIGFsbCByZXNvdXJjZXMgb2YgdGhpcyBjbGllbnQgaWYgb3Vy
IGxheW91dCBjaGFuZ2VkLgorICAgIGlmIChtX2V2ZXJIYWRMYXlvdXQgJiYgc2VsZk5lZWRzTGF5
b3V0KCkpCisgICAgICAgIFNWR1Jlc291cmNlc0NhY2hlOjpjbGllbnRMYXlvdXRDaGFuZ2VkKHRo
aXMpOworCisgICAgLy8gSWYgb3VyIGJvdW5kcyBjaGFuZ2VkLCBub3RpZnkgdGhlIHBhcmVudHMu
CisgICAgaWYgKHRyYW5zZm9ybU9yQm91bmRhcmllc1VwZGF0ZSkgeworICAgICAgICBpZiAodXBk
YXRlQ2FjaGVkQm91bmRhcmllc0FuZEltYWdlKCkpIHsKKyAgICAgICAgICAgIG1fbmVlZHNCb3Vu
ZGFyaWVzVXBkYXRlID0gZmFsc2U7CisgICAgICAgICAgICBtX25lZWRzSW1hZ2VVcGRhdGUgPSBm
YWxzZTsKKyAgICAgICAgfQorICAgICAgICBSZW5kZXJTVkdNb2RlbE9iamVjdDo6c2V0TmVlZHNC
b3VuZGFyaWVzVXBkYXRlKCk7CisgICAgfSBlbHNlIGlmIChtX25lZWRzSW1hZ2VVcGRhdGUpIHsK
KyAgICAgICAgdXBkYXRlQ2FjaGVkSW1hZ2UoKTsKKyAgICAgICAgbV9uZWVkc0ltYWdlVXBkYXRl
ID0gZmFsc2U7CisgICAgfQorCisgICAgcmVwYWludGVyLnJlcGFpbnRBZnRlckxheW91dCgpOwor
ICAgIHNldE5lZWRzTGF5b3V0KGZhbHNlKTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4g
UmVuZGVyU1ZHRHVwbGljYXRlOjpjcmVhdGVSZWZlcmVuY2VkU3R5bGUoKQoreworICAgIEFTU0VS
VChtX3JlZmVyZW5jZWRSZW5kZXJlcik7CisgICAgRWxlbWVudCogY29ycmVzcG9uZGluZ0VsZW1l
bnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obV9yZWZlcmVuY2VkUmVuZGVyZXItPm5vZGUoKSk7
CisKKyAgICAvLyBDb21wdXRlIHRoZSBzdHlsZSBvZiB0aGUgcmVmZXJlbmNlZCByZW5kZXJlciwg
YXMgaWYgaXQgd2FzIGEgY2hpbGQgb2YgdXMsIHRvIGRldGVybWluZSB0aGUgc3R5bGUgYXQgdGhl
IGluc2VydGlvbiBwb2ludCwgbm90IGF0IHRoZSBvcmlnaW5hbCBwbGFjZSBpbiB0aGUgZG9jdW1l
bnQuCisgICAgcmV0dXJuIGNvcnJlc3BvbmRpbmdFbGVtZW50LT5kb2N1bWVudCgpLT5zdHlsZVNl
bGVjdG9yKCktPnN0eWxlRm9yRWxlbWVudChjb3JyZXNwb25kaW5nRWxlbWVudCwgc3R5bGUoKSwg
ZmFsc2UpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVjYWxjU3R5bGVPZkFsbENoaWxkcmVu
KE5vZGUqIHN0YXJ0LCBOb2RlOjpTdHlsZUNoYW5nZSBzdHlsZUNoYW5nZSkKK3sKKyAgICAvLyBJ
bmZvcm0gY2hpbGRyZW4gdGhhdCB0aGUgc3R5bGUgaGFzIGNoYW5nZWQuCisgICAgZm9yIChOb2Rl
KiBub2RlID0gc3RhcnQtPmZpcnN0Q2hpbGQoKTsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHRTaWJs
aW5nKCkpIHsKKyAgICAgICAgaWYgKCFub2RlLT5pc0VsZW1lbnROb2RlKCkpCisgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19jYXN0PEVsZW1l
bnQqPihub2RlKTsKKyAgICAgICAgaWYgKHN0eWxlQ2hhbmdlID49IEVsZW1lbnQ6OkluaGVyaXQg
fHwgZWxlbWVudC0+Y2hpbGROZWVkc1N0eWxlUmVjYWxjKCkgfHwgZWxlbWVudC0+bmVlZHNTdHls
ZVJlY2FsYygpKQorICAgICAgICAgICAgZWxlbWVudC0+cmVjYWxjU3R5bGUoc3R5bGVDaGFuZ2Up
OworICAgIH0KK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gUmVuZGVyU1ZHRHVwbGljYXRl
Ojpzd2l0Y2hUb1JlZmVyZW5jZWRTdHlsZSgpCit7CisgICAgQVNTRVJUKG1fcmVmZXJlbmNlZFJl
bmRlcmVyKTsKKworICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVBdFVzZUluc2VydGlvblBv
aW50ID0gY3JlYXRlUmVmZXJlbmNlZFN0eWxlKCk7CisgICAgTm9kZTo6U3R5bGVDaGFuZ2Ugc3R5
bGVDaGFuZ2UgPSBOb2RlOjpkaWZmKHN0eWxlQXRVc2VJbnNlcnRpb25Qb2ludC5nZXQoKSwgbV9y
ZWZlcmVuY2VkUmVuZGVyZXItPnN0eWxlKCkpOworICAgIGlmIChzdHlsZUNoYW5nZSA9PSBOb2Rl
OjpOb0NoYW5nZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+
IG9yaWdpbmFsU3R5bGUgPSBtX3JlZmVyZW5jZWRSZW5kZXJlci0+c3R5bGUoKTsKKyAgICBtX3Jl
ZmVyZW5jZWRSZW5kZXJlci0+c2V0U3R5bGUoc3R5bGVBdFVzZUluc2VydGlvblBvaW50LnJlbGVh
c2UoKSk7CisgICAgcmVjYWxjU3R5bGVPZkFsbENoaWxkcmVuKG1fcmVmZXJlbmNlZFJlbmRlcmVy
LT5ub2RlKCksIHN0eWxlQ2hhbmdlKTsKKyAgICByZXR1cm4gb3JpZ2luYWxTdHlsZS5yZWxlYXNl
KCk7Cit9CisKK3ZvaWQgUmVuZGVyU1ZHRHVwbGljYXRlOjpzd2l0Y2hUb09yaWdpbmFsU3R5bGUo
UGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gb3JpZ2luYWxTdHlsZSkKK3sKKyAgICBBU1NFUlQob3Jp
Z2luYWxTdHlsZSk7CisgICAgQVNTRVJUKG1fcmVmZXJlbmNlZFJlbmRlcmVyKTsKKyAgICBtX3Jl
ZmVyZW5jZWRSZW5kZXJlci0+c2V0U3R5bGUob3JpZ2luYWxTdHlsZSk7CisgICAgcmVjYWxjU3R5
bGVPZkFsbENoaWxkcmVuKG1fcmVmZXJlbmNlZFJlbmRlcmVyLT5ub2RlKCksIE5vZGU6OkZvcmNl
KTsKK30KKwordm9pZCBSZW5kZXJTVkdEdXBsaWNhdGU6OnBhaW50VW5jYWNoZWRSZWZlcmVuY2Vk
Q29udGVudChQYWludEluZm8mIHBhaW50SW5mbykKK3sKKyAgICBpZiAoIW1fcmVmZXJlbmNlZFJl
bmRlcmVyKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBGb3JjZSBsYXlvdXQgb2YgdGhlIHJl
ZmVyZW5jZWQgcmVuZGVyZXIsIHdpdGggb3VyIG92ZXJyaWRlIHN0eWxlLgorICAgIG1fdXBkYXRl
c0FsbG93ZWQgPSBmYWxzZTsKKyAgICBtX3JlZmVyZW5jZWRSZW5kZXJlci0+c2V0TWFya0NvbnRh
aW5pbmdCbG9ja3NGb3JMYXlvdXRBbGxvd2VkKGZhbHNlKTsKKyAgICBwcm9wYWdhdGVWaWV3cG9y
dFRvUmVmZXJlbmVkQ29udGVudChtX3JlZmVyZW5jZWRSZW5kZXJlciwgdmlld3BvcnRTaXplKCkp
OworCisgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUF0VXNlSW5zZXJ0aW9uUG9pbnQgPSBj
cmVhdGVSZWZlcmVuY2VkU3R5bGUoKTsKKyAgICBOb2RlOjpTdHlsZUNoYW5nZSBzdHlsZUNoYW5n
ZSA9IE5vZGU6OmRpZmYoc3R5bGVBdFVzZUluc2VydGlvblBvaW50LmdldCgpLCBtX3JlZmVyZW5j
ZWRSZW5kZXJlci0+c3R5bGUoKSk7CisKKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG9yaWdpbmFs
U3R5bGUgPSBtX3JlZmVyZW5jZWRSZW5kZXJlci0+c3R5bGUoKTsKKyAgICBtX3JlZmVyZW5jZWRS
ZW5kZXJlci0+c2V0U3R5bGUoc3R5bGVBdFVzZUluc2VydGlvblBvaW50LnJlbGVhc2UoKSk7Cisg
ICAgcmVjYWxjU3R5bGVPZkFsbENoaWxkcmVuKG1fcmVmZXJlbmNlZFJlbmRlcmVyLT5ub2RlKCks
IHN0eWxlQ2hhbmdlKTsKKworICAgIG1fcmVmZXJlbmNlZFJlbmRlcmVyLT5zZXROZWVkc0xheW91
dCh0cnVlLCBmYWxzZSk7CisgICAgbV9yZWZlcmVuY2VkUmVuZGVyZXItPmxheW91dCgpOworCisg
ICAgLy8gRGlyZWN0bHkgcGFpbnQgcmVmZXJlbmNlZCBjb250ZW50LCBub3QgdGhlIGNhY2hlZCBp
bWFnZS4KKyAgICBtX3JlZmVyZW5jZWRSZW5kZXJlci0+cGFpbnQocGFpbnRJbmZvLCBJbnRQb2lu
dCgpKTsKKworICAgIC8vIFN3aXRjaCBiYWNrIHRvIG9yaWdpbmFsIHN0eWxlICYgbGF5b3V0Lgor
ICAgIGlmIChvcmlnaW5hbFN0eWxlKSB7CisgICAgICAgIHN3aXRjaFRvT3JpZ2luYWxTdHlsZShv
cmlnaW5hbFN0eWxlLnJlbGVhc2UoKSk7CisgICAgICAgIG1fcmVmZXJlbmNlZFJlbmRlcmVyLT5z
ZXROZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7CisgICAgICAgIG1fcmVmZXJlbmNlZFJlbmRlcmVy
LT5sYXlvdXQoKTsKKyAgICB9CisKKyAgICBwcm9wYWdhdGVWaWV3cG9ydFRvUmVmZXJlbmVkQ29u
dGVudChtX3JlZmVyZW5jZWRSZW5kZXJlciwgRmxvYXRTaXplKCkpOworICAgIG1fcmVmZXJlbmNl
ZFJlbmRlcmVyLT5zZXRNYXJrQ29udGFpbmluZ0Jsb2Nrc0ZvckxheW91dEFsbG93ZWQodHJ1ZSk7
CisgICAgbV91cGRhdGVzQWxsb3dlZCA9IHRydWU7Cit9CisKK3ZvaWQgUmVuZGVyU1ZHRHVwbGlj
YXRlOjp1cGRhdGVDYWNoZWRJbWFnZUFmdGVyU3R5bGVDaGFuZ2UoKQoreworICAgIEFTU0VSVCht
X3JlZmVyZW5jZWRSZW5kZXJlcik7CisKKyAgICBBZmZpbmVUcmFuc2Zvcm0gYWJzb2x1dGVUcmFu
c2Zvcm07CisgICAgU1ZHSW1hZ2VCdWZmZXJUb29sczo6Y2FsY3VsYXRlVHJhbnNmb3JtYXRpb25U
b091dGVybW9zdFNWR0Nvb3JkaW5hdGVTeXN0ZW0odGhpcywgYWJzb2x1dGVUcmFuc2Zvcm0pOwor
CisgICAgRmxvYXRSZWN0IGFic29sdXRlVGFyZ2V0UmVjdCA9IGFic29sdXRlVHJhbnNmb3JtLm1h
cFJlY3QobV9yZXBhaW50Qm91bmRpbmdCb3gpOworICAgIEZsb2F0UmVjdCBjbGFtcGVkQWJzb2x1
dGVUYXJnZXRSZWN0ID0gU1ZHSW1hZ2VCdWZmZXJUb29sczo6Y2xhbXBlZEFic29sdXRlVGFyZ2V0
UmVjdChhYnNvbHV0ZVRhcmdldFJlY3QpOworICAgIAorICAgIGlmIChtX2xhc3RBYnNvbHV0ZVRh
cmdldFJlY3QuaXNFbXB0eSgpIHx8IG1fbGFzdEFic29sdXRlVGFyZ2V0UmVjdCAhPSBhYnNvbHV0
ZVRhcmdldFJlY3QpIHsKKyAgICAgICAgaWYgKCFTVkdJbWFnZUJ1ZmZlclRvb2xzOjpjcmVhdGVJ
bWFnZUJ1ZmZlcihhYnNvbHV0ZVRhcmdldFJlY3QsIGNsYW1wZWRBYnNvbHV0ZVRhcmdldFJlY3Qs
IG1fY2FjaGVkSW1hZ2UsIENvbG9yU3BhY2VEZXZpY2VSR0IpKQorICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICBtX2xhc3RBYnNvbHV0ZVRhcmdldFJlY3QgPSBhYnNvbHV0ZVRhcmdldFJlY3Q7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUKG1fY2FjaGVkSW1hZ2UpOworICAgICAgICBJ
bnRTaXplIGltYWdlU2l6ZSA9IFNWR0ltYWdlQnVmZmVyVG9vbHM6OnJvdW5kZWRJbWFnZUJ1ZmZl
clNpemUoY2xhbXBlZEFic29sdXRlVGFyZ2V0UmVjdC5zaXplKCkpOworICAgICAgICBtX2NhY2hl
ZEltYWdlLT5jb250ZXh0KCktPmNsZWFyUmVjdChGbG9hdFJlY3QoRmxvYXRQb2ludCgpLCBpbWFn
ZVNpemUpKTsKKyAgICB9CisKKyAgICBBU1NFUlQoIW1fbGFzdEFic29sdXRlVGFyZ2V0UmVjdC5p
c0VtcHR5KCkpOworICAgIEFTU0VSVChtX2NhY2hlZEltYWdlKTsKKworICAgIEdyYXBoaWNzQ29u
dGV4dCogY2FjaGVkSW1hZ2VDb250ZXh0ID0gbV9jYWNoZWRJbWFnZS0+Y29udGV4dCgpOworICAg
IEFTU0VSVChjYWNoZWRJbWFnZUNvbnRleHQpOworICAgIGNhY2hlZEltYWdlQ29udGV4dC0+c2F2
ZSgpOworICAgIGNhY2hlZEltYWdlQ29udGV4dC0+dHJhbnNsYXRlKC1jbGFtcGVkQWJzb2x1dGVU
YXJnZXRSZWN0LngoKSwgLWNsYW1wZWRBYnNvbHV0ZVRhcmdldFJlY3QueSgpKTsKKyAgICBjYWNo
ZWRJbWFnZUNvbnRleHQtPmNvbmNhdENUTShhYnNvbHV0ZVRyYW5zZm9ybSk7CisgCisgICAgLy8g
RHJhdyB0aGUgY29udGVudCBpbnRvIHRoZSBJbWFnZUJ1ZmZlci4KKyAgICBBZmZpbmVUcmFuc2Zv
cm0gY29udGVudFRyYW5zZm9ybWF0aW9uOworICAgIFNWR0ltYWdlQnVmZmVyVG9vbHM6OnJlbmRl
clN1YnRyZWVUb0ltYWdlQnVmZmVyKG1fY2FjaGVkSW1hZ2UuZ2V0KCksIG1fcmVmZXJlbmNlZFJl
bmRlcmVyLCBjb250ZW50VHJhbnNmb3JtYXRpb24sIFNWR0ltYWdlQnVmZmVyVG9vbHM6OkluY2x1
ZGVJbmRpcmVjdENvbnRlbnQpOworCisgICAgY2FjaGVkSW1hZ2VDb250ZXh0LT5yZXN0b3JlKCk7
Cit9CisKK2Jvb2wgUmVuZGVyU1ZHRHVwbGljYXRlOjp1cGRhdGVDYWNoZWRCb3VuZGFyaWVzQW5k
SW1hZ2UoKQoreworICAgIGlmICghbV9yZWZlcmVuY2VkUmVuZGVyZXIpIHsKKyAgICAgICAgbV9v
YmplY3RCb3VuZGluZ0JveCA9IG1fc3Ryb2tlQm91bmRpbmdCb3ggPSBtX3JlcGFpbnRCb3VuZGlu
Z0JveCA9IEZsb2F0UmVjdCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBp
ZiAoIWhhc1ZhbGlkVmlld3BvcnQoKSkgeworICAgICAgICBtX2NhY2hlZEltYWdlLmNsZWFyKCk7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBGb3JjZSBsYXlvdXQgb2Yg
dGhlIHJlZmVyZW5jZWQgcmVuZGVyZXIsIHdpdGggb3VyIG92ZXJyaWRlIHN0eWxlLgorICAgIG1f
dXBkYXRlc0FsbG93ZWQgPSBmYWxzZTsKKyAgICBtX3JlZmVyZW5jZWRSZW5kZXJlci0+c2V0TWFy
a0NvbnRhaW5pbmdCbG9ja3NGb3JMYXlvdXRBbGxvd2VkKGZhbHNlKTsKKyAgICBwcm9wYWdhdGVW
aWV3cG9ydFRvUmVmZXJlbmVkQ29udGVudChtX3JlZmVyZW5jZWRSZW5kZXJlciwgdmlld3BvcnRT
aXplKCkpOworCisgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBvcmlnaW5hbFN0eWxlID0gc3dpdGNo
VG9SZWZlcmVuY2VkU3R5bGUoKTsKKyAgICBtX3JlZmVyZW5jZWRSZW5kZXJlci0+c2V0TmVlZHNM
YXlvdXQodHJ1ZSwgZmFsc2UpOworICAgIG1fcmVmZXJlbmNlZFJlbmRlcmVyLT5sYXlvdXQoKTsK
KworICAgIC8vIFVwZGF0ZSBjYWNoZWQgYm91bmRhcmllcy4KKyAgICBjb25zdCBBZmZpbmVUcmFu
c2Zvcm0mIGxvY2FsVG9QYXJlbnRUcmFuc2Zvcm0gPSBtX3JlZmVyZW5jZWRSZW5kZXJlci0+bG9j
YWxUb1BhcmVudFRyYW5zZm9ybSgpOworICAgIGlmIChsb2NhbFRvUGFyZW50VHJhbnNmb3JtLmlz
SWRlbnRpdHkoKSkgeworICAgICAgICBtX29iamVjdEJvdW5kaW5nQm94ID0gbV9yZWZlcmVuY2Vk
UmVuZGVyZXItPm9iamVjdEJvdW5kaW5nQm94KCk7CisgICAgICAgIG1fc3Ryb2tlQm91bmRpbmdC
b3ggPSBtX3JlZmVyZW5jZWRSZW5kZXJlci0+c3Ryb2tlQm91bmRpbmdCb3goKTsKKyAgICAgICAg
bV9yZXBhaW50Qm91bmRpbmdCb3ggPSBtX3JlZmVyZW5jZWRSZW5kZXJlci0+cmVwYWludFJlY3RJ
bkxvY2FsQ29vcmRpbmF0ZXMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX29iamVjdEJvdW5k
aW5nQm94ID0gbG9jYWxUb1BhcmVudFRyYW5zZm9ybS5tYXBSZWN0KG1fcmVmZXJlbmNlZFJlbmRl
cmVyLT5vYmplY3RCb3VuZGluZ0JveCgpKTsKKyAgICAgICAgbV9zdHJva2VCb3VuZGluZ0JveCA9
IGxvY2FsVG9QYXJlbnRUcmFuc2Zvcm0ubWFwUmVjdChtX3JlZmVyZW5jZWRSZW5kZXJlci0+c3Ry
b2tlQm91bmRpbmdCb3goKSk7CisgICAgICAgIG1fcmVwYWludEJvdW5kaW5nQm94ID0gbG9jYWxU
b1BhcmVudFRyYW5zZm9ybS5tYXBSZWN0KG1fcmVmZXJlbmNlZFJlbmRlcmVyLT5yZXBhaW50UmVj
dEluTG9jYWxDb29yZGluYXRlcygpKTsKKyAgICB9CisKKyAgICBTVkdSZW5kZXJTdXBwb3J0Ojpp
bnRlcnNlY3RSZXBhaW50UmVjdFdpdGhSZXNvdXJjZXModGhpcywgbV9yZXBhaW50Qm91bmRpbmdC
b3gpOworCisgICAgLy8gVXBkYXRlIGNhY2hlZCBpbWFnZS4KKyAgICB1cGRhdGVDYWNoZWRJbWFn
ZUFmdGVyU3R5bGVDaGFuZ2UoKTsKKworICAgIC8vIFN3aXRjaCBiYWNrIHRvIG9yaWdpbmFsIHN0
eWxlICYgbGF5b3V0LgorICAgIGlmIChvcmlnaW5hbFN0eWxlKSB7CisgICAgICAgIHN3aXRjaFRv
T3JpZ2luYWxTdHlsZShvcmlnaW5hbFN0eWxlLnJlbGVhc2UoKSk7CisgICAgICAgIG1fcmVmZXJl
bmNlZFJlbmRlcmVyLT5zZXROZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7CisgICAgICAgIG1fcmVm
ZXJlbmNlZFJlbmRlcmVyLT5sYXlvdXQoKTsKKyAgICB9CisKKyAgICBwcm9wYWdhdGVWaWV3cG9y
dFRvUmVmZXJlbmVkQ29udGVudChtX3JlZmVyZW5jZWRSZW5kZXJlciwgRmxvYXRTaXplKCkpOwor
ICAgIG1fcmVmZXJlbmNlZFJlbmRlcmVyLT5zZXRNYXJrQ29udGFpbmluZ0Jsb2Nrc0ZvckxheW91
dEFsbG93ZWQodHJ1ZSk7CisgICAgbV91cGRhdGVzQWxsb3dlZCA9IHRydWU7CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3ZvaWQgUmVuZGVyU1ZHRHVwbGljYXRlOjp1cGRhdGVDYWNoZWRJbWFnZSgp
Cit7CisgICAgaWYgKCFtX3JlZmVyZW5jZWRSZW5kZXJlcikKKyAgICAgICAgcmV0dXJuOworCisg
ICAgLy8gRm9yY2UgbGF5b3V0IG9mIHRoZSByZWZlcmVuY2VkIHJlbmRlcmVyLCB3aXRoIG91ciBv
dmVycmlkZSBzdHlsZS4KKyAgICBtX3VwZGF0ZXNBbGxvd2VkID0gZmFsc2U7CisgICAgbV9yZWZl
cmVuY2VkUmVuZGVyZXItPnNldE1hcmtDb250YWluaW5nQmxvY2tzRm9yTGF5b3V0QWxsb3dlZChm
YWxzZSk7CisgICAgcHJvcGFnYXRlVmlld3BvcnRUb1JlZmVyZW5lZENvbnRlbnQobV9yZWZlcmVu
Y2VkUmVuZGVyZXIsIHZpZXdwb3J0U2l6ZSgpKTsKKworICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4g
b3JpZ2luYWxTdHlsZSA9IHN3aXRjaFRvUmVmZXJlbmNlZFN0eWxlKCk7CisgICAgbV9yZWZlcmVu
Y2VkUmVuZGVyZXItPnNldE5lZWRzTGF5b3V0KHRydWUsIGZhbHNlKTsKKyAgICBtX3JlZmVyZW5j
ZWRSZW5kZXJlci0+bGF5b3V0KCk7CisKKyAgICAvLyBVcGRhdGUgY2FjaGVkIGltYWdlLgorICAg
IHVwZGF0ZUNhY2hlZEltYWdlQWZ0ZXJTdHlsZUNoYW5nZSgpOworCisgICAgLy8gU3dpdGNoIGJh
Y2sgdG8gb3JpZ2luYWwgc3R5bGUgJiBsYXlvdXQuCisgICAgaWYgKG9yaWdpbmFsU3R5bGUpIHsK
KyAgICAgICAgc3dpdGNoVG9PcmlnaW5hbFN0eWxlKG9yaWdpbmFsU3R5bGUucmVsZWFzZSgpKTsK
KyAgICAgICAgbV9yZWZlcmVuY2VkUmVuZGVyZXItPnNldE5lZWRzTGF5b3V0KHRydWUsIGZhbHNl
KTsKKyAgICAgICAgbV9yZWZlcmVuY2VkUmVuZGVyZXItPmxheW91dCgpOworICAgIH0KKworICAg
IHByb3BhZ2F0ZVZpZXdwb3J0VG9SZWZlcmVuZWRDb250ZW50KG1fcmVmZXJlbmNlZFJlbmRlcmVy
LCBGbG9hdFNpemUoKSk7CisgICAgbV9yZWZlcmVuY2VkUmVuZGVyZXItPnNldE1hcmtDb250YWlu
aW5nQmxvY2tzRm9yTGF5b3V0QWxsb3dlZCh0cnVlKTsKKyAgICBtX3VwZGF0ZXNBbGxvd2VkID0g
dHJ1ZTsKK30KKwordm9pZCBSZW5kZXJTVkdEdXBsaWNhdGU6OnVwZGF0ZUZyb21FbGVtZW50KCkK
K3sKKyAgICB1cGRhdGVGcm9tRWxlbWVudChTVkdFbGVtZW50SW5zdGFuY2U6OkxlYXZlSW5zdGFu
Y2VUcmVlKTsKK30KKwordm9pZCBSZW5kZXJTVkdEdXBsaWNhdGU6OnVwZGF0ZUZyb21FbGVtZW50
KFNWR0VsZW1lbnRJbnN0YW5jZTo6SW5zdGFuY2VJbnZhbGlkYXRpb25Nb2RlRmxhZ3MgbW9kZUZs
YWdzKQoreworICAgIGlmICghbV91cGRhdGVzQWxsb3dlZCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgUmVuZGVyU1ZHTW9kZWxPYmplY3Q6OnVwZGF0ZUZyb21FbGVtZW50KCk7CisKKyAgICBTVkdV
c2VFbGVtZW50KiB1c2UgPSBzdGF0aWNfY2FzdDxTVkdVc2VFbGVtZW50Kj4obm9kZSgpKTsKKyAg
ICBTVkdFbGVtZW50SW5zdGFuY2UqIGluc3RhbmNlUm9vdCA9IHVzZS0+aW5zdGFuY2VSb290KCk7
CisgICAgaWYgKG1vZGVGbGFncyAmIFNWR0VsZW1lbnRJbnN0YW5jZTo6UmVidWlsZEluc3RhbmNl
VHJlZSB8fCAhaW5zdGFuY2VSb290KSB7CisgICAgICAgIHVzZS0+YnVpbGRJbnN0YW5jZVRyZWUo
KTsKKyAgICAgICAgaW5zdGFuY2VSb290ID0gdXNlLT5pbnN0YW5jZVJvb3QoKTsKKyAgICB9CisK
KyAgICBSZW5kZXJPYmplY3QqIG9sZFJlZmVyZW5jZWRSZW5kZXJlciA9IG1fcmVmZXJlbmNlZFJl
bmRlcmVyOworICAgIFNWR0VsZW1lbnQqIGNvcnJlc3BvbmRpbmdFbGVtZW50ID0gaW5zdGFuY2VS
b290ID8gaW5zdGFuY2VSb290LT5jb3JyZXNwb25kaW5nRWxlbWVudCgpIDogMDsKKyAgICBtX3Jl
ZmVyZW5jZWRSZW5kZXJlciA9IGNvcnJlc3BvbmRpbmdFbGVtZW50ID8gY29ycmVzcG9uZGluZ0Vs
ZW1lbnQtPnJlbmRlcmVyKCkgOiAwOworICAgIEFTU0VSVChtX3JlZmVyZW5jZWRSZW5kZXJlciAh
PSB0aGlzKTsKKworICAgIGlmICghbV9yZWZlcmVuY2VkUmVuZGVyZXIgJiYgIW9sZFJlZmVyZW5j
ZWRSZW5kZXJlcikKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gTWFyayBvdXJzZWx2ZXMgZm9y
IHJlbGF5b3V0LgorICAgIGJvb2wgc2hvdWxkUmVwYWludCA9IG1vZGVGbGFncyAmIFNWR0VsZW1l
bnRJbnN0YW5jZTo6UmVwYWludFVzZVJlbmRlcmVyOworICAgIGlmICghc2hvdWxkUmVwYWludCkK
KyAgICAgICAgbV9uZWVkc0JvdW5kYXJpZXNVcGRhdGUgPSB0cnVlOworCisgICAgbV9uZWVkc0lt
YWdlVXBkYXRlID0gdHJ1ZTsKKyAgICBzZXROZWVkc0xheW91dCh0cnVlKTsKKworICAgIGlmIChz
aG91bGRSZXBhaW50KQorICAgICAgICByZXBhaW50KCk7Cit9CisKK0Zsb2F0U2l6ZSBSZW5kZXJT
VkdEdXBsaWNhdGU6OnZpZXdwb3J0U2l6ZSgpIGNvbnN0Cit7CisgICAgU1ZHVXNlRWxlbWVudCog
dXNlID0gc3RhdGljX2Nhc3Q8U1ZHVXNlRWxlbWVudCo+KG5vZGUoKSk7CisgICAgU1ZHTGVuZ3Ro
IHN5bWJvbFdpZHRoID0gdXNlLT5oYXNBdHRyaWJ1dGUoU1ZHTmFtZXM6OndpZHRoQXR0cikgPyB1
c2UtPndpZHRoKCkgOiBTVkdMZW5ndGgoTGVuZ3RoTW9kZVdpZHRoLCAiMTAwJSIpOworICAgIFNW
R0xlbmd0aCBzeW1ib2xIZWlnaHQgPSB1c2UtPmhhc0F0dHJpYnV0ZShTVkdOYW1lczo6aGVpZ2h0
QXR0cikgPyB1c2UtPmhlaWdodCgpIDogU1ZHTGVuZ3RoKExlbmd0aE1vZGVIZWlnaHQsICIxMDAl
Iik7CisgICAgcmV0dXJuIEZsb2F0U2l6ZShzeW1ib2xXaWR0aC52YWx1ZSh1c2UpLCBzeW1ib2xI
ZWlnaHQudmFsdWUodXNlKSk7Cit9CisKK3ZvaWQgUmVuZGVyU1ZHRHVwbGljYXRlOjpwcm9wYWdh
dGVWaWV3cG9ydFRvUmVmZXJlbmVkQ29udGVudChSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25z
dCBGbG9hdFNpemUmIHZpZXdwb3J0U2l6ZSkKK3sKKyAgICAvLyBTcGVjICg8dXNlPiBvbiA8c3lt
Ym9sPik6IFRoaXMgZ2VuZXJhdGVkICdzdmcnIHdpbGwgYWx3YXlzIGhhdmUgZXhwbGljaXQgdmFs
dWVzIGZvciBhdHRyaWJ1dGVzIHdpZHRoIGFuZCBoZWlnaHQuCisgICAgLy8gSWYgYXR0cmlidXRl
cyB3aWR0aCBhbmQvb3IgaGVpZ2h0IGFyZSBwcm92aWRlZCBvbiB0aGUgJ3VzZScgZWxlbWVudCwg
dGhlbiB0aGVzZSBhdHRyaWJ1dGVzCisgICAgLy8gd2lsbCBiZSB0cmFuc2ZlcnJlZCB0byB0aGUg
Z2VuZXJhdGVkICdzdmcnLiBJZiBhdHRyaWJ1dGVzIHdpZHRoIGFuZC9vciBoZWlnaHQgYXJlIG5v
dCBzcGVjaWZpZWQsCisgICAgLy8gdGhlIGdlbmVyYXRlZCAnc3ZnJyBlbGVtZW50IHdpbGwgdXNl
IHZhbHVlcyBvZiAxMDAlIGZvciB0aGVzZSBhdHRyaWJ1dGVzLgorICAgIGlmIChyZW5kZXJlci0+
aXNTVkdWaWV3cG9ydENvbnRhaW5lcigpKQorICAgICAgICB0b1JlbmRlclNWR1ZpZXdwb3J0Q29u
dGFpbmVyKHJlbmRlcmVyKS0+c2V0Vmlld3BvcnRTaXplKHZpZXdwb3J0U2l6ZSk7CisKKyAgICBm
b3IgKFJlbmRlck9iamVjdCogY3VycmVudCA9IHJlbmRlcmVyLT5maXJzdENoaWxkKCk7IGN1cnJl
bnQ7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0U2libGluZygpKQorICAgICAgICBwcm9wYWdhdGVW
aWV3cG9ydFRvUmVmZXJlbmVkQ29udGVudChjdXJyZW50LCB2aWV3cG9ydFNpemUpOworfQorCit2
b2lkIFJlbmRlclNWR0R1cGxpY2F0ZTo6cGFpbnQoUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0
IEludFBvaW50JikKK3sKKyAgICBpZiAocGFpbnRJbmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJs
ZWQoKSB8fCBzdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gSElEREVOIHx8ICFtX3JlZmVyZW5jZWRS
ZW5kZXJlcikKKyAgICAgICAgcmV0dXJuOworCisgICAgRmxvYXRSZWN0IGJvdW5kaW5nQm94ID0g
cmVwYWludFJlY3RJbkxvY2FsQ29vcmRpbmF0ZXMoKTsKKyAgICBpZiAoIVNWR1JlbmRlclN1cHBv
cnQ6OnBhaW50SW5mb0ludGVyc2VjdHNSZXBhaW50UmVjdChib3VuZGluZ0JveCwgbG9jYWxUb1Bh
cmVudFRyYW5zZm9ybSgpLCBwYWludEluZm8pKQorICAgICAgICByZXR1cm47CisKKyAgICBib29s
IGRyYXdzT3V0bGluZSA9IHN0eWxlKCktPm91dGxpbmVXaWR0aCgpICYmIChwYWludEluZm8ucGhh
c2UgPT0gUGFpbnRQaGFzZU91dGxpbmUgfHwgcGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VT
ZWxmT3V0bGluZSk7CisgICAgaWYgKCFkcmF3c091dGxpbmUgJiYgcGFpbnRJbmZvLnBoYXNlICE9
IFBhaW50UGhhc2VGb3JlZ3JvdW5kKQorICAgICAgICByZXR1cm47CisKKyAgICBQYWludEluZm8g
Y2hpbGRQYWludEluZm8ocGFpbnRJbmZvKTsKKyAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVy
IHN0YXRlU2F2ZXIoKmNoaWxkUGFpbnRJbmZvLmNvbnRleHQpOworICAgIGNoaWxkUGFpbnRJbmZv
LmFwcGx5VHJhbnNmb3JtKGxvY2FsVG9QYXJlbnRUcmFuc2Zvcm0oKSk7CisKKyAgICBib29sIHJl
bmRlcmluZ1RvSW1hZ2UgPSBTVkdJbWFnZUJ1ZmZlclRvb2xzOjpjdXJyZW50bHlSZW5kZXJpbmdU
b0ltYWdlKCk7CisgICAgaWYgKGNoaWxkUGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VGb3Jl
Z3JvdW5kKSB7CisgICAgICAgIFBhaW50SW5mbyBzYXZlZEluZm8oY2hpbGRQYWludEluZm8pOwor
ICAgICAgICBpZiAoU1ZHUmVuZGVyU3VwcG9ydDo6cHJlcGFyZVRvUmVuZGVyU1ZHQ29udGVudCh0
aGlzLCBjaGlsZFBhaW50SW5mbykpIHsKKyAgICAgICAgICAgIGlmIChyZW5kZXJpbmdUb0ltYWdl
KQorICAgICAgICAgICAgICAgIHBhaW50VW5jYWNoZWRSZWZlcmVuY2VkQ29udGVudChjaGlsZFBh
aW50SW5mbyk7CisgICAgICAgICAgICBlbHNlIGlmIChtX2NhY2hlZEltYWdlKSB7CisgICAgICAg
ICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIGFic29sdXRlVHJhbnNmb3JtOworICAgICAgICAgICAg
ICAgIFNWR0ltYWdlQnVmZmVyVG9vbHM6OmNhbGN1bGF0ZVRyYW5zZm9ybWF0aW9uVG9PdXRlcm1v
c3RTVkdDb29yZGluYXRlU3lzdGVtKHRoaXMsIGFic29sdXRlVHJhbnNmb3JtKTsKKworICAgICAg
ICAgICAgICAgIEZsb2F0UmVjdCBhYnNvbHV0ZVRhcmdldFJlY3QgPSBhYnNvbHV0ZVRyYW5zZm9y
bS5tYXBSZWN0KG1fcmVwYWludEJvdW5kaW5nQm94KTsKKyAgICAgICAgICAgICAgICBGbG9hdFJl
Y3QgY2xhbXBlZEFic29sdXRlVGFyZ2V0UmVjdCA9IFNWR0ltYWdlQnVmZmVyVG9vbHM6OmNsYW1w
ZWRBYnNvbHV0ZVRhcmdldFJlY3QoYWJzb2x1dGVUYXJnZXRSZWN0KTsKKworICAgICAgICAgICAg
ICAgIGNoaWxkUGFpbnRJbmZvLmNvbnRleHQtPmNvbmNhdENUTShhYnNvbHV0ZVRyYW5zZm9ybS5p
bnZlcnNlKCkpOworICAgICAgICAgICAgICAgIGNoaWxkUGFpbnRJbmZvLmNvbnRleHQtPmRyYXdJ
bWFnZUJ1ZmZlcihtX2NhY2hlZEltYWdlLmdldCgpLCBDb2xvclNwYWNlRGV2aWNlUkdCLCBjbGFt
cGVkQWJzb2x1dGVUYXJnZXRSZWN0KTsKKyAgICAgICAgICAgICAgICBjaGlsZFBhaW50SW5mby5j
b250ZXh0LT5jb25jYXRDVE0oYWJzb2x1dGVUcmFuc2Zvcm0pOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisKKyAgICAgICAgU1ZHUmVuZGVyU3VwcG9ydDo6ZmluaXNoUmVuZGVyU1ZHQ29udGVu
dCh0aGlzLCBjaGlsZFBhaW50SW5mbywgc2F2ZWRJbmZvLmNvbnRleHQpOworICAgIH0KKworICAg
IGlmIChkcmF3c091dGxpbmUpCisgICAgICAgIHBhaW50T3V0bGluZShjaGlsZFBhaW50SW5mby5j
b250ZXh0LCBJbnRSZWN0KGJvdW5kaW5nQm94KSk7Cit9CisKK2Jvb2wgUmVuZGVyU1ZHRHVwbGlj
YXRlOjpub2RlQXRGbG9hdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRU
ZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50SW5QYXJlbnQsIEhpdFRl
c3RBY3Rpb24gaGl0VGVzdEFjdGlvbikKK3sKKyAgICAvLyBXZSBvbmx5IGRyYXcgaW4gdGhlIGZv
cmdyb3VuZCBwaGFzZSwgc28gd2Ugb25seSBoaXQtdGVzdCB0aGVuLgorICAgIGlmIChoaXRUZXN0
QWN0aW9uICE9IEhpdFRlc3RGb3JlZ3JvdW5kIHx8ICFtX3JlZmVyZW5jZWRSZW5kZXJlcikKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgSGl0VGVzdFJlc3VsdCByZWZlcmVuY2VkUmVzdWx0
ID0gcmVzdWx0OworICAgIEZsb2F0UG9pbnQgbG9jYWxQb2ludCA9IGxvY2FsVG9QYXJlbnRUcmFu
c2Zvcm0oKS5pbnZlcnNlKCkubWFwUG9pbnQocG9pbnRJblBhcmVudCk7CisgICAgaWYgKG1fcmVm
ZXJlbmNlZFJlbmRlcmVyLT5ub2RlQXRGbG9hdFBvaW50KHJlcXVlc3QsIHJlZmVyZW5jZWRSZXN1
bHQsIGxvY2FsUG9pbnQsIGhpdFRlc3RBY3Rpb24pKSB7CisgICAgICAgIHVwZGF0ZUhpdFRlc3RS
ZXN1bHQocmVzdWx0LCByb3VuZGVkTGF5b3V0UG9pbnQobG9jYWxQb2ludCkpOworICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVy
U1ZHRHVwbGljYXRlOjphZGRGb2N1c1JpbmdSZWN0cyhWZWN0b3I8TGF5b3V0UmVjdD4mIHJlY3Rz
LCBjb25zdCBMYXlvdXRQb2ludCYpCit7CisgICAgTGF5b3V0UmVjdCBjb250ZW50UmVjdCA9IGVu
Y2xvc2luZ0xheW91dFJlY3QocmVwYWludFJlY3RJbkxvY2FsQ29vcmRpbmF0ZXMoKSk7CisgICAg
aWYgKCFjb250ZW50UmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJlY3RzLmFwcGVuZChjb250ZW50
UmVjdCk7Cit9CisKK2NvbnN0IEFmZmluZVRyYW5zZm9ybSYgUmVuZGVyU1ZHRHVwbGljYXRlOjps
b2NhbFRvUGFyZW50VHJhbnNmb3JtKCkgY29uc3QKK3sKKyAgICBTVkdVc2VFbGVtZW50KiB1c2Ug
PSBzdGF0aWNfY2FzdDxTVkdVc2VFbGVtZW50Kj4obm9kZSgpKTsKKyAgICBtX2xvY2FsVG9QYXJl
bnRUcmFuc2Zvcm0gPSBtX2xvY2FsVHJhbnNmb3JtOworICAgIG1fbG9jYWxUb1BhcmVudFRyYW5z
Zm9ybS50cmFuc2xhdGUodXNlLT54KCkudmFsdWUodXNlKSwgdXNlLT55KCkudmFsdWUodXNlKSk7
CisgICAgcmV0dXJuIG1fbG9jYWxUb1BhcmVudFRyYW5zZm9ybTsKK30KKwordm9pZCBSZW5kZXJT
VkdEdXBsaWNhdGU6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRGlmZmVyZW5jZSBkaWZmLCBjb25zdCBS
ZW5kZXJTdHlsZSogb2xkU3R5bGUpCit7CisgICAgaWYgKGRpZmYgPT0gU3R5bGVEaWZmZXJlbmNl
TGF5b3V0KQorICAgICAgICBtX25lZWRzSW1hZ2VVcGRhdGUgPSB0cnVlOworICAgIGVsc2UgaWYg
KGRpZmYgPT0gU3R5bGVEaWZmZXJlbmNlUmVwYWludCkgeworICAgICAgICB1cGRhdGVDYWNoZWRJ
bWFnZSgpOworICAgICAgICBtX25lZWRzSW1hZ2VVcGRhdGUgPSBmYWxzZTsKKyAgICB9CisKKyAg
ICBSZW5kZXJTVkdNb2RlbE9iamVjdDo6c3R5bGVEaWRDaGFuZ2UoZGlmZiwgb2xkU3R5bGUpOwor
fQorCit2b2lkIFJlbmRlclNWR0R1cGxpY2F0ZTo6dXBkYXRlSGl0VGVzdFJlc3VsdChIaXRUZXN0
UmVzdWx0JiByZXN1bHQsIGNvbnN0IExheW91dFBvaW50JiBwb2ludCkKK3sKKyAgICBSZW5kZXJT
VkdNb2RlbE9iamVjdDo6dXBkYXRlSGl0VGVzdFJlc3VsdChyZXN1bHQsIHBvaW50KTsKKyAgICBp
ZiAoIW1fcmVmZXJlbmNlZFJlbmRlcmVyKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQo
bV9yZWZlcmVuY2VkUmVuZGVyZXItPm5vZGUoKSk7CisgICAgQVNTRVJUKG1fcmVmZXJlbmNlZFJl
bmRlcmVyLT5ub2RlKCktPmlzU1ZHRWxlbWVudCgpKTsKKworICAgIGNvbnN0IEhhc2hTZXQ8U1ZH
RWxlbWVudEluc3RhbmNlKj4mIHNldCA9IHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihtX3JlZmVy
ZW5jZWRSZW5kZXJlci0+bm9kZSgpKS0+aW5zdGFuY2VzRm9yRWxlbWVudCgpOworICAgIGlmIChz
ZXQuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBIYXNoU2V0PFNWR0Vs
ZW1lbnRJbnN0YW5jZSo+OjppdGVyYXRvciBlbmQgPSBzZXQuZW5kKCk7CisgICAgZm9yIChIYXNo
U2V0PFNWR0VsZW1lbnRJbnN0YW5jZSo+OjppdGVyYXRvciBpdCA9IHNldC5iZWdpbigpOyBpdCAh
PSBlbmQ7ICsraXQpIHsKKyAgICAgICAgU1ZHRWxlbWVudEluc3RhbmNlKiBpbnN0YW5jZSA9ICpp
dDsKKyAgICAgICAgaWYgKGluc3RhbmNlLT5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCgpID09IG5v
ZGUoKSkgeworICAgICAgICAgICAgcmVzdWx0LnNldElubmVyTm9kZUluc3RhbmNlKGluc3RhbmNl
KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKFNWRykKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHRHVwbGljYXRlLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdEdXBsaWNhdGUuaAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHRHVwbGljYXRlLmgJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSBSZXNl
YXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDExLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVm
IFJlbmRlclNWR0R1cGxpY2F0ZV9oCisjZGVmaW5lIFJlbmRlclNWR0R1cGxpY2F0ZV9oCisKKyNp
ZiBFTkFCTEUoU1ZHKQorI2luY2x1ZGUgIlJlbmRlclNWR01vZGVsT2JqZWN0LmgiCisjaW5jbHVk
ZSAiU1ZHRWxlbWVudEluc3RhbmNlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3Mg
U1ZHVXNlRWxlbWVudDsKKworY2xhc3MgUmVuZGVyU1ZHRHVwbGljYXRlIDogcHVibGljIFJlbmRl
clNWR01vZGVsT2JqZWN0IHsKK3B1YmxpYzoKKyAgICBSZW5kZXJTVkdEdXBsaWNhdGUoU1ZHVXNl
RWxlbWVudCopOworICAgIHZpcnR1YWwgflJlbmRlclNWR0R1cGxpY2F0ZSgpOworCisgICAgdmly
dHVhbCB2b2lkIHNldE5lZWRzQm91bmRhcmllc1VwZGF0ZSgpIHsgbV9uZWVkc0JvdW5kYXJpZXNV
cGRhdGUgPSB0cnVlOyB9CisgICAgdmlydHVhbCB2b2lkIHNldE5lZWRzVHJhbnNmb3JtVXBkYXRl
KCkgeyBtX25lZWRzVHJhbnNmb3JtVXBkYXRlID0gdHJ1ZTsgfQorICAgIHZpcnR1YWwgdm9pZCB1
cGRhdGVGcm9tRWxlbWVudCgpOworICAgIHZvaWQgdXBkYXRlRnJvbUVsZW1lbnQoU1ZHRWxlbWVu
dEluc3RhbmNlOjpJbnN0YW5jZUludmFsaWRhdGlvbk1vZGVGbGFncyk7CisKKyAgICBSZW5kZXJP
YmplY3QqIHJlZmVyZW5jZWRSZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIG1fcmVmZXJlbmNlZFJl
bmRlcmVyOyB9CisKK3ByaXZhdGU6CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiByZW5kZXJOYW1l
KCkgY29uc3QgeyByZXR1cm4gIlJlbmRlclNWR0R1cGxpY2F0ZSI7IH0KKyAgICB2aXJ0dWFsIGJv
b2wgaXNTVkdEdXBsaWNhdGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgICB2aXJ0dWFs
IEZsb2F0UmVjdCBvYmplY3RCb3VuZGluZ0JveCgpIGNvbnN0IHsgcmV0dXJuIG1fb2JqZWN0Qm91
bmRpbmdCb3g7IH0KKyAgICB2aXJ0dWFsIEZsb2F0UmVjdCBzdHJva2VCb3VuZGluZ0JveCgpIGNv
bnN0IHsgcmV0dXJuIG1fc3Ryb2tlQm91bmRpbmdCb3g7IH0KKyAgICB2aXJ0dWFsIEZsb2F0UmVj
dCByZXBhaW50UmVjdEluTG9jYWxDb29yZGluYXRlcygpIGNvbnN0IHsgcmV0dXJuIG1fcmVwYWlu
dEJvdW5kaW5nQm94OyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRkRm9jdXNSaW5nUmVjdHMoVmVj
dG9yPExheW91dFJlY3Q+JiwgY29uc3QgTGF5b3V0UG9pbnQmKTsKKworICAgIHZpcnR1YWwgdm9p
ZCBsYXlvdXQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZvJiwgY29uc3QgTGF5
b3V0UG9pbnQmKTsKKworICAgIHZpcnR1YWwgYm9vbCBub2RlQXRGbG9hdFBvaW50KGNvbnN0IEhp
dFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50SW5Q
YXJlbnQsIEhpdFRlc3RBY3Rpb24pOworCisgICAgdmlydHVhbCBjb25zdCBBZmZpbmVUcmFuc2Zv
cm0mIGxvY2FsVG9QYXJlbnRUcmFuc2Zvcm0oKSBjb25zdDsKKyAgICB2aXJ0dWFsIEFmZmluZVRy
YW5zZm9ybSBsb2NhbFRyYW5zZm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1fbG9jYWxUcmFuc2Zvcm07
IH0KKworICAgIHZvaWQgdXBkYXRlQ2FjaGVkSW1hZ2VBZnRlclN0eWxlQ2hhbmdlKCk7CisgICAg
Ym9vbCB1cGRhdGVDYWNoZWRCb3VuZGFyaWVzQW5kSW1hZ2UoKTsKKyAgICB2b2lkIHVwZGF0ZUNh
Y2hlZEltYWdlKCk7CisgICAgdm9pZCB1cGRhdGVSZWZlcmVuY2VkU3R5bGUoKTsKKyAgICBQYXNz
UmVmUHRyPFJlbmRlclN0eWxlPiBjcmVhdGVSZWZlcmVuY2VkU3R5bGUoKTsKKyAgICBQYXNzUmVm
UHRyPFJlbmRlclN0eWxlPiBzd2l0Y2hUb1JlZmVyZW5jZWRTdHlsZSgpOworICAgIHZvaWQgc3dp
dGNoVG9PcmlnaW5hbFN0eWxlKFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+KTsKKyAgICBGbG9hdFNp
emUgdmlld3BvcnRTaXplKCkgY29uc3Q7CisgICAgYm9vbCBoYXNWYWxpZFZpZXdwb3J0KCkgY29u
c3Q7CisgICAgdm9pZCBwcm9wYWdhdGVWaWV3cG9ydFRvUmVmZXJlbmVkQ29udGVudChSZW5kZXJP
YmplY3QqLCBjb25zdCBGbG9hdFNpemUmKTsKKyAgICB2b2lkIHBhaW50VW5jYWNoZWRSZWZlcmVu
Y2VkQ29udGVudChQYWludEluZm8mKTsKKworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVIaXRUZXN0
UmVzdWx0KEhpdFRlc3RSZXN1bHQmLCBjb25zdCBMYXlvdXRQb2ludCYpOworICAgIHZpcnR1YWwg
dm9pZCBzdHlsZURpZENoYW5nZShTdHlsZURpZmZlcmVuY2UsIGNvbnN0IFJlbmRlclN0eWxlKiBv
bGRTdHlsZSk7CisKKyAgICBib29sIG1fbmVlZHNCb3VuZGFyaWVzVXBkYXRlIDogMTsKKyAgICBi
b29sIG1fbmVlZHNUcmFuc2Zvcm1VcGRhdGUgOiAxOworICAgIGJvb2wgbV9uZWVkc0ltYWdlVXBk
YXRlIDogMTsKKyAgICBib29sIG1fdXBkYXRlc0FsbG93ZWQgOiAxOworICAgIEFmZmluZVRyYW5z
Zm9ybSBtX2xvY2FsVHJhbnNmb3JtOworICAgIG11dGFibGUgQWZmaW5lVHJhbnNmb3JtIG1fbG9j
YWxUb1BhcmVudFRyYW5zZm9ybTsKKyAgICBGbG9hdFJlY3QgbV9vYmplY3RCb3VuZGluZ0JveDsK
KyAgICBGbG9hdFJlY3QgbV9zdHJva2VCb3VuZGluZ0JveDsKKyAgICBGbG9hdFJlY3QgbV9yZXBh
aW50Qm91bmRpbmdCb3g7CisgICAgRmxvYXRSZWN0IG1fbGFzdEFic29sdXRlVGFyZ2V0UmVjdDsK
KyAgICBSZW5kZXJPYmplY3QqIG1fcmVmZXJlbmNlZFJlbmRlcmVyOworICAgIE93blB0cjxJbWFn
ZUJ1ZmZlcj4gbV9jYWNoZWRJbWFnZTsKK307CisKK2lubGluZSBSZW5kZXJTVkdEdXBsaWNhdGUq
IHRvUmVuZGVyU1ZHRHVwbGljYXRlKFJlbmRlck9iamVjdCogb2JqZWN0KQoreworICAgIEFTU0VS
VCghb2JqZWN0IHx8IG9iamVjdC0+aXNTVkdEdXBsaWNhdGUoKSk7CisgICAgcmV0dXJuIHN0YXRp
Y19jYXN0PFJlbmRlclNWR0R1cGxpY2F0ZSo+KG9iamVjdCk7Cit9CisKK2lubGluZSBjb25zdCBS
ZW5kZXJTVkdEdXBsaWNhdGUqIHRvUmVuZGVyU1ZHRHVwbGljYXRlKGNvbnN0IFJlbmRlck9iamVj
dCogb2JqZWN0KQoreworICAgIEFTU0VSVCghb2JqZWN0IHx8IG9iamVjdC0+aXNTVkdEdXBsaWNh
dGUoKSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFJlbmRlclNWR0R1cGxpY2F0ZSo+
KG9iamVjdCk7Cit9CisKKy8vIFRoaXMgd2lsbCBjYXRjaCBhbnlvbmUgZG9pbmcgYW4gdW5uZWNl
c3NhcnkgY2FzdC4KK3ZvaWQgdG9SZW5kZXJTVkdEdXBsaWNhdGUoY29uc3QgUmVuZGVyU1ZHRHVw
bGljYXRlKik7CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShT
VkcpCisjZW5kaWYgLy8gUmVuZGVyU1ZHRHVwbGljYXRlX2gKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHSGlkZGVuQ29udGFpbmVyLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdIaWRkZW5Db250YWluZXIuaAko
cmV2aXNpb24gOTY1NzUpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNW
R0hpZGRlbkNvbnRhaW5lci5oCSh3b3JraW5nIGNvcHkpCkBAIC00NCw2ICs0NCw4IEBAIHByaXZh
dGU6CiAgICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGNvbnN0IExheW91dFBvaW50
Jik7CiAgICAgCiAgICAgdmlydHVhbCBMYXlvdXRSZWN0IGNsaXBwZWRPdmVyZmxvd1JlY3RGb3JS
ZXBhaW50KFJlbmRlckJveE1vZGVsT2JqZWN0KikgY29uc3QgeyByZXR1cm4gTGF5b3V0UmVjdCgp
OyB9CisgICAgdmlydHVhbCB2b2lkIGNvbXB1dGVSZWN0Rm9yUmVwYWludChSZW5kZXJCb3hNb2Rl
bE9iamVjdCosIEludFJlY3QmIHJlY3QsIGJvb2wgLyogZml4ZWQgKi89IGZhbHNlKSBjb25zdCB7
IHJlY3QgPSBJbnRSZWN0KCk7IH0KKwogICAgIHZpcnR1YWwgdm9pZCBhYnNvbHV0ZVF1YWRzKFZl
Y3RvcjxGbG9hdFF1YWQ+JiwgYm9vbCogd2FzRml4ZWQpOwogCiAgICAgdmlydHVhbCBib29sIG5v
ZGVBdEZsb2F0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgY29u
c3QgRmxvYXRQb2ludCYgcG9pbnRJblBhcmVudCwgSGl0VGVzdEFjdGlvbik7CkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR0ltYWdlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR0ltYWdlLmNwcAkocmV2aXNp
b24gOTY1NzUpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR0ltYWdl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgIlJlbmRlckxh
eWVyLmgiCiAjaW5jbHVkZSAiUmVuZGVyU1ZHUmVzb3VyY2VDb250YWluZXIuaCIKICNpbmNsdWRl
ICJSZW5kZXJTVkdSZXNvdXJjZUZpbHRlci5oIgorI2luY2x1ZGUgIlNWR0VsZW1lbnRJbnN0YW5j
ZS5oIgogI2luY2x1ZGUgIlNWR0ltYWdlRWxlbWVudC5oIgogI2luY2x1ZGUgIlNWR0xlbmd0aC5o
IgogI2luY2x1ZGUgIlNWR1ByZXNlcnZlQXNwZWN0UmF0aW8uaCIKQEAgLTE3OCw2ICsxNzksNyBA
QCB2b2lkIFJlbmRlclNWR0ltYWdlOjppbWFnZUNoYW5nZWQoV3JhcHBlCiAgICAgUmVuZGVyU1ZH
UmVzb3VyY2U6Om1hcmtGb3JMYXlvdXRBbmRQYXJlbnRSZXNvdXJjZUludmFsaWRhdGlvbih0aGlz
LCBmYWxzZSk7CiAKICAgICByZXBhaW50KCk7CisgICAgU1ZHRWxlbWVudEluc3RhbmNlOjppbnZh
bGlkYXRlQWxsSW5zdGFuY2VzT2ZFbGVtZW50KHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihub2Rl
KCkpKTsKIH0KIAogdm9pZCBSZW5kZXJTVkdJbWFnZTo6YWRkRm9jdXNSaW5nUmVjdHMoVmVjdG9y
PExheW91dFJlY3Q+JiByZWN0cywgY29uc3QgTGF5b3V0UG9pbnQmKQpJbmRleDogU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdNb2RlbE9iamVjdC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdNb2RlbE9iamVjdC5jcHAJ
KHJldmlzaW9uIDk2NTc1KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJT
VkdNb2RlbE9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE1NCw3ICsxNTQsNyBAQCBzdGF0
aWMgYm9vbCBpbnRlcnNlY3RzQWxsb3dpbmdFbXB0eShjb25zCiAvLyBpbWFnZSwgbGluZSwgcGF0
aCwgcG9seWdvbiwgcG9seWxpbmUsIHJlY3QsIHRleHQgYW5kIHVzZS4KIHN0YXRpYyBib29sIGlz
R3JhcGhpY3NFbGVtZW50KFJlbmRlck9iamVjdCogcmVuZGVyZXIpCiB7Ci0gICAgcmV0dXJuIHJl
bmRlcmVyLT5pc1NWR1BhdGgoKSB8fCByZW5kZXJlci0+aXNTVkdUZXh0KCkgfHwgcmVuZGVyZXIt
PmlzU1ZHSW1hZ2UoKSB8fCByZW5kZXJlci0+aXNTVkdTaGFkb3dUcmVlUm9vdENvbnRhaW5lcigp
OworICAgIHJldHVybiByZW5kZXJlci0+aXNTVkdQYXRoKCkgfHwgcmVuZGVyZXItPmlzU1ZHVGV4
dCgpIHx8IHJlbmRlcmVyLT5pc1NWR0ltYWdlKCkgfHwgcmVuZGVyZXItPmlzU1ZHRHVwbGljYXRl
KCk7CiB9CiAKIGJvb2wgUmVuZGVyU1ZHTW9kZWxPYmplY3Q6OmNoZWNrSW50ZXJzZWN0aW9uKFJl
bmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHUmVzb3VyY2VDbGlwcGVyLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR1Jlc291cmNl
Q2xpcHBlci5jcHAJKHJldmlzaW9uIDk2NTc1KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L3N2Zy9SZW5kZXJTVkdSZXNvdXJjZUNsaXBwZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01Miw3
ICs1Miw2IEBAIFJlbmRlclNWR1Jlc291cmNlVHlwZSBSZW5kZXJTVkdSZXNvdXJjZUMKIAogUmVu
ZGVyU1ZHUmVzb3VyY2VDbGlwcGVyOjpSZW5kZXJTVkdSZXNvdXJjZUNsaXBwZXIoU1ZHQ2xpcFBh
dGhFbGVtZW50KiBub2RlKQogICAgIDogUmVuZGVyU1ZHUmVzb3VyY2VDb250YWluZXIobm9kZSkK
LSAgICAsIG1faW52YWxpZGF0aW9uQmxvY2tlZChmYWxzZSkKIHsKIH0KIApAQCAtNjcsNyArNjYs
NyBAQCBSZW5kZXJTVkdSZXNvdXJjZUNsaXBwZXI6On5SZW5kZXJTVkdSZXNvCiAKIHZvaWQgUmVu
ZGVyU1ZHUmVzb3VyY2VDbGlwcGVyOjpyZW1vdmVBbGxDbGllbnRzRnJvbUNhY2hlKGJvb2wgbWFy
a0ZvckludmFsaWRhdGlvbikKIHsKLSAgICBpZiAobV9pbnZhbGlkYXRpb25CbG9ja2VkKQorICAg
IGlmIChpc0ludmFsaWRhdGlvbkJsb2NrZWQoKSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgbV9j
bGlwQm91bmRhcmllcyA9IEZsb2F0UmVjdCgpOwpAQCAtODIsNyArODEsNyBAQCB2b2lkIFJlbmRl
clNWR1Jlc291cmNlQ2xpcHBlcjo6cmVtb3ZlQWxsCiB2b2lkIFJlbmRlclNWR1Jlc291cmNlQ2xp
cHBlcjo6cmVtb3ZlQ2xpZW50RnJvbUNhY2hlKFJlbmRlck9iamVjdCogY2xpZW50LCBib29sIG1h
cmtGb3JJbnZhbGlkYXRpb24pCiB7CiAgICAgQVNTRVJUKGNsaWVudCk7Ci0gICAgaWYgKG1faW52
YWxpZGF0aW9uQmxvY2tlZCkKKyAgICBpZiAoaXNJbnZhbGlkYXRpb25CbG9ja2VkKCkpCiAgICAg
ICAgIHJldHVybjsKIAogICAgIGlmIChtX2NsaXBwZXIuY29udGFpbnMoY2xpZW50KSkKQEAgLTIz
MSwxOSArMjMwLDE5IEBAIGJvb2wgUmVuZGVyU1ZHUmVzb3VyY2VDbGlwcGVyOjpkcmF3Q29udGUK
ICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgIFdpbmRSdWxlIG5ld0NsaXBSdWxlID0g
c3R5bGUtPnN2Z1N0eWxlKCktPmNsaXBSdWxlKCk7Ci0gICAgICAgIGJvb2wgaXNVc2VFbGVtZW50
ID0gcmVuZGVyZXItPmlzU1ZHU2hhZG93VHJlZVJvb3RDb250YWluZXIoKTsKKyAgICAgICAgYm9v
bCBpc1VzZUVsZW1lbnQgPSByZW5kZXJlci0+aXNTVkdEdXBsaWNhdGUoKTsKICAgICAgICAgaWYg
KGlzVXNlRWxlbWVudCkgewogICAgICAgICAgICAgU1ZHVXNlRWxlbWVudCogdXNlRWxlbWVudCA9
IHN0YXRpY19jYXN0PFNWR1VzZUVsZW1lbnQqPihjaGlsZE5vZGUpOwotICAgICAgICAgICAgcmVu
ZGVyZXIgPSB1c2VFbGVtZW50LT5yZW5kZXJlckNsaXBDaGlsZCgpOwotICAgICAgICAgICAgaWYg
KCFyZW5kZXJlcikKKyAgICAgICAgICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXJDbGlwQ2hpbGQg
PSB1c2VFbGVtZW50LT5yZW5kZXJlckNsaXBDaGlsZCgpOworICAgICAgICAgICAgaWYgKCFyZW5k
ZXJlckNsaXBDaGlsZCkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIGlm
ICghdXNlRWxlbWVudC0+aGFzQXR0cmlidXRlKFNWR05hbWVzOjpjbGlwX3J1bGVBdHRyKSkKLSAg
ICAgICAgICAgICAgICBuZXdDbGlwUnVsZSA9IHJlbmRlcmVyLT5zdHlsZSgpLT5zdmdTdHlsZSgp
LT5jbGlwUnVsZSgpOworICAgICAgICAgICAgICAgIG5ld0NsaXBSdWxlID0gcmVuZGVyZXJDbGlw
Q2hpbGQtPnN0eWxlKCktPnN2Z1N0eWxlKCktPmNsaXBSdWxlKCk7CiAgICAgICAgIH0KIAotICAg
ICAgICAvLyBPbmx5IHNoYXBlcywgcGF0aHMgYW5kIHRleHRzIGFyZSBhbGxvd2VkIGZvciBjbGlw
cGluZy4KLSAgICAgICAgaWYgKCFyZW5kZXJlci0+aXNTVkdQYXRoKCkgJiYgIXJlbmRlcmVyLT5p
c1NWR1RleHQoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvLyBUaGUgaW1wbGlj
aXQgc2V0U3R5bGUoKSBjYWxscyByZXN1bHQgaW4gYSBzdHlsZURpZENoYW5nZSgpIGNhbGwsIHdo
aWNoIGluIHR1cm4gaW52YWxpZGF0ZXMgdGhlIHJlc291cmNlcy4KKyAgICAgICAgLy8gQXMgd2Un
cmUgbXV0YXRpbmcgdGhlIHJlc291cmNlIG9uIHB1cnBvc2UsIGJsb2NrIHVwZGF0ZXMgdW50aWwg
d2UndmUgcmVzZXR0ZWQgdGhlIHN0eWxlIGFnYWluLgorICAgICAgICBzZXRJc0ludmFsaWRhdGlv
bkJsb2NrZWQodHJ1ZSk7CiAKICAgICAgICAgLy8gU2F2ZSB0aGUgb2xkIFJlbmRlclN0eWxlIG9m
IHRoZSBjdXJyZW50IG9iamVjdCBmb3IgcmVzdG9yaW5nIGFmdGVyIGRyYXdpbmcKICAgICAgICAg
Ly8gaXQgdG8gdGhlIE1hc2tJbWFnZS4gVGhlIG5ldyBpbnRlcm1lZGlhdGUgUmVuZGVyU3R5bGUg
bmVlZHMgdG8gaW5oZXJpdCBmcm9tCkBAIC0yNjAsMTggKzI1OSwxMCBAQCBib29sIFJlbmRlclNW
R1Jlc291cmNlQ2xpcHBlcjo6ZHJhd0NvbnRlCiAgICAgICAgIHN2Z1N0eWxlLT5zZXRGaWx0ZXJS
ZXNvdXJjZShTdHJpbmcoKSk7CiAgICAgICAgIHN2Z1N0eWxlLT5zZXRNYXNrZXJSZXNvdXJjZShT
dHJpbmcoKSk7CiAKLSAgICAgICAgLy8gVGhlIHNldFN0eWxlKCkgY2FsbCByZXN1bHRzIGluIGEg
c3R5bGVEaWRDaGFuZ2UoKSBjYWxsLCB3aGljaCBpbiB0dXJuIGludmFsaWRhdGlvbnMgdGhlIHJl
c291cmNlcy4KLSAgICAgICAgLy8gQXMgd2UncmUgbXV0YXRpbmcgdGhlIHJlc291cmNlIG9uIHB1
cnBvc2UsIGJsb2NrIHVwZGF0ZXMgdW50aWwgd2UndmUgcmVzZXR0ZWQgdGhlIHN0eWxlIGFnYWlu
LgotICAgICAgICBtX2ludmFsaWRhdGlvbkJsb2NrZWQgPSB0cnVlOwogICAgICAgICByZW5kZXJl
ci0+c2V0U3R5bGUobmV3UmVuZGVyU3R5bGUucmVsZWFzZSgpKTsKLQotICAgICAgICAvLyBJbiB0
aGUgY2FzZSBvZiBhIDx1c2U+IGVsZW1lbnQsIHdlIG9idGFpbmVkIGl0cyByZW5kZXJlcmUgYWJv
dmUsIHRvIHJldHJpZXZlIGl0cyBjbGlwUnVsZS4KLSAgICAgICAgLy8gV2UgaGF2ZSB0byBwYXNz
IHRoZSA8dXNlPiByZW5kZXJlciBpdHNlbGYgdG8gcmVuZGVyU3VidHJlZVRvSW1hZ2VCdWZmZXIo
KSB0byBhcHBseSBpdCdzIHgveS90cmFuc2Zvcm0vZXRjLiB2YWx1ZXMgd2hlbiByZW5kZXJpbmcu
Ci0gICAgICAgIC8vIFNvIGlmIGlzVXNlRWxlbWVudCBpcyB0cnVlLCByZWZldGNoIHRoZSBjaGls
ZE5vZGUtPnJlbmRlcmVyKCksIGFzIHJlbmRlcmVyIGdvdCBvdmVycmlkZW4gYWJvdmUuCi0gICAg
ICAgIFNWR0ltYWdlQnVmZmVyVG9vbHM6OnJlbmRlclN1YnRyZWVUb0ltYWdlQnVmZmVyKGNsaXBw
ZXJEYXRhLT5jbGlwTWFza0ltYWdlLmdldCgpLCBpc1VzZUVsZW1lbnQgPyBjaGlsZE5vZGUtPnJl
bmRlcmVyKCkgOiByZW5kZXJlciwgbWFza0NvbnRlbnRUcmFuc2Zvcm1hdGlvbik7Ci0KKyAgICAg
ICAgU1ZHSW1hZ2VCdWZmZXJUb29sczo6cmVuZGVyU3VidHJlZVRvSW1hZ2VCdWZmZXIoY2xpcHBl
ckRhdGEtPmNsaXBNYXNrSW1hZ2UuZ2V0KCksIHJlbmRlcmVyLCBtYXNrQ29udGVudFRyYW5zZm9y
bWF0aW9uKTsKICAgICAgICAgcmVuZGVyZXItPnNldFN0eWxlKG9sZFJlbmRlclN0eWxlLnJlbGVh
c2UoKSk7Ci0gICAgICAgIG1faW52YWxpZGF0aW9uQmxvY2tlZCA9IGZhbHNlOworICAgICAgICBz
ZXRJc0ludmFsaWRhdGlvbkJsb2NrZWQoZmFsc2UpOwogICAgIH0KIAogICAgIHJldHVybiB0cnVl
OwpAQCAtMjg0LDcgKzI3NSw3IEBAIHZvaWQgUmVuZGVyU1ZHUmVzb3VyY2VDbGlwcGVyOjpjYWxj
dWxhdGUKICAgICAgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGNoaWxkTm9kZS0+cmVuZGVy
ZXIoKTsKICAgICAgICAgaWYgKCFjaGlsZE5vZGUtPmlzU1ZHRWxlbWVudCgpIHx8ICFzdGF0aWNf
Y2FzdDxTVkdFbGVtZW50Kj4oY2hpbGROb2RlKS0+aXNTdHlsZWQoKSB8fCAhcmVuZGVyZXIpCiAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKCFyZW5kZXJlci0+aXNTVkdQYXRoKCkg
JiYgIXJlbmRlcmVyLT5pc1NWR1RleHQoKSAmJiAhcmVuZGVyZXItPmlzU1ZHU2hhZG93VHJlZVJv
b3RDb250YWluZXIoKSkKKyAgICAgICAgaWYgKCFyZW5kZXJlci0+aXNTVkdQYXRoKCkgJiYgIXJl
bmRlcmVyLT5pc1NWR1RleHQoKSAmJiAhcmVuZGVyZXItPmlzU1ZHRHVwbGljYXRlKCkpCiAgICAg
ICAgICAgICBjb250aW51ZTsKICAgICAgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gcmVuZGVyZXIt
PnN0eWxlKCk7CiAgICAgICAgIGlmICghc3R5bGUgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBOT05F
IHx8IHN0eWxlLT52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSkKQEAgLTMxMCw3ICszMDEsNyBAQCBi
b29sIFJlbmRlclNWR1Jlc291cmNlQ2xpcHBlcjo6aGl0VGVzdENsCiAgICAgICAgIFJlbmRlck9i
amVjdCogcmVuZGVyZXIgPSBjaGlsZE5vZGUtPnJlbmRlcmVyKCk7CiAgICAgICAgIGlmICghY2hp
bGROb2RlLT5pc1NWR0VsZW1lbnQoKSB8fCAhc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KGNoaWxk
Tm9kZSktPmlzU3R5bGVkKCkgfHwgIXJlbmRlcmVyKQogICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgIGlmICghcmVuZGVyZXItPmlzU1ZHUGF0aCgpICYmICFyZW5kZXJlci0+aXNTVkdUZXh0
KCkgJiYgIXJlbmRlcmVyLT5pc1NWR1NoYWRvd1RyZWVSb290Q29udGFpbmVyKCkpCisgICAgICAg
IGlmICghcmVuZGVyZXItPmlzU1ZHUGF0aCgpICYmICFyZW5kZXJlci0+aXNTVkdUZXh0KCkgJiYg
IXJlbmRlcmVyLT5pc1NWR0R1cGxpY2F0ZSgpKQogICAgICAgICAgICAgY29udGludWU7CiAgICAg
ICAgIEludFBvaW50IGhpdFBvaW50OwogICAgICAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdChoaXRQ
b2ludCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR1Jlc291
cmNlQ2xpcHBlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcv
UmVuZGVyU1ZHUmVzb3VyY2VDbGlwcGVyLmgJKHJldmlzaW9uIDk2NTc1KQorKysgU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdSZXNvdXJjZUNsaXBwZXIuaAkod29ya2luZyBj
b3B5KQpAQCAtNjksNyArNjksNiBAQCBwcml2YXRlOgogICAgIGJvb2wgZHJhd0NvbnRlbnRJbnRv
TWFza0ltYWdlKENsaXBwZXJEYXRhKiwgY29uc3QgRmxvYXRSZWN0JiBvYmplY3RCb3VuZGluZ0Jv
eCk7CiAgICAgdm9pZCBjYWxjdWxhdGVDbGlwQ29udGVudFJlcGFpbnRSZWN0KCk7CiAKLSAgICBi
b29sIG1faW52YWxpZGF0aW9uQmxvY2tlZDsKICAgICBGbG9hdFJlY3QgbV9jbGlwQm91bmRhcmll
czsKICAgICBIYXNoTWFwPFJlbmRlck9iamVjdCosIENsaXBwZXJEYXRhKj4gbV9jbGlwcGVyOwog
fTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHUmVzb3VyY2VD
b250YWluZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcv
UmVuZGVyU1ZHUmVzb3VyY2VDb250YWluZXIuY3BwCShyZXZpc2lvbiA5NjU3NSkKKysrIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHUmVzb3VyY2VDb250YWluZXIuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yMiw3ICsyMiw2IEBACiAjaWYgRU5BQkxFKFNWRykKICNpbmNsdWRl
ICJSZW5kZXJTVkdSZXNvdXJjZUNvbnRhaW5lci5oIgogCi0jaW5jbHVkZSAiUmVuZGVyU1ZHU2hh
ZG93VHJlZVJvb3RDb250YWluZXIuaCIKICNpbmNsdWRlICJTVkdTdHlsZWRUcmFuc2Zvcm1hYmxl
RWxlbWVudC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC0zOCw2ICszNyw3IEBAIFJlbmRl
clNWR1Jlc291cmNlQ29udGFpbmVyOjpSZW5kZXJTVkdSZXMKICAgICA6IFJlbmRlclNWR0hpZGRl
bkNvbnRhaW5lcihub2RlKQogICAgICwgbV9pZChub2RlLT5oYXNJRCgpID8gbm9kZS0+Z2V0SWRB
dHRyaWJ1dGUoKSA6IG51bGxBdG9tKQogICAgICwgbV9yZWdpc3RlcmVkKGZhbHNlKQorICAgICwg
bV9pbnZhbGlkYXRpb25CbG9ja2VkKGZhbHNlKQogewogfQogCkBAIC0xMjMsNiArMTIzLDggQEAg
dm9pZCBSZW5kZXJTVkdSZXNvdXJjZUNvbnRhaW5lcjo6bWFya0FsbAogdm9pZCBSZW5kZXJTVkdS
ZXNvdXJjZUNvbnRhaW5lcjo6bWFya0NsaWVudEZvckludmFsaWRhdGlvbihSZW5kZXJPYmplY3Qq
IGNsaWVudCwgSW52YWxpZGF0aW9uTW9kZSBtb2RlKQogewogICAgIEFTU0VSVChjbGllbnQpOwor
ICAgIEFTU0VSVChjbGllbnQtPm5vZGUoKSk7CisgICAgQVNTRVJUKGNsaWVudC0+bm9kZSgpLT5p
c1NWR0VsZW1lbnQoKSk7CiAgICAgQVNTRVJUKCFtX2NsaWVudHMuaXNFbXB0eSgpKTsKIAogICAg
IHN3aXRjaCAobW9kZSkgewpAQCAtMTMxLDggKzEzMywxMCBAQCB2b2lkIFJlbmRlclNWR1Jlc291
cmNlQ29udGFpbmVyOjptYXJrQ2xpCiAgICAgICAgIGNsaWVudC0+c2V0TmVlZHNCb3VuZGFyaWVz
VXBkYXRlKCk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgUmVwYWludEludmFsaWRhdGlvbjoK
LSAgICAgICAgaWYgKGNsaWVudC0+dmlldygpKQorICAgICAgICBpZiAoY2xpZW50LT52aWV3KCkp
IHsKICAgICAgICAgICAgIGNsaWVudC0+cmVwYWludCgpOworICAgICAgICAgICAgU1ZHRWxlbWVu
dEluc3RhbmNlOjppbnZhbGlkYXRlQWxsSW5zdGFuY2VzT2ZFbGVtZW50KHN0YXRpY19jYXN0PFNW
R0VsZW1lbnQqPihjbGllbnQtPm5vZGUoKSksIFNWR0VsZW1lbnRJbnN0YW5jZTo6TGVhdmVJbnN0
YW5jZVRyZWUgfCBTVkdFbGVtZW50SW5zdGFuY2U6OlJlcGFpbnRVc2VSZW5kZXJlcik7CisgICAg
ICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBQYXJlbnRPbmx5SW52YWxpZGF0aW9uOgog
ICAgICAgICBicmVhazsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVy
U1ZHUmVzb3VyY2VDb250YWluZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvc3ZnL1JlbmRlclNWR1Jlc291cmNlQ29udGFpbmVyLmgJKHJldmlzaW9uIDk2NTc1KQor
KysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdSZXNvdXJjZUNvbnRhaW5l
ci5oCSh3b3JraW5nIGNvcHkpCkBAIC01NCw2ICs1NCw5IEBAIHByb3RlY3RlZDoKICAgICB2b2lk
IG1hcmtBbGxDbGllbnRzRm9ySW52YWxpZGF0aW9uKEludmFsaWRhdGlvbk1vZGUpOwogICAgIHZv
aWQgbWFya0NsaWVudEZvckludmFsaWRhdGlvbihSZW5kZXJPYmplY3QqLCBJbnZhbGlkYXRpb25N
b2RlKTsKIAorICAgIGJvb2wgaXNJbnZhbGlkYXRpb25CbG9ja2VkKCkgY29uc3QgeyByZXR1cm4g
bV9pbnZhbGlkYXRpb25CbG9ja2VkOyB9CisgICAgdm9pZCBzZXRJc0ludmFsaWRhdGlvbkJsb2Nr
ZWQoYm9vbCB2YWx1ZSkgeyBtX2ludmFsaWRhdGlvbkJsb2NrZWQgPSB2YWx1ZTsgfQorCiBwcml2
YXRlOgogICAgIGZyaWVuZCBjbGFzcyBTVkdSZXNvdXJjZXNDYWNoZTsKICAgICB2b2lkIGFkZENs
aWVudChSZW5kZXJPYmplY3QqKTsKQEAgLTY1LDYgKzY4LDcgQEAgcHJpdmF0ZToKIAogICAgIEF0
b21pY1N0cmluZyBtX2lkOwogICAgIGJvb2wgbV9yZWdpc3RlcmVkOworICAgIGJvb2wgbV9pbnZh
bGlkYXRpb25CbG9ja2VkOwogICAgIEhhc2hTZXQ8UmVuZGVyT2JqZWN0Kj4gbV9jbGllbnRzOwog
fTsKIApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdSZXNvdXJj
ZU1hc2tlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9S
ZW5kZXJTVkdSZXNvdXJjZU1hc2tlci5jcHAJKHJldmlzaW9uIDk2NTc1KQorKysgU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdSZXNvdXJjZU1hc2tlci5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTYxLDYgKzYxLDkgQEAgUmVuZGVyU1ZHUmVzb3VyY2VNYXNrZXI6On5SZW5kZXJT
VkdSZXNvdQogCiB2b2lkIFJlbmRlclNWR1Jlc291cmNlTWFza2VyOjpyZW1vdmVBbGxDbGllbnRz
RnJvbUNhY2hlKGJvb2wgbWFya0ZvckludmFsaWRhdGlvbikKIHsKKyAgICBpZiAoaXNJbnZhbGlk
YXRpb25CbG9ja2VkKCkpCisgICAgICAgIHJldHVybjsKKwogICAgIG1fbWFza0NvbnRlbnRCb3Vu
ZGFyaWVzID0gRmxvYXRSZWN0KCk7CiAgICAgaWYgKCFtX21hc2tlci5pc0VtcHR5KCkpIHsKICAg
ICAgICAgZGVsZXRlQWxsVmFsdWVzKG1fbWFza2VyKTsKQEAgLTczLDYgKzc2LDggQEAgdm9pZCBS
ZW5kZXJTVkdSZXNvdXJjZU1hc2tlcjo6cmVtb3ZlQWxsQwogdm9pZCBSZW5kZXJTVkdSZXNvdXJj
ZU1hc2tlcjo6cmVtb3ZlQ2xpZW50RnJvbUNhY2hlKFJlbmRlck9iamVjdCogY2xpZW50LCBib29s
IG1hcmtGb3JJbnZhbGlkYXRpb24pCiB7CiAgICAgQVNTRVJUKGNsaWVudCk7CisgICAgaWYgKGlz
SW52YWxpZGF0aW9uQmxvY2tlZCgpKQorICAgICAgICByZXR1cm47CiAKICAgICBpZiAobV9tYXNr
ZXIuY29udGFpbnMoY2xpZW50KSkKICAgICAgICAgZGVsZXRlIG1fbWFza2VyLnRha2UoY2xpZW50
KTsKQEAgLTE0NSw2ICsxNTAsOCBAQCB2b2lkIFJlbmRlclNWR1Jlc291cmNlTWFza2VyOjpkcmF3
Q29udGVuCiAgICAgICAgIG1hc2tJbWFnZUNvbnRleHQtPmNvbmNhdENUTShtYXNrQ29udGVudFRy
YW5zZm9ybWF0aW9uKTsKICAgICB9CiAKKyAgICBzZXRJc0ludmFsaWRhdGlvbkJsb2NrZWQodHJ1
ZSk7CisKICAgICAvLyBEcmF3IHRoZSBjb250ZW50IGludG8gdGhlIEltYWdlQnVmZmVyLgogICAg
IGZvciAoTm9kZSogbm9kZSA9IG1hc2tFbGVtZW50LT5maXJzdENoaWxkKCk7IG5vZGU7IG5vZGUg
PSBub2RlLT5uZXh0U2libGluZygpKSB7CiAgICAgICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIg
PSBub2RlLT5yZW5kZXJlcigpOwpAQCAtMTU1LDcgKzE2Miw4IEBAIHZvaWQgUmVuZGVyU1ZHUmVz
b3VyY2VNYXNrZXI6OmRyYXdDb250ZW4KICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBT
VkdJbWFnZUJ1ZmZlclRvb2xzOjpyZW5kZXJTdWJ0cmVlVG9JbWFnZUJ1ZmZlcihtYXNrZXJEYXRh
LT5tYXNrSW1hZ2UuZ2V0KCksIHJlbmRlcmVyLCBtYXNrQ29udGVudFRyYW5zZm9ybWF0aW9uKTsK
ICAgICB9Ci0KKyAgICAKKyAgICBzZXRJc0ludmFsaWRhdGlvbkJsb2NrZWQoZmFsc2UpOwogICAg
IG1hc2tJbWFnZUNvbnRleHQtPnJlc3RvcmUoKTsKIAogI2lmICFVU0UoQ0cpCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR1Jlc291cmNlUGF0dGVybi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdSZXNvdXJj
ZVBhdHRlcm4uY3BwCShyZXZpc2lvbiA5NjU3NSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9zdmcvUmVuZGVyU1ZHUmVzb3VyY2VQYXR0ZXJuLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTEs
NiArNTEsOSBAQCBSZW5kZXJTVkdSZXNvdXJjZVBhdHRlcm46On5SZW5kZXJTVkdSZXNvCiAKIHZv
aWQgUmVuZGVyU1ZHUmVzb3VyY2VQYXR0ZXJuOjpyZW1vdmVBbGxDbGllbnRzRnJvbUNhY2hlKGJv
b2wgbWFya0ZvckludmFsaWRhdGlvbikKIHsKKyAgICBpZiAoaXNJbnZhbGlkYXRpb25CbG9ja2Vk
KCkpCisgICAgICAgIHJldHVybjsKKwogICAgIGlmICghbV9wYXR0ZXJuLmlzRW1wdHkoKSkgewog
ICAgICAgICBkZWxldGVBbGxWYWx1ZXMobV9wYXR0ZXJuKTsKICAgICAgICAgbV9wYXR0ZXJuLmNs
ZWFyKCk7CkBAIC02Myw2ICs2Niw4IEBAIHZvaWQgUmVuZGVyU1ZHUmVzb3VyY2VQYXR0ZXJuOjpy
ZW1vdmVBbGwKIHZvaWQgUmVuZGVyU1ZHUmVzb3VyY2VQYXR0ZXJuOjpyZW1vdmVDbGllbnRGcm9t
Q2FjaGUoUmVuZGVyT2JqZWN0KiBjbGllbnQsIGJvb2wgbWFya0ZvckludmFsaWRhdGlvbikKIHsK
ICAgICBBU1NFUlQoY2xpZW50KTsKKyAgICBpZiAoaXNJbnZhbGlkYXRpb25CbG9ja2VkKCkpCisg
ICAgICAgIHJldHVybjsKIAogICAgIGlmIChtX3BhdHRlcm4uY29udGFpbnMoY2xpZW50KSkKICAg
ICAgICAgZGVsZXRlIG1fcGF0dGVybi50YWtlKGNsaWVudCk7CkBAIC0yNTAsNyArMjU1LDcgQEAg
UGFzc093blB0cjxJbWFnZUJ1ZmZlcj4gUmVuZGVyU1ZHUmVzb3VyYwogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
RmxvYXRSZWN0JiB0aWxlQm91bmRhcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UmVjdCYgYWJz
b2x1dGVUaWxlQm91bmRhcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdGls
ZUltYWdlVHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXRSZWN0JiBjbGFtcGVkQWJzb2x1dGVUaWxl
Qm91bmRhcmllcykgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0UmVjdCYgY2xhbXBlZEFic29sdXRlVGls
ZUJvdW5kYXJpZXMpCiB7CiAgICAgY2xhbXBlZEFic29sdXRlVGlsZUJvdW5kYXJpZXMgPSBTVkdJ
bWFnZUJ1ZmZlclRvb2xzOjpjbGFtcGVkQWJzb2x1dGVUYXJnZXRSZWN0KGFic29sdXRlVGlsZUJv
dW5kYXJpZXMpOwogCkBAIC0yNzQsNiArMjc5LDggQEAgUGFzc093blB0cjxJbWFnZUJ1ZmZlcj4g
UmVuZGVyU1ZHUmVzb3VyYwogICAgIGlmIChhdHRyaWJ1dGVzLmJvdW5kaW5nQm94TW9kZUNvbnRl
bnQoKSkKICAgICAgICAgY29udGVudFRyYW5zZm9ybWF0aW9uID0gdGlsZUltYWdlVHJhbnNmb3Jt
OwogCisgICAgc2V0SXNJbnZhbGlkYXRpb25CbG9ja2VkKHRydWUpOworCiAgICAgLy8gRHJhdyB0
aGUgY29udGVudCBpbnRvIHRoZSBJbWFnZUJ1ZmZlci4KICAgICBmb3IgKE5vZGUqIG5vZGUgPSBh
dHRyaWJ1dGVzLnBhdHRlcm5Db250ZW50RWxlbWVudCgpLT5maXJzdENoaWxkKCk7IG5vZGU7IG5v
ZGUgPSBub2RlLT5uZXh0U2libGluZygpKSB7CiAgICAgICAgIGlmICghbm9kZS0+aXNTVkdFbGVt
ZW50KCkgfHwgIXN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihub2RlKS0+aXNTdHlsZWQoKSB8fCAh
bm9kZS0+cmVuZGVyZXIoKSkKQEAgLTI4MSw2ICsyODgsNyBAQCBQYXNzT3duUHRyPEltYWdlQnVm
ZmVyPiBSZW5kZXJTVkdSZXNvdXJjCiAgICAgICAgIFNWR0ltYWdlQnVmZmVyVG9vbHM6OnJlbmRl
clN1YnRyZWVUb0ltYWdlQnVmZmVyKHRpbGVJbWFnZS5nZXQoKSwgbm9kZS0+cmVuZGVyZXIoKSwg
Y29udGVudFRyYW5zZm9ybWF0aW9uKTsKICAgICB9CiAKKyAgICBzZXRJc0ludmFsaWRhdGlvbkJs
b2NrZWQoZmFsc2UpOwogICAgIHJldHVybiB0aWxlSW1hZ2UucmVsZWFzZSgpOwogfQogCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR1Jlc291cmNlUGF0dGVybi5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHUmVz
b3VyY2VQYXR0ZXJuLmgJKHJldmlzaW9uIDk2NTc1KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL3N2Zy9SZW5kZXJTVkdSZXNvdXJjZVBhdHRlcm4uaAkod29ya2luZyBjb3B5KQpAQCAtNjMs
NyArNjMsNyBAQCBwcml2YXRlOgogCiAgICAgUGFzc093blB0cjxJbWFnZUJ1ZmZlcj4gY3JlYXRl
VGlsZUltYWdlKGNvbnN0IFBhdHRlcm5BdHRyaWJ1dGVzJiwgY29uc3QgRmxvYXRSZWN0JiB0aWxl
Qm91bmRhcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgRmxvYXRSZWN0JiBhYnNvbHV0ZVRpbGVCb3VuZGFyaWVzLCBjb25zdCBBZmZpbmVUcmFu
c2Zvcm0mIHRpbGVJbWFnZVRyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgRmxvYXRSZWN0JiBjbGFtcGVkQWJzb2x1dGVUaWxlQm91bmRhcmllcykg
Y29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0
UmVjdCYgY2xhbXBlZEFic29sdXRlVGlsZUJvdW5kYXJpZXMpOwogCiAgICAgYm9vbCBtX3Nob3Vs
ZENvbGxlY3RQYXR0ZXJuQXR0cmlidXRlcyA6IDE7CiAgICAgUGF0dGVybkF0dHJpYnV0ZXMgbV9h
dHRyaWJ1dGVzOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdT
aGFkb3dUcmVlUm9vdENvbnRhaW5lci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdTaGFkb3dUcmVlUm9vdENvbnRhaW5lci5jcHAJKHJldmlz
aW9uIDk2NTc1KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdTaGFk
b3dUcmVlUm9vdENvbnRhaW5lci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsMTA2ICswLDAgQEAK
LS8qCi0gKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTAuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0
IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElC
LiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmIEVOQUJMRShTVkcp
Ci0jaW5jbHVkZSAiUmVuZGVyU1ZHU2hhZG93VHJlZVJvb3RDb250YWluZXIuaCIKLQotI2luY2x1
ZGUgIk1vdXNlRXZlbnQuaCIKLSNpbmNsdWRlICJTVkdTaGFkb3dUcmVlRWxlbWVudHMuaCIKLSNp
bmNsdWRlICJTVkdVc2VFbGVtZW50LmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotUmVuZGVy
U1ZHU2hhZG93VHJlZVJvb3RDb250YWluZXI6OlJlbmRlclNWR1NoYWRvd1RyZWVSb290Q29udGFp
bmVyKFNWR1VzZUVsZW1lbnQqIG5vZGUpCi0gICAgOiBSZW5kZXJTVkdUcmFuc2Zvcm1hYmxlQ29u
dGFpbmVyKG5vZGUpCi0gICAgLCBtX3JlY3JlYXRlVHJlZShmYWxzZSkKLXsKLX0KLQotUmVuZGVy
U1ZHU2hhZG93VHJlZVJvb3RDb250YWluZXI6On5SZW5kZXJTVkdTaGFkb3dUcmVlUm9vdENvbnRh
aW5lcigpCi17Ci0gICAgaWYgKG1fc2hhZG93Um9vdCkKLSAgICAgICAgbV9zaGFkb3dSb290LT5j
bGVhclNWR1NoYWRvd0hvc3QoKTsKLX0KLQotdm9pZCBSZW5kZXJTVkdTaGFkb3dUcmVlUm9vdENv
bnRhaW5lcjo6dXBkYXRlU3R5bGUoTm9kZTo6U3R5bGVDaGFuZ2UgY2hhbmdlKQotewotICAgIGlm
IChtX3NoYWRvd1Jvb3QgJiYgbV9zaGFkb3dSb290LT5hdHRhY2hlZCgpKQotICAgICAgICBtX3No
YWRvd1Jvb3QtPnJlY2FsY1N0eWxlKGNoYW5nZSk7Ci19Ci0KLXZvaWQgUmVuZGVyU1ZHU2hhZG93
VHJlZVJvb3RDb250YWluZXI6OnVwZGF0ZUZyb21FbGVtZW50KCkKLXsKLSAgICBib29sIGhhZEV4
aXN0aW5nVHJlZSA9IG1fc2hhZG93Um9vdDsKLQotICAgIFNWR1VzZUVsZW1lbnQqIHVzZUVsZW1l
bnQgPSBzdGF0aWNfY2FzdDxTVkdVc2VFbGVtZW50Kj4obm9kZSgpKTsKLSAgICBpZiAoIW1fc2hh
ZG93Um9vdCkgewotICAgICAgICBBU1NFUlQoIW1fcmVjcmVhdGVUcmVlKTsKLSAgICAgICAgbV9z
aGFkb3dSb290ID0gU1ZHU2hhZG93VHJlZVJvb3RFbGVtZW50OjpjcmVhdGUoZG9jdW1lbnQoKSwg
dXNlRWxlbWVudCk7Ci0gICAgICAgIHVzZUVsZW1lbnQtPmJ1aWxkUGVuZGluZ1Jlc291cmNlKCk7
Ci0gICAgfQotCi0gICAgQVNTRVJUKG1fc2hhZG93Um9vdC0+c3ZnU2hhZG93SG9zdCgpID09IHVz
ZUVsZW1lbnQpOwotCi0gICAgYm9vbCBzaG91bGRSZWNyZWF0ZVRyZWUgPSBtX3JlY3JlYXRlVHJl
ZTsKLSAgICBpZiAobV9yZWNyZWF0ZVRyZWUpIHsKLSAgICAgICAgQVNTRVJUKGhhZEV4aXN0aW5n
VHJlZSk7Ci0KLSAgICAgICAgaWYgKG1fc2hhZG93Um9vdC0+YXR0YWNoZWQoKSkKLSAgICAgICAg
ICAgIG1fc2hhZG93Um9vdC0+ZGV0YWNoKCk7Ci0KLSAgICAgICAgbV9zaGFkb3dSb290LT5yZW1v
dmVBbGxDaGlsZHJlbigpOwotICAgICAgICBtX3JlY3JlYXRlVHJlZSA9IGZhbHNlOwotICAgIH0K
LQotICAgIC8vIE9ubHkgcmVidWlsZCB0aGUgc2hhZG93IHRyZWUsIGlmIHdlIGEpIG5ldmVyIGhh
ZCBhIHRyZWUgb3IgYikgd2Ugd2VyZSBzcGVjaWZpY2FsbHkgYXNrZWQgdG8gZG8gc28KLSAgICAv
LyBJZiB0aGUgdXNlIGVsZW1lbnQgaXMgYSBwZW5kaW5nIHJlc291cmNlLCBhbmQgYSkgb3IgYikg
aXMgdHJ1ZSwgZG8gbm90aGluZywgYW5kIHdhaXQgZm9yIHRoZSB1c2UKLSAgICAvLyBlbGVtZW50
IHRvIGJlIGFza2VkIHRvIGJ1aWxkUGVuZGluZ1Jlc291cmNlKCksIHRoaXMgd2lsbCBjYWxsIHVz
IGFnYWluLCB3aXRoIG1fcmVjcmVhdGVUcnVlPXRydWUuCi0gICAgaWYgKChzaG91bGRSZWNyZWF0
ZVRyZWUgfHwgIWhhZEV4aXN0aW5nVHJlZSkgJiYgIXVzZUVsZW1lbnQtPmhhc1BlbmRpbmdSZXNv
dXJjZXMoKSkgewotICAgICAgICB1c2VFbGVtZW50LT5idWlsZFNoYWRvd0FuZEluc3RhbmNlVHJl
ZShtX3NoYWRvd1Jvb3QuZ2V0KCkpOwotCi0gICAgICAgIC8vIEF0dGFjaCBzaGFkb3cgcm9vdCBl
bGVtZW50Ci0gICAgICAgIG1fc2hhZG93Um9vdC0+YXR0YWNoRWxlbWVudChzdHlsZSgpLCByZW5k
ZXJBcmVuYSgpKTsKLQotICAgICAgICAvLyBBdHRhY2ggc3VidHJlZSwgYXMgaWYgaXQgd2FzIGEg
cmVndWxhciBub24tc2hhZG93IHRyZWUKLSAgICAgICAgZm9yIChOb2RlKiBjaGlsZCA9IG1fc2hh
ZG93Um9vdC0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmco
KSkKLSAgICAgICAgICAgIGNoaWxkLT5hdHRhY2goKTsKLSAgICB9Ci0KLSAgICBBU1NFUlQoIW1f
cmVjcmVhdGVUcmVlKTsKLSAgICBSZW5kZXJTVkdUcmFuc2Zvcm1hYmxlQ29udGFpbmVyOjp1cGRh
dGVGcm9tRWxlbWVudCgpOwotfQotCi12b2lkIFJlbmRlclNWR1NoYWRvd1RyZWVSb290Q29udGFp
bmVyOjpzdHlsZURpZENoYW5nZShTdHlsZURpZmZlcmVuY2UgZGlmZiwgY29uc3QgUmVuZGVyU3R5
bGUqIG9sZFN0eWxlKQotewotICAgIFJlbmRlclNWR1RyYW5zZm9ybWFibGVDb250YWluZXI6OnN0
eWxlRGlkQ2hhbmdlKGRpZmYsIG9sZFN0eWxlKTsKLQotICAgIGlmIChSZW5kZXJPYmplY3QqIHNo
YWRvd1Jvb3RSZW5kZXJlciA9IG1fc2hhZG93Um9vdCA/IG1fc2hhZG93Um9vdC0+cmVuZGVyZXIo
KSA6IDApCi0gICAgICAgIHNoYWRvd1Jvb3RSZW5kZXJlci0+c2V0U3R5bGUoc3R5bGUoKSk7Ci19
Ci0KLU5vZGUqIFJlbmRlclNWR1NoYWRvd1RyZWVSb290Q29udGFpbmVyOjpyb290RWxlbWVudCgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fc2hhZG93Um9vdC5nZXQoKTsKLX0KLQotfQotCi0jZW5k
aWYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHU2hhZG93VHJl
ZVJvb3RDb250YWluZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
c3ZnL1JlbmRlclNWR1NoYWRvd1RyZWVSb290Q29udGFpbmVyLmgJKHJldmlzaW9uIDk2NTc1KQor
KysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdTaGFkb3dUcmVlUm9vdENv
bnRhaW5lci5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmln
aHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTAuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0
ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICov
Ci0KLSNpZm5kZWYgUmVuZGVyU1ZHU2hhZG93VHJlZVJvb3RDb250YWluZXJfaAotI2RlZmluZSBS
ZW5kZXJTVkdTaGFkb3dUcmVlUm9vdENvbnRhaW5lcl9oCi0KLSNpZiBFTkFCTEUoU1ZHKQotI2lu
Y2x1ZGUgIlJlbmRlclNWR1RyYW5zZm9ybWFibGVDb250YWluZXIuaCIKLQotbmFtZXNwYWNlIFdl
YkNvcmUgewotICAgIAotY2xhc3MgU1ZHVXNlRWxlbWVudDsKLWNsYXNzIFNWR1NoYWRvd1RyZWVS
b290RWxlbWVudDsKLQotY2xhc3MgUmVuZGVyU1ZHU2hhZG93VHJlZVJvb3RDb250YWluZXIgOiBw
dWJsaWMgUmVuZGVyU1ZHVHJhbnNmb3JtYWJsZUNvbnRhaW5lciB7Ci1wdWJsaWM6Ci0gICAgUmVu
ZGVyU1ZHU2hhZG93VHJlZVJvb3RDb250YWluZXIoU1ZHVXNlRWxlbWVudCopOwotICAgIHZpcnR1
YWwgflJlbmRlclNWR1NoYWRvd1RyZWVSb290Q29udGFpbmVyKCk7Ci0KLSAgICB2aXJ0dWFsIGJv
b2wgaXNTVkdTaGFkb3dUcmVlUm9vdENvbnRhaW5lcigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0K
LQotICAgIHZvaWQgbWFya1NoYWRvd1RyZWVGb3JSZWNyZWF0aW9uKCkgeyBtX3JlY3JlYXRlVHJl
ZSA9IHRydWU7IH0KLSAgICB2b2lkIHVwZGF0ZVN0eWxlKE5vZGU6OlN0eWxlQ2hhbmdlKTsKLSAg
ICB2aXJ0dWFsIHZvaWQgdXBkYXRlRnJvbUVsZW1lbnQoKTsKLQotICAgIE5vZGUqIHJvb3RFbGVt
ZW50KCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkIHN0eWxlRGlkQ2hhbmdl
KFN0eWxlRGlmZmVyZW5jZSwgY29uc3QgUmVuZGVyU3R5bGUqIG9sZFN0eWxlKTsKLQotICAgIGJv
b2wgbV9yZWNyZWF0ZVRyZWU7Ci0gICAgUmVmUHRyPFNWR1NoYWRvd1RyZWVSb290RWxlbWVudD4g
bV9zaGFkb3dSb290OwotfTsKLQotfQotCi0jZW5kaWYKLSNlbmRpZgpJbmRleDogU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdUcmFuc2Zvcm1hYmxlQ29udGFpbmVyLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR1RyYW5z
Zm9ybWFibGVDb250YWluZXIuY3BwCShyZXZpc2lvbiA5NjU3NSkKKysrIFNvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHVHJhbnNmb3JtYWJsZUNvbnRhaW5lci5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI0LDggKzI0LDYgQEAKICNpZiBFTkFCTEUoU1ZHKQogI2luY2x1ZGUgIlJl
bmRlclNWR1RyYW5zZm9ybWFibGVDb250YWluZXIuaCIKIAotI2luY2x1ZGUgIlNWR05hbWVzLmgi
Ci0jaW5jbHVkZSAiU1ZHU2hhZG93VHJlZUVsZW1lbnRzLmgiCiAjaW5jbHVkZSAiU1ZHU3R5bGVk
VHJhbnNmb3JtYWJsZUVsZW1lbnQuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtMzgsMjgg
KzM2LDEyIEBAIFJlbmRlclNWR1RyYW5zZm9ybWFibGVDb250YWluZXI6OlJlbmRlclMKIAogYm9v
bCBSZW5kZXJTVkdUcmFuc2Zvcm1hYmxlQ29udGFpbmVyOjpjYWxjdWxhdGVMb2NhbFRyYW5zZm9y
bSgpCiB7Ci0gICAgU1ZHU3R5bGVkVHJhbnNmb3JtYWJsZUVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0
aWNfY2FzdDxTVkdTdHlsZWRUcmFuc2Zvcm1hYmxlRWxlbWVudCo+KG5vZGUoKSk7Ci0KLSAgICBi
b29sIG5lZWRzVXBkYXRlID0gbV9uZWVkc1RyYW5zZm9ybVVwZGF0ZTsKLSAgICBpZiAobmVlZHNV
cGRhdGUpIHsKLSAgICAgICAgbV9sb2NhbFRyYW5zZm9ybSA9IGVsZW1lbnQtPmFuaW1hdGVkTG9j
YWxUcmFuc2Zvcm0oKTsKLSAgICAgICAgbV9uZWVkc1RyYW5zZm9ybVVwZGF0ZSA9IGZhbHNlOwot
ICAgIH0KLQotICAgIGlmICghZWxlbWVudC0+aGFzVGFnTmFtZShTVkdOYW1lczo6Z1RhZykgfHwg
IXN0YXRpY19jYXN0PFNWR0dFbGVtZW50Kj4oZWxlbWVudCktPmlzU2hhZG93VHJlZUNvbnRhaW5l
ckVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuIG5lZWRzVXBkYXRlOwotCi0gICAgU1ZHU2hhZG93
VHJlZUNvbnRhaW5lckVsZW1lbnQqIHNoYWRvd0VsZW1lbnQgPSBzdGF0aWNfY2FzdDxTVkdTaGFk
b3dUcmVlQ29udGFpbmVyRWxlbWVudCo+KGVsZW1lbnQpOwotICAgIEZsb2F0U2l6ZSB0cmFuc2xh
dGlvbiA9IHNoYWRvd0VsZW1lbnQtPmNvbnRhaW5lclRyYW5zbGF0aW9uKCk7Ci0gICAgaWYgKCFz
aGFkb3dFbGVtZW50LT5jb250YWluZXJPZmZzZXRDaGFuZ2VkKCkgJiYgIXRyYW5zbGF0aW9uLndp
ZHRoKCkgJiYgIXRyYW5zbGF0aW9uLmhlaWdodCgpKQotICAgICAgICByZXR1cm4gbmVlZHNVcGRh
dGU7Ci0KLSAgICAvLyBGSVhNRTogQ291bGQgb3B0aW1pemUgdGhpcyBjYXNlIGZvciB1c2UgdG8g
YXZvaWQgcmVmZXRjaGluZyB0aGUgYW5pbWF0ZWRMb2NhbFRyYW5zZm9ybSgpIGhlcmUsIGlmIG9u
bHkgdGhlIGNvbnRhaW5lclRyYW5zbGF0aW9uKCkgY2hhbmdlZC4KLSAgICBpZiAoIW5lZWRzVXBk
YXRlKQotICAgICAgICBtX2xvY2FsVHJhbnNmb3JtID0gZWxlbWVudC0+YW5pbWF0ZWRMb2NhbFRy
YW5zZm9ybSgpOworICAgIGlmICghbV9uZWVkc1RyYW5zZm9ybVVwZGF0ZSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOwogCi0gICAgbV9sb2NhbFRyYW5zZm9ybS50cmFuc2xhdGUodHJhbnNsYXRpb24u
d2lkdGgoKSwgdHJhbnNsYXRpb24uaGVpZ2h0KCkpOwotICAgIHNoYWRvd0VsZW1lbnQtPnNldENv
bnRhaW5lck9mZnNldENoYW5nZWQoZmFsc2UpOworICAgIFNWR1N0eWxlZFRyYW5zZm9ybWFibGVF
bGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8U1ZHU3R5bGVkVHJhbnNmb3JtYWJsZUVsZW1l
bnQqPihub2RlKCkpOworICAgIG1fbG9jYWxUcmFuc2Zvcm0gPSBlbGVtZW50LT5hbmltYXRlZExv
Y2FsVHJhbnNmb3JtKCk7CisgICAgbV9uZWVkc1RyYW5zZm9ybVVwZGF0ZSA9IGZhbHNlOwogICAg
IHJldHVybiB0cnVlOwogfQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1Jl
bmRlclNWR1ZpZXdwb3J0Q29udGFpbmVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR1ZpZXdwb3J0Q29udGFpbmVyLmNwcAkocmV2aXNpb24g
OTY1NzUpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR1ZpZXdwb3J0
Q29udGFpbmVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUsMTAgKzI1LDkgQEAKICNpZiBFTkFC
TEUoU1ZHKQogI2luY2x1ZGUgIlJlbmRlclNWR1ZpZXdwb3J0Q29udGFpbmVyLmgiCiAKLSNpbmNs
dWRlICJHcmFwaGljc0NvbnRleHQuaCIKLSNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCi0jaW5jbHVk
ZSAiU1ZHTmFtZXMuaCIKKyNpbmNsdWRlICJTVkdTeW1ib2xFbGVtZW50LmgiCiAjaW5jbHVkZSAi
U1ZHU1ZHRWxlbWVudC5oIgorI2luY2x1ZGUgIlNWR0ltYWdlQnVmZmVyVG9vbHMuaCIKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCkBAIC00NSwzNyArNDQsNDEgQEAgdm9pZCBSZW5kZXJTVkdWaWV3
cG9ydENvbnRhaW5lcjo6YXBwbHlWaQogCiB2b2lkIFJlbmRlclNWR1ZpZXdwb3J0Q29udGFpbmVy
OjpjYWxjVmlld3BvcnQoKQogewotICAgICBTVkdFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nh
c3Q8U1ZHRWxlbWVudCo+KG5vZGUoKSk7Ci0gICAgIGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKFNW
R05hbWVzOjpzdmdUYWcpKSB7Ci0gICAgICAgICBTVkdTVkdFbGVtZW50KiBzdmcgPSBzdGF0aWNf
Y2FzdDxTVkdTVkdFbGVtZW50Kj4oZWxlbWVudCk7Ci0KLSAgICAgICAgIEZsb2F0UmVjdCBvbGRW
aWV3cG9ydCA9IG1fdmlld3BvcnQ7Ci0gICAgICAgICBtX3ZpZXdwb3J0ID0gRmxvYXRSZWN0KHN2
Zy0+eCgpLnZhbHVlKHN2ZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBzdmct
PnkoKS52YWx1ZShzdmcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgc3ZnLT53
aWR0aCgpLnZhbHVlKHN2ZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBzdmct
PmhlaWdodCgpLnZhbHVlKHN2ZykpOwotCi0gICAgICAgIGlmIChvbGRWaWV3cG9ydCAhPSBtX3Zp
ZXdwb3J0KQotICAgICAgICAgICAgc2V0TmVlZHNCb3VuZGFyaWVzVXBkYXRlKCk7CisgICAgaWYg
KG5vZGUoKS0+aGFzVGFnTmFtZShTVkdOYW1lczo6c3ltYm9sVGFnKSkgeworICAgICAgICBtX3Zp
ZXdwb3J0ID0gRmxvYXRSZWN0KEZsb2F0UG9pbnQoKSwgbV9vdmVycmlkZVZpZXdwb3J0U2l6ZSk7
CisgICAgICAgIHJldHVybjsKICAgICB9CisKKyAgICBTVkdTVkdFbGVtZW50KiBzdmcgPSBzdGF0
aWNfY2FzdDxTVkdTVkdFbGVtZW50Kj4obm9kZSgpKTsKKworICAgIEZsb2F0UmVjdCBvbGRWaWV3
cG9ydCA9IG1fdmlld3BvcnQ7CisgICAgbV92aWV3cG9ydCA9IEZsb2F0UmVjdChzdmctPngoKS52
YWx1ZShzdmcpLCBzdmctPnkoKS52YWx1ZShzdmcpLCBzdmctPndpZHRoKCkudmFsdWUoc3ZnKSwg
c3ZnLT5oZWlnaHQoKS52YWx1ZShzdmcpKTsKKyAgICBpZiAoIW1fb3ZlcnJpZGVWaWV3cG9ydFNp
emUuaXNFbXB0eSgpKQorICAgICAgICBtX3ZpZXdwb3J0LnNldFNpemUobV9vdmVycmlkZVZpZXdw
b3J0U2l6ZSk7CisKKyAgICBpZiAob2xkVmlld3BvcnQgIT0gbV92aWV3cG9ydCkKKyAgICAgICAg
c2V0TmVlZHNCb3VuZGFyaWVzVXBkYXRlKCk7CiB9CiAKLUFmZmluZVRyYW5zZm9ybSBSZW5kZXJT
VkdWaWV3cG9ydENvbnRhaW5lcjo6dmlld3BvcnRUcmFuc2Zvcm0oKSBjb25zdAordm9pZCBSZW5k
ZXJTVkdWaWV3cG9ydENvbnRhaW5lcjo6Y2FsY3VsYXRlVmlld3BvcnRUcmFuc2Zvcm0oQWZmaW5l
VHJhbnNmb3JtJiB2aWV3cG9ydFRyYW5zZm9ybSkgY29uc3QKIHsKICAgICBpZiAobm9kZSgpLT5o
YXNUYWdOYW1lKFNWR05hbWVzOjpzdmdUYWcpKSB7CiAgICAgICAgIFNWR1NWR0VsZW1lbnQqIHN2
ZyA9IHN0YXRpY19jYXN0PFNWR1NWR0VsZW1lbnQqPihub2RlKCkpOwotICAgICAgICByZXR1cm4g
c3ZnLT52aWV3Qm94VG9WaWV3VHJhbnNmb3JtKG1fdmlld3BvcnQud2lkdGgoKSwgbV92aWV3cG9y
dC5oZWlnaHQoKSk7CisgICAgICAgIHZpZXdwb3J0VHJhbnNmb3JtID0gc3ZnLT52aWV3Qm94VG9W
aWV3VHJhbnNmb3JtKG1fdmlld3BvcnQud2lkdGgoKSwgbV92aWV3cG9ydC5oZWlnaHQoKSk7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUKG5vZGUoKS0+aGFzVGFnTmFtZShTVkdOYW1lczo6
c3ltYm9sVGFnKSk7CisgICAgICAgIFNWR1N5bWJvbEVsZW1lbnQqIHN5bWJvbCA9IHN0YXRpY19j
YXN0PFNWR1N5bWJvbEVsZW1lbnQqPihub2RlKCkpOworICAgICAgICB2aWV3cG9ydFRyYW5zZm9y
bSA9IHN5bWJvbC0+dmlld0JveFRvVmlld1RyYW5zZm9ybShtX3ZpZXdwb3J0LndpZHRoKCksIG1f
dmlld3BvcnQuaGVpZ2h0KCkpOwogICAgIH0KLQotICAgIHJldHVybiBBZmZpbmVUcmFuc2Zvcm0o
KTsKIH0KIAogY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBSZW5kZXJTVkdWaWV3cG9ydENvbnRhaW5l
cjo6bG9jYWxUb1BhcmVudFRyYW5zZm9ybSgpIGNvbnN0CiB7Ci0gICAgbV9sb2NhbFRvUGFyZW50
VHJhbnNmb3JtID0gQWZmaW5lVHJhbnNmb3JtOjp0cmFuc2xhdGlvbihtX3ZpZXdwb3J0LngoKSwg
bV92aWV3cG9ydC55KCkpICogdmlld3BvcnRUcmFuc2Zvcm0oKTsKKyAgICBBZmZpbmVUcmFuc2Zv
cm0gdmlld3BvcnRUcmFuc2Zvcm07CisgICAgY2FsY3VsYXRlVmlld3BvcnRUcmFuc2Zvcm0odmll
d3BvcnRUcmFuc2Zvcm0pOworCisgICAgbV9sb2NhbFRvUGFyZW50VHJhbnNmb3JtID0gQWZmaW5l
VHJhbnNmb3JtOjp0cmFuc2xhdGlvbihtX3ZpZXdwb3J0LngoKSwgbV92aWV3cG9ydC55KCkpICog
dmlld3BvcnRUcmFuc2Zvcm07CiAgICAgcmV0dXJuIG1fbG9jYWxUb1BhcmVudFRyYW5zZm9ybTsK
LSAgICAvLyBJZiB0aGlzIGNsYXNzIHdlcmUgZXZlciBnaXZlbiBhIGxvY2FsVHJhbnNmb3JtKCks
IHRoZW4gdGhlIGFib3ZlIHdvdWxkIHJlYWQ6Ci0gICAgLy8gcmV0dXJuIHZpZXdwb3J0VHJhbnNs
YXRpb24gKiBsb2NhbFRyYW5zZm9ybSgpICogdmlld3BvcnRUcmFuc2Zvcm0oKQogfQogCiBib29s
IFJlbmRlclNWR1ZpZXdwb3J0Q29udGFpbmVyOjpwb2ludElzSW5zaWRlVmlld3BvcnRDbGlwKGNv
bnN0IEZsb2F0UG9pbnQmIHBvaW50SW5QYXJlbnQpCkBAIC04Nyw2ICs5MCwxNSBAQCBib29sIFJl
bmRlclNWR1ZpZXdwb3J0Q29udGFpbmVyOjpwb2ludElzCiAgICAgcmV0dXJuIG1fdmlld3BvcnQu
Y29udGFpbnMocG9pbnRJblBhcmVudCk7CiB9CiAKK3ZvaWQgUmVuZGVyU1ZHVmlld3BvcnRDb250
YWluZXI6OnBhaW50KFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBMYXlvdXRQb2ludCYgcG9p
bnQpCit7CisgICAgaWYgKG5vZGUoKS0+aGFzVGFnTmFtZShTVkdOYW1lczo6c3ltYm9sVGFnKSkg
eworICAgICAgICBpZiAoU1ZHSW1hZ2VCdWZmZXJUb29sczo6Y3VycmVudFN1YnRyZWVQYWludE1v
ZGUoKSAhPSBTVkdJbWFnZUJ1ZmZlclRvb2xzOjpJbmNsdWRlSW5kaXJlY3RDb250ZW50KQorICAg
ICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBSZW5kZXJTVkdDb250YWluZXI6OnBhaW50KHBh
aW50SW5mbywgcG9pbnQpOworfQorCiB9CiAKICNlbmRpZiAvLyBFTkFCTEUoU1ZHKQpJbmRleDog
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdWaWV3cG9ydENvbnRhaW5lci5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHVmll
d3BvcnRDb250YWluZXIuaAkocmV2aXNpb24gOTY1NzUpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvc3ZnL1JlbmRlclNWR1ZpZXdwb3J0Q29udGFpbmVyLmgJKHdvcmtpbmcgY29weSkKQEAg
LTI4LDI3ICsyOCwzNCBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLS8vIFRoaXMgaXMgdXNl
ZCBmb3Igbm9uLXJvb3QgPHN2Zz4gZWxlbWVudHMgYW5kIDxtYXJrZXI+IGVsZW1lbnRzLCBuZWl0
aGVyIG9mIHdoaWNoIGFyZSBTVkdUcmFuc2Zvcm1hYmxlCisvLyBUaGlzIGlzIHVzZWQgZm9yIG5v
bi1yb290IDxzdmc+IGVsZW1lbnRzIGFuZCA8c3ltYm9sPiBlbGVtZW50cywgbmVpdGhlciBvZiB3
aGljaCBhcmUgU1ZHVHJhbnNmb3JtYWJsZQogLy8gdGh1cyB3ZSBpbmhlcml0IGZyb20gUmVuZGVy
U1ZHQ29udGFpbmVyIGluc3RlYWQgb2YgUmVuZGVyU1ZHVHJhbnNmb3JtYWJsZUNvbnRhaW5lcgog
Y2xhc3MgUmVuZGVyU1ZHVmlld3BvcnRDb250YWluZXIgOiBwdWJsaWMgUmVuZGVyU1ZHQ29udGFp
bmVyIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBSZW5kZXJTVkdWaWV3cG9ydENvbnRhaW5lcihT
VkdTdHlsZWRFbGVtZW50Kik7CiAKKyAgICBGbG9hdFJlY3Qgdmlld3BvcnQoKSBjb25zdCB7IHJl
dHVybiBtX3ZpZXdwb3J0OyB9CisgICAgdm9pZCBzZXRWaWV3cG9ydFNpemUoY29uc3QgRmxvYXRT
aXplJiBzaXplKSB7IG1fb3ZlcnJpZGVWaWV3cG9ydFNpemUgPSBzaXplOyB9CisKIHByaXZhdGU6
CiAgICAgdmlydHVhbCBib29sIGlzU1ZHQ29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsg
fQogICAgIHZpcnR1YWwgYm9vbCBpc1NWR1ZpZXdwb3J0Q29udGFpbmVyKCkgY29uc3QgeyByZXR1
cm4gdHJ1ZTsgfQogICAgIHZpcnR1YWwgY29uc3QgY2hhciogcmVuZGVyTmFtZSgpIGNvbnN0IHsg
cmV0dXJuICJSZW5kZXJTVkdWaWV3cG9ydENvbnRhaW5lciI7IH0KIAotICAgIEFmZmluZVRyYW5z
Zm9ybSB2aWV3cG9ydFRyYW5zZm9ybSgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBjYWxjdWxh
dGVWaWV3cG9ydFRyYW5zZm9ybShBZmZpbmVUcmFuc2Zvcm0mKSBjb25zdDsKICAgICB2aXJ0dWFs
IGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgbG9jYWxUb1BhcmVudFRyYW5zZm9ybSgpIGNvbnN0Owog
CiAgICAgdmlydHVhbCB2b2lkIGNhbGNWaWV3cG9ydCgpOwogCisgICAgdmlydHVhbCB2b2lkIHBh
aW50KFBhaW50SW5mbyYsIGNvbnN0IExheW91dFBvaW50Jik7CiAgICAgdmlydHVhbCB2b2lkIGFw
cGx5Vmlld3BvcnRDbGlwKFBhaW50SW5mbyYpOwogICAgIHZpcnR1YWwgYm9vbCBwb2ludElzSW5z
aWRlVmlld3BvcnRDbGlwKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50SW5QYXJlbnQpOwogCi0gICAg
RmxvYXRSZWN0IG1fdmlld3BvcnQ7CiAgICAgbXV0YWJsZSBBZmZpbmVUcmFuc2Zvcm0gbV9sb2Nh
bFRvUGFyZW50VHJhbnNmb3JtOworCitwcm90ZWN0ZWQ6CisgICAgRmxvYXRSZWN0IG1fdmlld3Bv
cnQ7CisgICAgRmxvYXRTaXplIG1fb3ZlcnJpZGVWaWV3cG9ydFNpemU7CiB9OwogICAKIGlubGlu
ZSBSZW5kZXJTVkdWaWV3cG9ydENvbnRhaW5lciogdG9SZW5kZXJTVkdWaWV3cG9ydENvbnRhaW5l
cihSZW5kZXJPYmplY3QqIG9iamVjdCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9z
dmcvU1ZHSW1hZ2VCdWZmZXJUb29scy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL3N2Zy9TVkdJbWFnZUJ1ZmZlclRvb2xzLmNwcAkocmV2aXNpb24gOTY1NzUpCisr
KyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1NWR0ltYWdlQnVmZmVyVG9vbHMuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0zOCw2ICszOCwxOCBAQCBzdGF0aWMgQWZmaW5lVHJhbnNmb3JtJiBj
dXJyZW50Q29udGVudFRyCiAgICAgcmV0dXJuIHNfY3VycmVudENvbnRlbnRUcmFuc2Zvcm1hdGlv
bjsKIH0KIAorU1ZHSW1hZ2VCdWZmZXJUb29sczo6U3VidHJlZVBhaW50TW9kZSYgU1ZHSW1hZ2VC
dWZmZXJUb29sczo6Y3VycmVudFN1YnRyZWVQYWludE1vZGUoKQoreworICAgIHN0YXRpYyBTdWJ0
cmVlUGFpbnRNb2RlIHNfY3VycmVudFBhaW50TW9kZSA9IEV4Y2x1ZGVJbmRpcmVjdENvbnRlbnQ7
CisgICAgcmV0dXJuIHNfY3VycmVudFBhaW50TW9kZTsKK30KKyAgICAKK2Jvb2wmIFNWR0ltYWdl
QnVmZmVyVG9vbHM6OmN1cnJlbnRseVJlbmRlcmluZ1RvSW1hZ2UoKQoreworICAgIHN0YXRpYyBi
b29sIHNfY3VycmVudGx5UmVuZGVyaW5nVG9JbWFnZSA9IGZhbHNlOworICAgIHJldHVybiBzX2N1
cnJlbnRseVJlbmRlcmluZ1RvSW1hZ2U7Cit9CisKIHZvaWQgU1ZHSW1hZ2VCdWZmZXJUb29sczo6
Y2FsY3VsYXRlVHJhbnNmb3JtYXRpb25Ub091dGVybW9zdFNWR0Nvb3JkaW5hdGVTeXN0ZW0oY29u
c3QgUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgQWZmaW5lVHJhbnNmb3JtJiBhYnNvbHV0ZVRyYW5z
Zm9ybSkKIHsKICAgICBjb25zdCBSZW5kZXJPYmplY3QqIGN1cnJlbnQgPSByZW5kZXJlcjsKQEAg
LTc1LDcgKzg3LDcgQEAgYm9vbCBTVkdJbWFnZUJ1ZmZlclRvb2xzOjpjcmVhdGVJbWFnZUJ1Zgog
ICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIFNWR0ltYWdlQnVmZmVyVG9vbHM6OnJlbmRlclN1
YnRyZWVUb0ltYWdlQnVmZmVyKEltYWdlQnVmZmVyKiBpbWFnZSwgUmVuZGVyT2JqZWN0KiBpdGVt
LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHN1YnRyZWVDb250ZW50VHJhbnNmb3JtYXRpb24pCit2
b2lkIFNWR0ltYWdlQnVmZmVyVG9vbHM6OnJlbmRlclN1YnRyZWVUb0ltYWdlQnVmZmVyKEltYWdl
QnVmZmVyKiBpbWFnZSwgUmVuZGVyT2JqZWN0KiBpdGVtLCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0m
IHN1YnRyZWVDb250ZW50VHJhbnNmb3JtYXRpb24sIFNWR0ltYWdlQnVmZmVyVG9vbHM6OlN1YnRy
ZWVQYWludE1vZGUgbW9kZSkKIHsKICAgICBBU1NFUlQoaXRlbSk7CiAgICAgQVNTRVJUKGltYWdl
KTsKQEAgLTg0LDEzICs5NiwyMyBAQCB2b2lkIFNWR0ltYWdlQnVmZmVyVG9vbHM6OnJlbmRlclN1
YnRyZWVUCiAgICAgUGFpbnRJbmZvIGluZm8oaW1hZ2UtPmNvbnRleHQoKSwgUGFpbnRJbmZvOjpp
bmZpbml0ZVJlY3QoKSwgUGFpbnRQaGFzZUZvcmVncm91bmQsIDAsIDAsIDAsIDApOwogCiAgICAg
QWZmaW5lVHJhbnNmb3JtJiBjb250ZW50VHJhbnNmb3JtYXRpb24gPSBjdXJyZW50Q29udGVudFRy
YW5zZm9ybWF0aW9uKCk7CisgICAgU3VidHJlZVBhaW50TW9kZSYgcGFpbnRNb2RlID0gY3VycmVu
dFN1YnRyZWVQYWludE1vZGUoKTsKKyAgICBib29sJiByZW5kZXJpbmdUb0ltYWdlID0gY3VycmVu
dGx5UmVuZGVyaW5nVG9JbWFnZSgpOworCiAgICAgQWZmaW5lVHJhbnNmb3JtIHNhdmVkQ29udGVu
dFRyYW5zZm9ybWF0aW9uID0gY29udGVudFRyYW5zZm9ybWF0aW9uOworICAgIFN1YnRyZWVQYWlu
dE1vZGUgc2F2ZWRQYWludE1vZGUgPSBwYWludE1vZGU7CisgICAgYm9vbCBzYXZlZFJlbmRlcmlu
Z1RvSW1hZ2UgPSByZW5kZXJpbmdUb0ltYWdlOworCiAgICAgY29udGVudFRyYW5zZm9ybWF0aW9u
ID0gc3VidHJlZUNvbnRlbnRUcmFuc2Zvcm1hdGlvbiAqIGNvbnRlbnRUcmFuc2Zvcm1hdGlvbjsK
KyAgICBwYWludE1vZGUgPSBtb2RlOworICAgIHJlbmRlcmluZ1RvSW1hZ2UgPSB0cnVlOwogCiAg
ICAgaXRlbS0+bGF5b3V0SWZOZWVkZWQoKTsKICAgICBpdGVtLT5wYWludChpbmZvLCBJbnRQb2lu
dCgpKTsKIAorICAgIHBhaW50TW9kZSA9IHNhdmVkUGFpbnRNb2RlOwogICAgIGNvbnRlbnRUcmFu
c2Zvcm1hdGlvbiA9IHNhdmVkQ29udGVudFRyYW5zZm9ybWF0aW9uOworICAgIHJlbmRlcmluZ1Rv
SW1hZ2UgPSBzYXZlZFJlbmRlcmluZ1RvSW1hZ2U7CiB9CiAKIHZvaWQgU1ZHSW1hZ2VCdWZmZXJU
b29sczo6Y2xpcFRvSW1hZ2VCdWZmZXIoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBB
ZmZpbmVUcmFuc2Zvcm0mIGFic29sdXRlVHJhbnNmb3JtLCBjb25zdCBGbG9hdFJlY3QmIGNsYW1w
ZWRBYnNvbHV0ZVRhcmdldFJlY3QsIE93blB0cjxJbWFnZUJ1ZmZlcj4mIGltYWdlQnVmZmVyKQpA
QCAtMTEyLDcgKzEzNCw3IEBAIHZvaWQgU1ZHSW1hZ2VCdWZmZXJUb29sczo6Y2xpcFRvSW1hZ2VC
dWYKIAogSW50U2l6ZSBTVkdJbWFnZUJ1ZmZlclRvb2xzOjpyb3VuZGVkSW1hZ2VCdWZmZXJTaXpl
KGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKIHsKLSAgICByZXR1cm4gSW50U2l6ZShzdGF0aWNfY2Fz
dDxpbnQ+KGxyb3VuZGYoc2l6ZS53aWR0aCgpKSksIHN0YXRpY19jYXN0PGludD4obHJvdW5kZihz
aXplLmhlaWdodCgpKSkpOworICAgIHJldHVybiBJbnRTaXplKGNsYW1wVG9JbnRlZ2VyKGNlaWxm
KHNpemUud2lkdGgoKSkpLCBjbGFtcFRvSW50ZWdlcihjZWlsZihzaXplLmhlaWdodCgpKSkpOwog
fQogCiBGbG9hdFJlY3QgU1ZHSW1hZ2VCdWZmZXJUb29sczo6Y2xhbXBlZEFic29sdXRlVGFyZ2V0
UmVjdChjb25zdCBGbG9hdFJlY3QmIGFic29sdXRlVGFyZ2V0UmVjdCkKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZHSW1hZ2VCdWZmZXJUb29scy5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZHSW1hZ2VCdWZmZXJUb29scy5oCShyZXZp
c2lvbiA5NjU3NSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZHSW1hZ2VCdWZm
ZXJUb29scy5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw4ICszNSwxNiBAQCBjbGFzcyBSZW5kZXJP
YmplY3Q7CiBjbGFzcyBTVkdJbWFnZUJ1ZmZlclRvb2xzIHsKICAgICBXVEZfTUFLRV9OT05DT1BZ
QUJMRShTVkdJbWFnZUJ1ZmZlclRvb2xzKTsKIHB1YmxpYzoKKyAgICBlbnVtIFN1YnRyZWVQYWlu
dE1vZGUgeworICAgICAgICBJbmNsdWRlSW5kaXJlY3RDb250ZW50LAorICAgICAgICBFeGNsdWRl
SW5kaXJlY3RDb250ZW50CisgICAgfTsKKworICAgIHN0YXRpYyBTdWJ0cmVlUGFpbnRNb2RlJiBj
dXJyZW50U3VidHJlZVBhaW50TW9kZSgpOworICAgIHN0YXRpYyBib29sJiBjdXJyZW50bHlSZW5k
ZXJpbmdUb0ltYWdlKCk7CisKICAgICBzdGF0aWMgYm9vbCBjcmVhdGVJbWFnZUJ1ZmZlcihjb25z
dCBGbG9hdFJlY3QmIGFic29sdXRlVGFyZ2V0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBjbGFtcGVk
QWJzb2x1dGVUYXJnZXRSZWN0LCBPd25QdHI8SW1hZ2VCdWZmZXI+JiwgQ29sb3JTcGFjZSk7Ci0g
ICAgc3RhdGljIHZvaWQgcmVuZGVyU3VidHJlZVRvSW1hZ2VCdWZmZXIoSW1hZ2VCdWZmZXIqLCBS
ZW5kZXJPYmplY3QqLCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mKTsKKyAgICBzdGF0aWMgdm9pZCBy
ZW5kZXJTdWJ0cmVlVG9JbWFnZUJ1ZmZlcihJbWFnZUJ1ZmZlciosIFJlbmRlck9iamVjdCosIGNv
bnN0IEFmZmluZVRyYW5zZm9ybSYsIFN1YnRyZWVQYWludE1vZGUgPSBFeGNsdWRlSW5kaXJlY3RD
b250ZW50KTsKICAgICBzdGF0aWMgdm9pZCBjbGlwVG9JbWFnZUJ1ZmZlcihHcmFwaGljc0NvbnRl
eHQqLCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIGFic29sdXRlVHJhbnNmb3JtLCBjb25zdCBGbG9h
dFJlY3QmIGNsYW1wZWRBYnNvbHV0ZVRhcmdldFJlY3QsIE93blB0cjxJbWFnZUJ1ZmZlcj4mKTsK
IAogICAgIHN0YXRpYyB2b2lkIGNhbGN1bGF0ZVRyYW5zZm9ybWF0aW9uVG9PdXRlcm1vc3RTVkdD
b29yZGluYXRlU3lzdGVtKGNvbnN0IFJlbmRlck9iamVjdCosIEFmZmluZVRyYW5zZm9ybSYgYWJz
b2x1dGVUcmFuc2Zvcm0pOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9TVkdS
ZW5kZXJTdXBwb3J0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
c3ZnL1NWR1JlbmRlclN1cHBvcnQuY3BwCShyZXZpc2lvbiA5NjU3NSkKKysrIFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9zdmcvU1ZHUmVuZGVyU3VwcG9ydC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTIyNyw2ICsyMjcsNyBAQCB2b2lkIFNWR1JlbmRlclN1cHBvcnQ6OmxheW91dENoaWxkcmVuKFJl
CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+aXNTVkdQYXRoKCkpCiAgICAgICAgICAg
ICAgICAgICAgICAgICB0b1JlbmRlclNWR1BhdGgoY2hpbGQpLT5zZXROZWVkc1BhdGhVcGRhdGUo
KTsKIAorICAgICAgICAgICAgICAgICAgICBTVkdFbGVtZW50SW5zdGFuY2U6OmludmFsaWRhdGVB
bGxJbnN0YW5jZXNPZkVsZW1lbnQoZWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgIG5lZWRz
TGF5b3V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1NWR1Jlc291cmNlc0N5Y2xlU29sdmVyLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1NWR1Jlc291cmNlc0N5
Y2xlU29sdmVyLmNwcAkocmV2aXNpb24gOTY1NzUpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvc3ZnL1NWR1Jlc291cmNlc0N5Y2xlU29sdmVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQs
NiArMjQsNyBAQAogI2RlZmluZSBERUJVR19DWUNMRV9ERVRFQ1RJT04gMAogCiAjaWYgRU5BQkxF
KFNWRykKKyNpbmNsdWRlICJSZW5kZXJTVkdEdXBsaWNhdGUuaCIKICNpbmNsdWRlICJSZW5kZXJT
VkdSZXNvdXJjZUNsaXBwZXIuaCIKICNpbmNsdWRlICJSZW5kZXJTVkdSZXNvdXJjZUZpbHRlci5o
IgogI2luY2x1ZGUgIlJlbmRlclNWR1Jlc291cmNlTWFya2VyLmgiCkBAIC01Miw5ICs1MywxNCBA
QCBib29sIFNWR1Jlc291cmNlc0N5Y2xlU29sdmVyOjpyZXNvdXJjZUNvCiB7CiAgICAgQVNTRVJU
KHJlbmRlcmVyKTsKIAotICAgIC8vIEZpcnN0IG9wZXJhdGUgb24gdGhlIHJlc291cmNlcyBvZiB0
aGUgZ2l2ZW4gcmVuZGVyZXIuCi0gICAgLy8gPG1hcmtlciBpZD0iYSI+IDxwYXRoIG1hcmtlci1z
dGFydD0idXJsKCNiKSIvPiAuLi4KLSAgICAvLyA8bWFya2VyIGlkPSJiIiBtYXJrZXItc3RhcnQ9
InVybCgjYSkiLz4KKyAgICBpZiAocmVuZGVyZXItPmlzU1ZHRHVwbGljYXRlKCkpIHsKKyAgICAg
ICAgaWYgKFJlbmRlck9iamVjdCogcmVmZXJlbmNlZFJlbmRlcmVyID0gdG9SZW5kZXJTVkdEdXBs
aWNhdGUocmVuZGVyZXIpLT5yZWZlcmVuY2VkUmVuZGVyZXIoKSkgeworICAgICAgICAgICAgaWYg
KHJlc291cmNlQ29udGFpbnNDeWNsZXMocmVmZXJlbmNlZFJlbmRlcmVyKSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGZvciBj
eWNsZXMgd2l0aGluIGxvY2FsIHJlc291cmNlcyBvZiB0aGUgZ2l2ZW4gcmVuZGVyZXIuCiAgICAg
aWYgKFNWR1Jlc291cmNlcyogcmVzb3VyY2VzID0gU1ZHUmVzb3VyY2VzQ2FjaGU6OmNhY2hlZFJl
c291cmNlc0ZvclJlbmRlck9iamVjdChyZW5kZXJlcikpIHsKICAgICAgICAgSGFzaFNldDxSZW5k
ZXJTVkdSZXNvdXJjZUNvbnRhaW5lcio+IHJlc291cmNlU2V0OwogICAgICAgICByZXNvdXJjZXMt
PmJ1aWxkU2V0T2ZSZXNvdXJjZXMocmVzb3VyY2VTZXQpOwpAQCAtNjcsMjYgKzczLDggQEAgYm9v
bCBTVkdSZXNvdXJjZXNDeWNsZVNvbHZlcjo6cmVzb3VyY2VDbwogICAgICAgICB9CiAgICAgfQog
Ci0gICAgLy8gVGhlbiBvcGVyYXRlIG9uIHRoZSBjaGlsZCByZXNvdXJjZXMgb2YgdGhlIGdpdmVu
IHJlbmRlcmVyLgotICAgIC8vIDxtYXJrZXIgaWQ9ImEiPiA8cGF0aCBtYXJrZXItc3RhcnQ9InVy
bCgjYikiLz4gLi4uCi0gICAgLy8gPG1hcmtlciBpZD0iYiI+IDxwYXRoIG1hcmtlci1zdGFydD0i
dXJsKCNhKSIvPiAuLi4KKyAgICAvLyBXYWxrIGNoaWxkcmVuIHJlY3Vyc2l2ZWx5LCBzdG9wIGlt
bWVkaWF0ZWx5IGlmIHdlIGZvdW5kIGEgY3ljbGUKICAgICBmb3IgKFJlbmRlck9iamVjdCogY2hp
bGQgPSByZW5kZXJlci0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNp
YmxpbmcoKSkgewotICAgICAgICBTVkdSZXNvdXJjZXMqIGNoaWxkUmVzb3VyY2VzID0gU1ZHUmVz
b3VyY2VzQ2FjaGU6OmNhY2hlZFJlc291cmNlc0ZvclJlbmRlck9iamVjdChjaGlsZCk7Ci0gICAg
ICAgIGlmICghY2hpbGRSZXNvdXJjZXMpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
Ci0gICAgICAgIC8vIEEgY2hpbGQgb2YgdGhlIGdpdmVuICdyZXNvdXJjZScgY29udGFpbnMgcmVz
b3VyY2VzLiAKLSAgICAgICAgSGFzaFNldDxSZW5kZXJTVkdSZXNvdXJjZUNvbnRhaW5lcio+IGNo
aWxkU2V0OwotICAgICAgICBjaGlsZFJlc291cmNlcy0+YnVpbGRTZXRPZlJlc291cmNlcyhjaGls
ZFNldCk7Ci0KLSAgICAgICAgLy8gV2FsayBhbGwgY2hpbGQgcmVzb3VyY2VzIGFuZCBjaGVjayB3
aGV0ZXIgdGhleSByZWZlcmVuY2UgYW55IHJlc291cmNlIGNvbnRhaW5lZCBpbiB0aGUgcmVzb3Vy
Y2VzIHNldC4KLSAgICAgICAgSGFzaFNldDxSZW5kZXJTVkdSZXNvdXJjZUNvbnRhaW5lcio+Ojpp
dGVyYXRvciBlbmQgPSBjaGlsZFNldC5lbmQoKTsKLSAgICAgICAgZm9yIChIYXNoU2V0PFJlbmRl
clNWR1Jlc291cmNlQ29udGFpbmVyKj46Oml0ZXJhdG9yIGl0ID0gY2hpbGRTZXQuYmVnaW4oKTsg
aXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgICAgICBpZiAobV9hbGxSZXNvdXJjZXMuY29udGFp
bnMoKml0KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAg
ICAgIC8vIFdhbGsgY2hpbGRyZW4gcmVjdXJzaXZlbHksIHN0b3AgaW1tZWRpYXRlbHkgaWYgd2Ug
Zm91bmQgYSBjeWNsZQogICAgICAgICBpZiAocmVzb3VyY2VDb250YWluc0N5Y2xlcyhjaGlsZCkp
CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvc3ZnL1NWR1NoYWRvd1RyZWVFbGVtZW50cy5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9TVkdTaGFkb3dUcmVlRWxlbWVudHMuY3BwCShyZXZp
c2lvbiA5NjU3NSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZHU2hhZG93VHJl
ZUVsZW1lbnRzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAxMC4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICog
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3Qs
IHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
Ci0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWYgRU5BQkxFKFNWRykKLSNpbmNsdWRl
ICJTVkdTaGFkb3dUcmVlRWxlbWVudHMuaCIKLQotI2luY2x1ZGUgIkNTU1N0eWxlU2VsZWN0b3Iu
aCIKLSNpbmNsdWRlICJEb2N1bWVudC5oIgotI2luY2x1ZGUgIkZsb2F0U2l6ZS5oIgotI2luY2x1
ZGUgIlJlbmRlck9iamVjdC5oIgotI2luY2x1ZGUgIlNWR05hbWVzLmgiCi0jaW5jbHVkZSAiU1ZH
VXNlRWxlbWVudC5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLS8vIFNWR1NoYWRvd1RyZWVD
b250YWluZXJFbGVtZW50Ci0KLVNWR1NoYWRvd1RyZWVDb250YWluZXJFbGVtZW50OjpTVkdTaGFk
b3dUcmVlQ29udGFpbmVyRWxlbWVudChEb2N1bWVudCogZG9jdW1lbnQpCi0gICAgOiBTVkdHRWxl
bWVudChTVkdOYW1lczo6Z1RhZywgZG9jdW1lbnQpCi0gICAgLCBtX2NvbnRhaW5lck9mZnNldENo
YW5nZWQoZmFsc2UpCi17Ci19Ci0KLVBhc3NSZWZQdHI8U1ZHU2hhZG93VHJlZUNvbnRhaW5lckVs
ZW1lbnQ+IFNWR1NoYWRvd1RyZWVDb250YWluZXJFbGVtZW50OjpjcmVhdGUoRG9jdW1lbnQqIGRv
Y3VtZW50KQotewotICAgIHJldHVybiBhZG9wdFJlZihuZXcgU1ZHU2hhZG93VHJlZUNvbnRhaW5l
ckVsZW1lbnQoZG9jdW1lbnQpKTsKLX0KLQotdm9pZCBTVkdTaGFkb3dUcmVlQ29udGFpbmVyRWxl
bWVudDo6c2V0Q29udGFpbmVyT2Zmc2V0KGNvbnN0IFNWR0xlbmd0aCYgeCwgY29uc3QgU1ZHTGVu
Z3RoJiB5KQotewotICAgIG1fY29udGFpbmVyT2Zmc2V0Q2hhbmdlZCA9IHRydWU7Ci0gICAgbV94
T2Zmc2V0ID0geDsKLSAgICBtX3lPZmZzZXQgPSB5OwotfQotCi1GbG9hdFNpemUgU1ZHU2hhZG93
VHJlZUNvbnRhaW5lckVsZW1lbnQ6OmNvbnRhaW5lclRyYW5zbGF0aW9uKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gRmxvYXRTaXplKG1feE9mZnNldC52YWx1ZSh0aGlzKSwgbV95T2Zmc2V0LnZhbHVl
KHRoaXMpKTsKLX0KLQotUGFzc1JlZlB0cjxFbGVtZW50PiBTVkdTaGFkb3dUcmVlQ29udGFpbmVy
RWxlbWVudDo6Y2xvbmVFbGVtZW50V2l0aG91dEF0dHJpYnV0ZXNBbmRDaGlsZHJlbigpCi17Ci0g
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTVkdTaGFkb3dUcmVlQ29udGFpbmVyRWxlbWVudChkb2N1
bWVudCgpKSk7Ci19Ci0vLyBTVkdTaGFkb3dUcmVlUm9vdEVsZW1lbnQKLQotaW5saW5lIFNWR1No
YWRvd1RyZWVSb290RWxlbWVudDo6U1ZHU2hhZG93VHJlZVJvb3RFbGVtZW50KERvY3VtZW50KiBk
b2N1bWVudCwgU1ZHVXNlRWxlbWVudCogaG9zdCkKLSAgICA6IFNWR1NoYWRvd1RyZWVDb250YWlu
ZXJFbGVtZW50KGRvY3VtZW50KQotewotICAgIHNldFBhcmVudChob3N0KTsKLSAgICBzZXRJbkRv
Y3VtZW50KCk7Ci19Ci0KLVBhc3NSZWZQdHI8U1ZHU2hhZG93VHJlZVJvb3RFbGVtZW50PiBTVkdT
aGFkb3dUcmVlUm9vdEVsZW1lbnQ6OmNyZWF0ZShEb2N1bWVudCogZG9jdW1lbnQsIFNWR1VzZUVs
ZW1lbnQqIGhvc3QpCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTVkdTaGFkb3dUcmVlUm9v
dEVsZW1lbnQoZG9jdW1lbnQsIGhvc3QpKTsKLX0KLQotdm9pZCBTVkdTaGFkb3dUcmVlUm9vdEVs
ZW1lbnQ6OmF0dGFjaEVsZW1lbnQoUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGUsIFJlbmRl
ckFyZW5hKiBhcmVuYSkKLXsKLSAgICBBU1NFUlQoc3ZnU2hhZG93SG9zdCgpKTsKLQotICAgIC8v
IENyZWF0ZSB0aGUgcmVuZGVyZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHN0eWxlCi0gICAgUmVuZGVy
T2JqZWN0KiByZW5kZXJlciA9IGNyZWF0ZVJlbmRlcmVyKGFyZW5hLCBzdHlsZS5nZXQoKSk7Ci0g
ICAgaWYgKHJlbmRlcmVyKSB7Ci0gICAgICAgIHNldFJlbmRlcmVyKHJlbmRlcmVyKTsKLSAgICAg
ICAgcmVuZGVyZXItPnNldFN0eWxlKHN0eWxlKTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlc2Ug
ZXhwbGljaXRseSBzaW5jZSB0aGlzIG5vcm1hbGx5IGhhcHBlbnMgZHVyaW5nIGFuIGF0dGFjaCgp
Ci0gICAgc2V0QXR0YWNoZWQoKTsKLQotICAgIC8vIEFkZCB0aGUgcmVuZGVyZXIgdG8gdGhlIHJl
bmRlciB0cmVlCi0gICAgaWYgKHJlbmRlcmVyKQotICAgICAgICBzdmdTaGFkb3dIb3N0KCktPnJl
bmRlcmVyKCktPmFkZENoaWxkKHJlbmRlcmVyKTsKLX0KLQotdm9pZCBTVkdTaGFkb3dUcmVlUm9v
dEVsZW1lbnQ6OmNsZWFyU1ZHU2hhZG93SG9zdCgpCi17Ci0gICAgc2V0UGFyZW50KDApOwotfQot
Ci1QYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTVkdTaGFkb3dUcmVlQ29udGFpbmVyRWxlbWVudDo6
Y3VzdG9tU3R5bGVGb3JSZW5kZXJlcigpCi17Ci0gICAgcmV0dXJuIGRvY3VtZW50KCktPnN0eWxl
U2VsZWN0b3IoKS0+c3R5bGVGb3JFbGVtZW50KHRoaXMsIDAsIHRydWUvKmFsbG93U2hhcmluZyov
KTsKLX0KLQotfQotCi0jZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcv
U1ZHU2hhZG93VHJlZUVsZW1lbnRzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL3N2Zy9TVkdTaGFkb3dUcmVlRWxlbWVudHMuaAkocmV2aXNpb24gOTY1NzUpCisrKyBT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1NWR1NoYWRvd1RyZWVFbGVtZW50cy5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNo
IEluIE1vdGlvbiBMaW1pdGVkIDIwMTAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAq
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpZm5kZWYgU1ZH
U2hhZG93VHJlZUVsZW1lbnRzX2gKLSNkZWZpbmUgU1ZHU2hhZG93VHJlZUVsZW1lbnRzX2gKLQot
I2lmIEVOQUJMRShTVkcpCi0jaW5jbHVkZSAiU1ZHR0VsZW1lbnQuaCIKLSNpbmNsdWRlICJTVkdM
ZW5ndGguaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1jbGFzcyBGbG9hdFNpemU7Ci1jbGFz
cyBTVkdVc2VFbGVtZW50OwotCi1jbGFzcyBTVkdTaGFkb3dUcmVlQ29udGFpbmVyRWxlbWVudCA6
IHB1YmxpYyBTVkdHRWxlbWVudCB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8U1ZH
U2hhZG93VHJlZUNvbnRhaW5lckVsZW1lbnQ+IGNyZWF0ZShEb2N1bWVudCopOwotCi0gICAgRmxv
YXRTaXplIGNvbnRhaW5lclRyYW5zbGF0aW9uKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRDb250YWlu
ZXJPZmZzZXQoY29uc3QgU1ZHTGVuZ3RoJiB4LCBjb25zdCBTVkdMZW5ndGgmIHkpOwotCi0gICAg
Ym9vbCBjb250YWluZXJPZmZzZXRDaGFuZ2VkKCkgY29uc3QgeyByZXR1cm4gbV9jb250YWluZXJP
ZmZzZXRDaGFuZ2VkOyB9Ci0gICAgdm9pZCBzZXRDb250YWluZXJPZmZzZXRDaGFuZ2VkKGJvb2wg
Y29udGFpbmVyT2Zmc2V0Q2hhbmdlZCkgeyBtX2NvbnRhaW5lck9mZnNldENoYW5nZWQgPSBjb250
YWluZXJPZmZzZXRDaGFuZ2VkOyB9Ci0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8UmVuZGVyU3R5
bGU+IGN1c3RvbVN0eWxlRm9yUmVuZGVyZXIoKTsKLQotcHJvdGVjdGVkOgotICAgIFNWR1NoYWRv
d1RyZWVDb250YWluZXJFbGVtZW50KERvY3VtZW50Kik7Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVh
bCBQYXNzUmVmUHRyPEVsZW1lbnQ+IGNsb25lRWxlbWVudFdpdGhvdXRBdHRyaWJ1dGVzQW5kQ2hp
bGRyZW4oKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNTaGFkb3dUcmVlQ29udGFpbmVyRWxlbWVudCgp
IGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIFNWR0xlbmd0aCBtX3hPZmZzZXQ7Ci0gICAg
U1ZHTGVuZ3RoIG1feU9mZnNldDsKLSAgICBib29sIG1fY29udGFpbmVyT2Zmc2V0Q2hhbmdlZDsK
LX07Ci0KLWNsYXNzIFNWR1NoYWRvd1RyZWVSb290RWxlbWVudCA6IHB1YmxpYyBTVkdTaGFkb3dU
cmVlQ29udGFpbmVyRWxlbWVudCB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8U1ZH
U2hhZG93VHJlZVJvb3RFbGVtZW50PiBjcmVhdGUoRG9jdW1lbnQqLCBTVkdVc2VFbGVtZW50KiBo
b3N0KTsKLQotICAgIHZvaWQgYXR0YWNoRWxlbWVudChQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiwg
UmVuZGVyQXJlbmEqKTsKLSAgICB2b2lkIGNsZWFyU1ZHU2hhZG93SG9zdCgpOwotCi0gICAgdmly
dHVhbCBib29sIGlzU1ZHU2hhZG93Um9vdCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotcHJp
dmF0ZToKLSAgICBTVkdTaGFkb3dUcmVlUm9vdEVsZW1lbnQoRG9jdW1lbnQqLCBTVkdVc2VFbGVt
ZW50KiBob3N0KTsKLX07Ci0KLX0KLQotI2VuZGlmCi0jZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3N2Zy9TVkdBbmltYXRlTW90aW9uRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvc3ZnL1NWR0FuaW1hdGVNb3Rpb25FbGVtZW50LmNwcAkocmV2aXNpb24gOTY1NzUp
CisrKyBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHQW5pbWF0ZU1vdGlvbkVsZW1lbnQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yMzcsMjggKzIzNywxMCBAQCB2b2lkIFNWR0FuaW1hdGVNb3Rpb25FbGVt
ZW50OjphcHBseVJlc3VsCiAgICAgaWYgKCF0YXJnZXRFbGVtZW50KQogICAgICAgICByZXR1cm47
CiAKKyAgICBTVkdFbGVtZW50SW5zdGFuY2U6OkludmFsaWRhdGlvbkd1YXJkIGludmFsaWRhdGlv
bkd1YXJkKHRhcmdldEVsZW1lbnQpOworCiAgICAgaWYgKFJlbmRlck9iamVjdCogcmVuZGVyZXIg
PSB0YXJnZXRFbGVtZW50LT5yZW5kZXJlcigpKQogICAgICAgICBSZW5kZXJTVkdSZXNvdXJjZTo6
bWFya0ZvckxheW91dEFuZFBhcmVudFJlc291cmNlSW52YWxpZGF0aW9uKHJlbmRlcmVyKTsKLQot
ICAgIEFmZmluZVRyYW5zZm9ybSogdCA9IHRhcmdldEVsZW1lbnQtPnN1cHBsZW1lbnRhbFRyYW5z
Zm9ybSgpOwotICAgIGlmICghdCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gLi4uZXhjZXB0
IGluIGNhc2Ugd2hlcmUgd2UgaGF2ZSBhZGRpdGlvbmFsIGluc3RhbmNlcyBpbiA8dXNlPiB0cmVl
cy4KLSAgICBjb25zdCBIYXNoU2V0PFNWR0VsZW1lbnRJbnN0YW5jZSo+JiBpbnN0YW5jZXMgPSB0
YXJnZXRFbGVtZW50LT5pbnN0YW5jZXNGb3JFbGVtZW50KCk7Ci0gICAgY29uc3QgSGFzaFNldDxT
VkdFbGVtZW50SW5zdGFuY2UqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gaW5zdGFuY2VzLmVuZCgp
OwotICAgIGZvciAoSGFzaFNldDxTVkdFbGVtZW50SW5zdGFuY2UqPjo6Y29uc3RfaXRlcmF0b3Ig
aXQgPSBpbnN0YW5jZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIFNWR0Vs
ZW1lbnQqIHNoYWRvd1RyZWVFbGVtZW50ID0gKCppdCktPnNoYWRvd1RyZWVFbGVtZW50KCk7Ci0g
ICAgICAgIEFTU0VSVChzaGFkb3dUcmVlRWxlbWVudCk7Ci0gICAgICAgIEFmZmluZVRyYW5zZm9y
bSogdHJhbnNmb3JtID0gc2hhZG93VHJlZUVsZW1lbnQtPnN1cHBsZW1lbnRhbFRyYW5zZm9ybSgp
OwotICAgICAgICBpZiAoIXRyYW5zZm9ybSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICB0cmFuc2Zvcm0tPnNldE1hdHJpeCh0LT5hKCksIHQtPmIoKSwgdC0+YygpLCB0LT5kKCksIHQt
PmUoKSwgdC0+ZigpKTsKLSAgICAgICAgaWYgKFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBzaGFk
b3dUcmVlRWxlbWVudC0+cmVuZGVyZXIoKSkgewotICAgICAgICAgICAgcmVuZGVyZXItPnNldE5l
ZWRzVHJhbnNmb3JtVXBkYXRlKCk7Ci0gICAgICAgICAgICBSZW5kZXJTVkdSZXNvdXJjZTo6bWFy
a0ZvckxheW91dEFuZFBhcmVudFJlc291cmNlSW52YWxpZGF0aW9uKHJlbmRlcmVyKTsKLSAgICAg
ICAgfQotICAgIH0KIH0KIAogZmxvYXQgU1ZHQW5pbWF0ZU1vdGlvbkVsZW1lbnQ6OmNhbGN1bGF0
ZURpc3RhbmNlKGNvbnN0IFN0cmluZyYgZnJvbVN0cmluZywgY29uc3QgU3RyaW5nJiB0b1N0cmlu
ZykKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvc3ZnL1NWR0FuaW1hdGVUcmFuc2Zvcm1F
bGVtZW50LmNwcAkocmV2aXNpb24gOTY1NzUpCisrKyBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHQW5p
bWF0ZVRyYW5zZm9ybUVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTcsNyArMTE3LDcg
QEAgdm9pZCBTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudDo6cGFyc2VNYQogICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOwogfQogCi1zdGF0aWMgUGFzc1JlZlB0cjxTVkdBbmltYXRlZFRyYW5zZm9y
bUxpc3Q+IGFuaW1hdGVkVHJhbnNmb3JtTGlzdEZvcihTVkdFbGVtZW50KiBlbGVtZW50KQorc3Rh
dGljIFBhc3NSZWZQdHI8U1ZHQW5pbWF0ZWRUcmFuc2Zvcm1MaXN0PiBhbmltYXRlZFRyYW5zZm9y
bUxpc3RGb3JUYXJnZXRFbGVtZW50KFNWR0VsZW1lbnQqIGVsZW1lbnQpCiB7CiAgICAgQVNTRVJU
KGVsZW1lbnQpOwogICAgIGlmIChlbGVtZW50LT5pc1N0eWxlZFRyYW5zZm9ybWFibGUoKSkKQEAg
LTEzMCwyNSArMTMwLDI1IEBAIHN0YXRpYyBQYXNzUmVmUHRyPFNWR0FuaW1hdGVkVHJhbnNmb3Jt
TGkKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFNWR1BhdHRlcm5FbGVtZW50Kj4oZWxlbWVu
dCktPnBhdHRlcm5UcmFuc2Zvcm1BbmltYXRlZCgpOwogICAgIHJldHVybiAwOwogfQotICAgIAor
CitzdGF0aWMgaW5saW5lIGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJpYnV0ZU5hbWVGb3JUYXJn
ZXRFbGVtZW50KFNWR0VsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgQVNTRVJUKGVsZW1lbnQpOwor
ICAgIGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKFNWR05hbWVzOjpsaW5lYXJHcmFkaWVudFRhZykg
fHwgZWxlbWVudC0+aGFzVGFnTmFtZShTVkdOYW1lczo6cmFkaWFsR3JhZGllbnRUYWcpKQorICAg
ICAgICByZXR1cm4gU1ZHTmFtZXM6OmdyYWRpZW50VHJhbnNmb3JtQXR0cjsKKyAgICBpZiAoZWxl
bWVudC0+aGFzVGFnTmFtZShTVkdOYW1lczo6cGF0dGVyblRhZykpCisgICAgICAgIHJldHVybiBT
VkdOYW1lczo6cGF0dGVyblRyYW5zZm9ybUF0dHI7CisgICAgcmV0dXJuIFNWR05hbWVzOjp0cmFu
c2Zvcm1BdHRyOworfQorCiB2b2lkIFNWR0FuaW1hdGVUcmFuc2Zvcm1FbGVtZW50OjpyZXNldFRv
QmFzZVZhbHVlKGNvbnN0IFN0cmluZyYgYmFzZVZhbHVlKQogewogICAgIFNWR0VsZW1lbnQqIHRh
cmdldEVsZW1lbnQgPSB0aGlzLT50YXJnZXRFbGVtZW50KCk7CiAgICAgaWYgKCF0YXJnZXRFbGVt
ZW50IHx8IGRldGVybWluZUFuaW1hdGVkUHJvcGVydHlUeXBlKHRhcmdldEVsZW1lbnQpID09IEFu
aW1hdGVkVW5rbm93bikKICAgICAgICAgcmV0dXJuOwogCi0gICAgLy8gRklYTUU6IFRoaXMgbWln
aHQgbm90IGJlIGNvcnJlY3QgZm9yIGFjY3VtdWxhdGVkIHN1bS4gTmVlZHMgY2hlY2tpbmcuCi0g
ICAgaWYgKHRhcmdldEVsZW1lbnQtPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OmxpbmVhckdyYWRpZW50
VGFnKSB8fCB0YXJnZXRFbGVtZW50LT5oYXNUYWdOYW1lKFNWR05hbWVzOjpyYWRpYWxHcmFkaWVu
dFRhZykpIHsKLSAgICAgICAgdGFyZ2V0RWxlbWVudC0+c2V0QXR0cmlidXRlKFNWR05hbWVzOjpn
cmFkaWVudFRyYW5zZm9ybUF0dHIsIGJhc2VWYWx1ZS5pc0VtcHR5KCkgPyAibWF0cml4KDEgMCAw
IDEgMCAwKSIgOiBiYXNlVmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0
YXJnZXRFbGVtZW50LT5oYXNUYWdOYW1lKFNWR05hbWVzOjpwYXR0ZXJuVGFnKSkgewotICAgICAg
ICB0YXJnZXRFbGVtZW50LT5zZXRBdHRyaWJ1dGUoU1ZHTmFtZXM6OnBhdHRlcm5UcmFuc2Zvcm1B
dHRyLCBiYXNlVmFsdWUuaXNFbXB0eSgpID8gIm1hdHJpeCgxIDAgMCAxIDAgMCkiIDogYmFzZVZh
bHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKICAgICBpZiAoYmFzZVZhbHVlLmlz
RW1wdHkoKSkgewotICAgICAgICBpZiAoUmVmUHRyPFNWR0FuaW1hdGVkVHJhbnNmb3JtTGlzdD4g
bGlzdCA9IGFuaW1hdGVkVHJhbnNmb3JtTGlzdEZvcih0YXJnZXRFbGVtZW50KSkgeworICAgICAg
ICBpZiAoUmVmUHRyPFNWR0FuaW1hdGVkVHJhbnNmb3JtTGlzdD4gbGlzdCA9IGFuaW1hdGVkVHJh
bnNmb3JtTGlzdEZvclRhcmdldEVsZW1lbnQodGFyZ2V0RWxlbWVudCkpIHsKICAgICAgICAgICAg
IGxpc3QtPmRldGFjaExpc3RXcmFwcGVycygwKTsKICAgICAgICAgICAgIGxpc3QtPnZhbHVlcygp
LmNsZWFyKCk7CiAgICAgICAgIH0KQEAgLTE2MSw3ICsxNjEsNyBAQCB2b2lkIFNWR0FuaW1hdGVU
cmFuc2Zvcm1FbGVtZW50OjpjYWxjdWxhCiAgICAgU1ZHRWxlbWVudCogdGFyZ2V0RWxlbWVudCA9
IHRoaXMtPnRhcmdldEVsZW1lbnQoKTsKICAgICBpZiAoIXRhcmdldEVsZW1lbnQgfHwgZGV0ZXJt
aW5lQW5pbWF0ZWRQcm9wZXJ0eVR5cGUodGFyZ2V0RWxlbWVudCkgPT0gQW5pbWF0ZWRVbmtub3du
KQogICAgICAgICByZXR1cm47Ci0gICAgUmVmUHRyPFNWR0FuaW1hdGVkVHJhbnNmb3JtTGlzdD4g
YW5pbWF0ZWRMaXN0ID0gYW5pbWF0ZWRUcmFuc2Zvcm1MaXN0Rm9yKHRhcmdldEVsZW1lbnQpOwor
ICAgIFJlZlB0cjxTVkdBbmltYXRlZFRyYW5zZm9ybUxpc3Q+IGFuaW1hdGVkTGlzdCA9IGFuaW1h
dGVkVHJhbnNmb3JtTGlzdEZvclRhcmdldEVsZW1lbnQodGFyZ2V0RWxlbWVudCk7CiAgICAgQVNT
RVJUKGFuaW1hdGVkTGlzdCk7CiAgICAgCiAgICAgaWYgKGNhbGNNb2RlKCkgPT0gQ2FsY01vZGVE
aXNjcmV0ZSkKQEAgLTIxNCwzNiArMjE0LDggQEAgdm9pZCBTVkdBbmltYXRlVHJhbnNmb3JtRWxl
bWVudDo6YXBwbHlSZQogICAgIGlmICghdGFyZ2V0RWxlbWVudCB8fCBkZXRlcm1pbmVBbmltYXRl
ZFByb3BlcnR5VHlwZSh0YXJnZXRFbGVtZW50KSA9PSBBbmltYXRlZFVua25vd24pCiAgICAgICAg
IHJldHVybjsKIAotICAgIC8vIFdlIGFjY3VtdWxhdGUgdG8gdGhlIHRhcmdldCBlbGVtZW50IHRy
YW5zZm9ybSBsaXN0IHNvIHRoZXJlIGlzIG5vdCBtdWNoIHRvIGRvIGhlcmUuCi0gICAgaWYgKFJl
bmRlck9iamVjdCogcmVuZGVyZXIgPSB0YXJnZXRFbGVtZW50LT5yZW5kZXJlcigpKSB7Ci0gICAg
ICAgIHJlbmRlcmVyLT5zZXROZWVkc1RyYW5zZm9ybVVwZGF0ZSgpOwotICAgICAgICBSZW5kZXJT
VkdSZXNvdXJjZTo6bWFya0ZvckxheW91dEFuZFBhcmVudFJlc291cmNlSW52YWxpZGF0aW9uKHJl
bmRlcmVyKTsKLSAgICB9Ci0KLSAgICAvLyAuLi5leGNlcHQgaW4gY2FzZSB3aGVyZSB3ZSBoYXZl
IGFkZGl0aW9uYWwgaW5zdGFuY2VzIGluIDx1c2U+IHRyZWVzLgotICAgIFJlZlB0cjxTVkdBbmlt
YXRlZFRyYW5zZm9ybUxpc3Q+IGFuaW1hdGVkTGlzdCA9IGFuaW1hdGVkVHJhbnNmb3JtTGlzdEZv
cih0YXJnZXRFbGVtZW50KTsKLSAgICBpZiAoIWFuaW1hdGVkTGlzdCkKLSAgICAgICAgcmV0dXJu
OwotICAgIFNWR1RyYW5zZm9ybUxpc3QqIHRyYW5zZm9ybUxpc3QgPSAmYW5pbWF0ZWRMaXN0LT52
YWx1ZXMoKTsKLQotICAgIGNvbnN0IEhhc2hTZXQ8U1ZHRWxlbWVudEluc3RhbmNlKj4mIGluc3Rh
bmNlcyA9IHRhcmdldEVsZW1lbnQtPmluc3RhbmNlc0ZvckVsZW1lbnQoKTsKLSAgICBjb25zdCBI
YXNoU2V0PFNWR0VsZW1lbnRJbnN0YW5jZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBpbnN0YW5j
ZXMuZW5kKCk7Ci0gICAgZm9yIChIYXNoU2V0PFNWR0VsZW1lbnRJbnN0YW5jZSo+Ojpjb25zdF9p
dGVyYXRvciBpdCA9IGluc3RhbmNlcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAg
ICAgU1ZHRWxlbWVudCogc2hhZG93VHJlZUVsZW1lbnQgPSAoKml0KS0+c2hhZG93VHJlZUVsZW1l
bnQoKTsKLSAgICAgICAgQVNTRVJUKHNoYWRvd1RyZWVFbGVtZW50KTsKLSAgICAgICAgaWYgKHNo
YWRvd1RyZWVFbGVtZW50LT5pc1N0eWxlZFRyYW5zZm9ybWFibGUoKSkKLSAgICAgICAgICAgIHN0
YXRpY19jYXN0PFNWR1N0eWxlZFRyYW5zZm9ybWFibGVFbGVtZW50Kj4oc2hhZG93VHJlZUVsZW1l
bnQpLT5zZXRUcmFuc2Zvcm1CYXNlVmFsdWUoKnRyYW5zZm9ybUxpc3QpOwotICAgICAgICBlbHNl
IGlmIChzaGFkb3dUcmVlRWxlbWVudC0+aGFzVGFnTmFtZShTVkdOYW1lczo6dGV4dFRhZykpCi0g
ICAgICAgICAgICBzdGF0aWNfY2FzdDxTVkdUZXh0RWxlbWVudCo+KHNoYWRvd1RyZWVFbGVtZW50
KS0+c2V0VHJhbnNmb3JtQmFzZVZhbHVlKCp0cmFuc2Zvcm1MaXN0KTsKLSAgICAgICAgZWxzZSBp
ZiAoc2hhZG93VHJlZUVsZW1lbnQtPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OmxpbmVhckdyYWRpZW50
VGFnKSB8fCBzaGFkb3dUcmVlRWxlbWVudC0+aGFzVGFnTmFtZShTVkdOYW1lczo6cmFkaWFsR3Jh
ZGllbnRUYWcpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U1ZHR3JhZGllbnRFbGVtZW50Kj4o
c2hhZG93VHJlZUVsZW1lbnQpLT5zZXRHcmFkaWVudFRyYW5zZm9ybUJhc2VWYWx1ZSgqdHJhbnNm
b3JtTGlzdCk7Ci0gICAgICAgIGVsc2UgaWYgKHNoYWRvd1RyZWVFbGVtZW50LT5oYXNUYWdOYW1l
KFNWR05hbWVzOjpwYXR0ZXJuVGFnKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFNWR1BhdHRl
cm5FbGVtZW50Kj4oc2hhZG93VHJlZUVsZW1lbnQpLT5zZXRQYXR0ZXJuVHJhbnNmb3JtQmFzZVZh
bHVlKCp0cmFuc2Zvcm1MaXN0KTsKLSAgICAgICAgaWYgKFJlbmRlck9iamVjdCogcmVuZGVyZXIg
PSBzaGFkb3dUcmVlRWxlbWVudC0+cmVuZGVyZXIoKSkgewotICAgICAgICAgICAgcmVuZGVyZXIt
PnNldE5lZWRzVHJhbnNmb3JtVXBkYXRlKCk7Ci0gICAgICAgICAgICBSZW5kZXJTVkdSZXNvdXJj
ZTo6bWFya0ZvckxheW91dEFuZFBhcmVudFJlc291cmNlSW52YWxpZGF0aW9uKHJlbmRlcmVyKTsK
LSAgICAgICAgfQotICAgIH0KKyAgICBTVkdFbGVtZW50SW5zdGFuY2U6OkludmFsaWRhdGlvbkd1
YXJkIGludmFsaWRhdGlvbkd1YXJkKHRhcmdldEVsZW1lbnQpOworICAgIHRhcmdldEVsZW1lbnQt
PnN2Z0F0dHJpYnV0ZUNoYW5nZWQoYXR0cmlidXRlTmFtZUZvclRhcmdldEVsZW1lbnQodGFyZ2V0
RWxlbWVudCkpOwogfQogICAgIAogZmxvYXQgU1ZHQW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQ6OmNh
bGN1bGF0ZURpc3RhbmNlKGNvbnN0IFN0cmluZyYgZnJvbVN0cmluZywgY29uc3QgU3RyaW5nJiB0
b1N0cmluZykKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdBbmltYXRpb25FbGVtZW50LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHQW5pbWF0aW9uRWxlbWVudC5j
cHAJKHJldmlzaW9uIDk2NTc1KQorKysgU291cmNlL1dlYkNvcmUvc3ZnL1NWR0FuaW1hdGlvbkVs
ZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NCw3ICs0NCw2IEBACiAjaW5jbHVkZSAiU1ZH
UGFyc2VyVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAiU1ZHU3R5bGVkRWxlbWVudC5oIgogI2luY2x1
ZGUgIlNWR1VSSVJlZmVyZW5jZS5oIgotI2luY2x1ZGUgIlNWR1VzZUVsZW1lbnQuaCIKICNpbmNs
dWRlICJYTGlua05hbWVzLmgiCiAjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgogCkBAIC0z
MzksMTUgKzMzOCwxMyBAQCB2b2lkIFNWR0FuaW1hdGlvbkVsZW1lbnQ6OnNldFRhcmdldEF0dHJp
CiAgICAgaWYgKCF0YXJnZXRFbGVtZW50IHx8IGF0dHJpYnV0ZU5hbWUgPT0gYW55UU5hbWUoKSB8
fCB2YWx1ZS5pc051bGwoKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgLy8gV2UgZG9uJ3Qgd2Fu
dCB0aGUgaW5zdGFuY2UgdHJlZSB0byBnZXQgcmVidWlsZC4gSW5zdGFuY2VzIGFyZSB1cGRhdGVk
IGluIHRoZSBsb29wIGJlbG93LgotICAgIGlmICh0YXJnZXRFbGVtZW50LT5pc1N0eWxlZCgpKQot
ICAgICAgICBzdGF0aWNfY2FzdDxTVkdTdHlsZWRFbGVtZW50Kj4odGFyZ2V0RWxlbWVudCktPnNl
dEluc3RhbmNlVXBkYXRlc0Jsb2NrZWQodHJ1ZSk7Ci0gICAgICAgIAogICAgIGJvb2wgYXR0cmli
dXRlSXNDU1NQcm9wZXJ0eSA9IGlzVGFyZ2V0QXR0cmlidXRlQ1NTUHJvcGVydHkodGFyZ2V0RWxl
bWVudCwgYXR0cmlidXRlTmFtZSk7CiAgICAgLy8gU3RvcCBhbmltYXRpb24sIGlmIGF0dHJpYnV0
ZVR5cGUgaXMgc2V0IHRvIENTUyBieSB0aGUgdXNlciwgYnV0IHRoZSBhdHRyaWJ1dGUgaXRzZWxm
IGlzIG5vdCBhIENTUyBwcm9wZXJ0eS4KICAgICBpZiAoIWF0dHJpYnV0ZUlzQ1NTUHJvcGVydHkg
JiYgYXR0cmlidXRlVHlwZSgpID09IEF0dHJpYnV0ZVR5cGVDU1MpCiAgICAgICAgIHJldHVybjsK
IAorICAgIFNWR0VsZW1lbnRJbnN0YW5jZTo6SW52YWxpZGF0aW9uR3VhcmQgaW52YWxpZGF0aW9u
R3VhcmQodGFyZ2V0RWxlbWVudCk7CisKICAgICBFeGNlcHRpb25Db2RlIGVjOwogICAgIGlmIChh
dHRyaWJ1dGVJc0NTU1Byb3BlcnR5KSB7CiAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBz
ZXQgdGhlIG92ZXJyaWRlIHN0eWxlLCBub3QgdGhlIGlubGluZSBzdHlsZS4KQEAgLTM1OCwyMyAr
MzU1LDYgQEAgdm9pZCBTVkdBbmltYXRpb25FbGVtZW50OjpzZXRUYXJnZXRBdHRyaQogICAgICAg
ICAvLyBhdHRyaWJ1dGUgdmFsdWUuIFdoYXRldmVyIHRoYXQgbWVhbnMgaW4gcHJhY3RpY2UuCiAg
ICAgICAgIHRhcmdldEVsZW1lbnQtPnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSwg
ZWMpOwogICAgIH0KLSAgICAKLSAgICBpZiAodGFyZ2V0RWxlbWVudC0+aXNTdHlsZWQoKSkKLSAg
ICAgICAgc3RhdGljX2Nhc3Q8U1ZHU3R5bGVkRWxlbWVudCo+KHRhcmdldEVsZW1lbnQpLT5zZXRJ
bnN0YW5jZVVwZGF0ZXNCbG9ja2VkKGZhbHNlKTsKLSAgICAKLSAgICAvLyBJZiB0aGUgdGFyZ2V0
IGVsZW1lbnQgaXMgdXNlZCBpbiBhbiA8dXNlPiBpbnN0YW5jZSB0cmVlLCB1cGRhdGUgdGhhdCBh
cyB3ZWxsLgotICAgIGNvbnN0IEhhc2hTZXQ8U1ZHRWxlbWVudEluc3RhbmNlKj4mIGluc3RhbmNl
cyA9IHRhcmdldEVsZW1lbnQtPmluc3RhbmNlc0ZvckVsZW1lbnQoKTsKLSAgICBjb25zdCBIYXNo
U2V0PFNWR0VsZW1lbnRJbnN0YW5jZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBpbnN0YW5jZXMu
ZW5kKCk7Ci0gICAgZm9yIChIYXNoU2V0PFNWR0VsZW1lbnRJbnN0YW5jZSo+Ojpjb25zdF9pdGVy
YXRvciBpdCA9IGluc3RhbmNlcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAg
U1ZHRWxlbWVudCogc2hhZG93VHJlZUVsZW1lbnQgPSAoKml0KS0+c2hhZG93VHJlZUVsZW1lbnQo
KTsKLSAgICAgICAgaWYgKCFzaGFkb3dUcmVlRWxlbWVudCkKLSAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICBpZiAoYXR0cmlidXRlSXNDU1NQcm9wZXJ0eSkKLSAgICAgICAgICAgIHNoYWRv
d1RyZWVFbGVtZW50LT5zdHlsZSgpLT5zZXRQcm9wZXJ0eShhdHRyaWJ1dGVOYW1lLmxvY2FsTmFt
ZSgpLCB2YWx1ZSwgIiIsIGVjKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2hhZG93VHJl
ZUVsZW1lbnQtPnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSwgZWMpOwotICAgICAg
ICAoKml0KS0+Y29ycmVzcG9uZGluZ1VzZUVsZW1lbnQoKS0+c2V0TmVlZHNTdHlsZVJlY2FsYygp
OwotICAgIH0KIH0KICAgICAKIHZvaWQgU1ZHQW5pbWF0aW9uRWxlbWVudDo6Y2FsY3VsYXRlS2V5
VGltZXNGb3JDYWxjTW9kZVBhY2VkKCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdFbGVt
ZW50SW5zdGFuY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdFbGVt
ZW50SW5zdGFuY2UuY3BwCShyZXZpc2lvbiA5NjU3NSkKKysrIFNvdXJjZS9XZWJDb3JlL3N2Zy9T
VkdFbGVtZW50SW5zdGFuY2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiwxMCArMjYsMTMgQEAK
IAogI2luY2x1ZGUgIkNvbnRhaW5lck5vZGVBbGdvcml0aG1zLmgiCiAjaW5jbHVkZSAiRXZlbnQu
aCIKKyNpbmNsdWRlICJFdmVudERpc3BhdGNoZXIuaCIKKyNpbmNsdWRlICJFdmVudERpc3BhdGNo
TWVkaWF0b3IuaCIKICNpbmNsdWRlICJFdmVudEV4Y2VwdGlvbi5oIgogI2luY2x1ZGUgIkV2ZW50
TGlzdGVuZXIuaCIKICNpbmNsdWRlICJFdmVudE5hbWVzLmgiCiAjaW5jbHVkZSAiRnJhbWVWaWV3
LmgiCisjaW5jbHVkZSAiUmVuZGVyU1ZHRHVwbGljYXRlLmgiCiAjaW5jbHVkZSAiU1ZHRWxlbWVu
dEluc3RhbmNlTGlzdC5oIgogI2luY2x1ZGUgIlNWR1VzZUVsZW1lbnQuaCIKIApAQCAtODMsNDQg
Kzg2LDQxIEBAIFBhc3NSZWZQdHI8U1ZHRWxlbWVudEluc3RhbmNlTGlzdD4gU1ZHRWwKICAgICBy
ZXR1cm4gU1ZHRWxlbWVudEluc3RhbmNlTGlzdDo6Y3JlYXRlKHRoaXMpOwogfQogCi12b2lkIFNW
R0VsZW1lbnRJbnN0YW5jZTo6c2V0U2hhZG93VHJlZUVsZW1lbnQoU1ZHRWxlbWVudCogZWxlbWVu
dCkKLXsKLSAgICBBU1NFUlQoZWxlbWVudCk7Ci0gICAgbV9zaGFkb3dUcmVlRWxlbWVudCA9IGVs
ZW1lbnQ7Ci19Ci0KIHZvaWQgU1ZHRWxlbWVudEluc3RhbmNlOjphcHBlbmRDaGlsZChQYXNzUmVm
UHRyPFNWR0VsZW1lbnRJbnN0YW5jZT4gY2hpbGQpCiB7CiAgICAgYXBwZW5kQ2hpbGRUb0NvbnRh
aW5lcjxTVkdFbGVtZW50SW5zdGFuY2UsIFNWR0VsZW1lbnRJbnN0YW5jZT4oY2hpbGQuZ2V0KCks
IHRoaXMpOwogfQogCi12b2lkIFNWR0VsZW1lbnRJbnN0YW5jZTo6aW52YWxpZGF0ZUFsbEluc3Rh
bmNlc09mRWxlbWVudChTVkdFbGVtZW50KiBlbGVtZW50KQorc3RhdGljIGlubGluZSB2b2lkIHVz
ZVJlbmRlcmVyc0ZvckVsZW1lbnRJbnN0YW5jZXMoU1ZHRWxlbWVudCogZWxlbWVudCwgVmVjdG9y
PFJlbmRlclNWR0R1cGxpY2F0ZSo+JiB1c2VSZW5kZXJlcnMpCiB7CiAgICAgaWYgKCFlbGVtZW50
IHx8ICFlbGVtZW50LT5pbkRvY3VtZW50KCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIGlmIChl
bGVtZW50LT5pc1N0eWxlZCgpICYmIHN0YXRpY19jYXN0PFNWR1N0eWxlZEVsZW1lbnQqPihlbGVt
ZW50KS0+aW5zdGFuY2VVcGRhdGVzQmxvY2tlZCgpKQotICAgICAgICByZXR1cm47Ci0KICAgICBj
b25zdCBIYXNoU2V0PFNWR0VsZW1lbnRJbnN0YW5jZSo+JiBzZXQgPSBlbGVtZW50LT5pbnN0YW5j
ZXNGb3JFbGVtZW50KCk7CiAgICAgaWYgKHNldC5pc0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsK
IAotICAgIC8vIE1hcmsgYWxsIHVzZSBlbGVtZW50cyByZWZlcmVuY2luZyAnZWxlbWVudCcgZm9y
IHJlYnVpbGRpbmcKLSAgICBjb25zdCBIYXNoU2V0PFNWR0VsZW1lbnRJbnN0YW5jZSo+Ojpjb25z
dF9pdGVyYXRvciBlbmQgPSBzZXQuZW5kKCk7Ci0gICAgZm9yIChIYXNoU2V0PFNWR0VsZW1lbnRJ
bnN0YW5jZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsr
aXQpIHsKLSAgICAgICAgQVNTRVJUKCgqaXQpLT5zaGFkb3dUcmVlRWxlbWVudCgpKTsKLSAgICAg
ICAgQVNTRVJUKCgqaXQpLT5zaGFkb3dUcmVlRWxlbWVudCgpLT5jb3JyZXNwb25kaW5nRWxlbWVu
dCgpKTsKKyAgICBjb25zdCBIYXNoU2V0PFNWR0VsZW1lbnRJbnN0YW5jZSo+OjppdGVyYXRvciBl
bmQgPSBzZXQuZW5kKCk7CisgICAgZm9yIChIYXNoU2V0PFNWR0VsZW1lbnRJbnN0YW5jZSo+Ojpp
dGVyYXRvciBpdCA9IHNldC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKICAgICAgICAgQVNT
RVJUKCgqaXQpLT5jb3JyZXNwb25kaW5nRWxlbWVudCgpID09IGVsZW1lbnQpOwotICAgICAgICAo
Kml0KS0+c2hhZG93VHJlZUVsZW1lbnQoKS0+c2V0Q29ycmVzcG9uZGluZ0VsZW1lbnQoMCk7CiAg
ICAgICAgIGlmIChTVkdVc2VFbGVtZW50KiBlbGVtZW50ID0gKCppdCktPmNvcnJlc3BvbmRpbmdV
c2VFbGVtZW50KCkpIHsKICAgICAgICAgICAgIEFTU0VSVChlbGVtZW50LT5pbkRvY3VtZW50KCkp
OwotICAgICAgICAgICAgZWxlbWVudC0+aW52YWxpZGF0ZVNoYWRvd1RyZWUoKTsKKyAgICAgICAg
ICAgIGlmIChSZW5kZXJTVkdEdXBsaWNhdGUqIHJlbmRlcmVyID0gdG9SZW5kZXJTVkdEdXBsaWNh
dGUoZWxlbWVudC0+cmVuZGVyZXIoKSkpCisgICAgICAgICAgICAgICAgdXNlUmVuZGVyZXJzLmFw
cGVuZChyZW5kZXJlcik7CiAgICAgICAgIH0KICAgICB9Cit9CiAKLSAgICAvLyBCZSBzdXJlIHRv
IHJlYnVpbGQgdXNlIHRyZWVzLCBpZiBuZWVkZWQKLSAgICBlbGVtZW50LT5kb2N1bWVudCgpLT51
cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMoKTsKK3ZvaWQgU1ZHRWxlbWVudElu
c3RhbmNlOjppbnZhbGlkYXRlQWxsSW5zdGFuY2VzT2ZFbGVtZW50KFNWR0VsZW1lbnQqIGVsZW1l
bnQsIEluc3RhbmNlSW52YWxpZGF0aW9uTW9kZUZsYWdzIG1vZGVGbGFncykKK3sKKyAgICBWZWN0
b3I8UmVuZGVyU1ZHRHVwbGljYXRlKj4gdXNlUmVuZGVyZXJzOworICAgIHVzZVJlbmRlcmVyc0Zv
ckVsZW1lbnRJbnN0YW5jZXMoZWxlbWVudCwgdXNlUmVuZGVyZXJzKTsKKyAgICBpZiAodXNlUmVu
ZGVyZXJzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgVmVjdG9yPFJl
bmRlclNWR0R1cGxpY2F0ZSo+OjppdGVyYXRvciBlbmRSZW5kZXJlciA9IHVzZVJlbmRlcmVycy5l
bmQoKTsKKyAgICBmb3IgKFZlY3RvcjxSZW5kZXJTVkdEdXBsaWNhdGUqPjo6aXRlcmF0b3IgaXRS
ZW5kZXJlciA9IHVzZVJlbmRlcmVycy5iZWdpbigpOyBpdFJlbmRlcmVyICE9IGVuZFJlbmRlcmVy
OyArK2l0UmVuZGVyZXIpCisgICAgICAgICgqaXRSZW5kZXJlciktPnVwZGF0ZUZyb21FbGVtZW50
KG1vZGVGbGFncyk7CiB9CiAKIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIFNWR0VsZW1lbnRJbnN0
YW5jZTo6c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpIGNvbnN0CkBAIC0xNDUsMTEgKzE0NSw3IEBA
IHZvaWQgU1ZHRWxlbWVudEluc3RhbmNlOjpyZW1vdmVBbGxFdmVudEwKIAogYm9vbCBTVkdFbGVt
ZW50SW5zdGFuY2U6OmRpc3BhdGNoRXZlbnQoUGFzc1JlZlB0cjxFdmVudD4gZXZlbnQpCiB7Ci0g
ICAgU1ZHRWxlbWVudCogZWxlbWVudCA9IHNoYWRvd1RyZWVFbGVtZW50KCk7Ci0gICAgaWYgKCFl
bGVtZW50KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gZWxlbWVudC0+ZGlz
cGF0Y2hFdmVudChldmVudCk7CisgICAgcmV0dXJuIEV2ZW50RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hF
dmVudCh0aGlzLCBFdmVudERpc3BhdGNoTWVkaWF0b3I6OmNyZWF0ZShldmVudCkpOwogfQogCiBF
dmVudFRhcmdldERhdGEqIFNWR0VsZW1lbnRJbnN0YW5jZTo6ZXZlbnRUYXJnZXREYXRhKCkKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdFbGVtZW50SW5zdGFuY2UuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHRWxlbWVudEluc3RhbmNlLmgJKHJldmlzaW9uIDk2NTc1
KQorKysgU291cmNlL1dlYkNvcmUvc3ZnL1NWR0VsZW1lbnRJbnN0YW5jZS5oCSh3b3JraW5nIGNv
cHkpCkBAIC01OCw3ICs1OCw2IEBAIHB1YmxpYzoKICAgICBTVkdFbGVtZW50KiBjb3JyZXNwb25k
aW5nRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudC5nZXQoKTsgfQogICAgIFNWR1Vz
ZUVsZW1lbnQqIGNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9jb3Jy
ZXNwb25kaW5nVXNlRWxlbWVudDsgfQogICAgIFNWR1VzZUVsZW1lbnQqIGRpcmVjdFVzZUVsZW1l
bnQoKSBjb25zdCB7IHJldHVybiBtX2RpcmVjdFVzZUVsZW1lbnQ7IH0KLSAgICBTVkdFbGVtZW50
KiBzaGFkb3dUcmVlRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fc2hhZG93VHJlZUVsZW1lbnQu
Z2V0KCk7IH0KICAgICB2b2lkIGNsZWFyQ2hpbGRyZW4oKTsKICAgICB2b2lkIGNsZWFyVXNlRWxl
bWVudHMoKQogICAgIHsKQEAgLTg2LDcgKzg1LDE0IEBAIHB1YmxpYzoKICAgICAgICAgU1ZHRWxl
bWVudCogbV9lbGVtZW50OwogICAgIH07CiAKLSAgICBzdGF0aWMgdm9pZCBpbnZhbGlkYXRlQWxs
SW5zdGFuY2VzT2ZFbGVtZW50KFNWR0VsZW1lbnQqKTsKKyAgICBlbnVtIEluc3RhbmNlSW52YWxp
ZGF0aW9uTW9kZSB7CisgICAgICAgIExlYXZlSW5zdGFuY2VUcmVlID0gMSA8PCAwLAorICAgICAg
ICBSZWJ1aWxkSW5zdGFuY2VUcmVlID0gMSA8PCAxLAorICAgICAgICBSZXBhaW50VXNlUmVuZGVy
ZXIgPSAxIDw8IDIKKyAgICB9OworCisgICAgdHlwZWRlZiB1bnNpZ25lZCBJbnN0YW5jZUludmFs
aWRhdGlvbk1vZGVGbGFnczsKKyAgICBzdGF0aWMgdm9pZCBpbnZhbGlkYXRlQWxsSW5zdGFuY2Vz
T2ZFbGVtZW50KFNWR0VsZW1lbnQqLCBJbnN0YW5jZUludmFsaWRhdGlvbk1vZGVGbGFncyBtb2Rl
RmxhZ3MgPSBMZWF2ZUluc3RhbmNlVHJlZSk7CiAKICAgICB1c2luZyBUcmVlU2hhcmVkPFNWR0Vs
ZW1lbnRJbnN0YW5jZT46OnJlZjsKICAgICB1c2luZyBUcmVlU2hhcmVkPFNWR0VsZW1lbnRJbnN0
YW5jZT46OmRlcmVmOwpAQCAtMTMzLDE2ICsxMzksMTYgQEAgcHVibGljOgogICAgIERFRklORV9G
T1JXQVJESU5HX0FUVFJJQlVURV9FVkVOVF9MSVNURU5FUihjb3JyZXNwb25kaW5nRWxlbWVudCgp
LCBzdWJtaXQpOwogICAgIERFRklORV9GT1JXQVJESU5HX0FUVFJJQlVURV9FVkVOVF9MSVNURU5F
Uihjb3JyZXNwb25kaW5nRWxlbWVudCgpLCB1bmxvYWQpOwogCisgICAgdmlydHVhbCBOb2RlKiB0
b05vZGUoKSB7IHJldHVybiBjb3JyZXNwb25kaW5nRWxlbWVudCgpOyB9CisKIHByaXZhdGU6CiAg
ICAgZnJpZW5kIGNsYXNzIFNWR1VzZUVsZW1lbnQ7CiAKICAgICBTVkdFbGVtZW50SW5zdGFuY2Uo
U1ZHVXNlRWxlbWVudCosIFNWR1VzZUVsZW1lbnQqLCBQYXNzUmVmUHRyPFNWR0VsZW1lbnQ+IG9y
aWdpbmFsRWxlbWVudCk7CiAKLSAgICB2aXJ0dWFsIE5vZGUqIHRvTm9kZSgpIHsgcmV0dXJuIHNo
YWRvd1RyZWVFbGVtZW50KCk7IH0KICAgICB2aXJ0dWFsIFNWR0VsZW1lbnRJbnN0YW5jZSogdG9T
VkdFbGVtZW50SW5zdGFuY2UoKSB7IHJldHVybiB0aGlzOyB9CiAKICAgICB2b2lkIGFwcGVuZENo
aWxkKFBhc3NSZWZQdHI8U1ZHRWxlbWVudEluc3RhbmNlPiBjaGlsZCk7Ci0gICAgdm9pZCBzZXRT
aGFkb3dUcmVlRWxlbWVudChTVkdFbGVtZW50Kik7CiAKICAgICB0ZW1wbGF0ZTxjbGFzcyBHZW5l
cmljTm9kZSwgY2xhc3MgR2VuZXJpY05vZGVDb250YWluZXI+CiAgICAgZnJpZW5kIHZvaWQgYXBw
ZW5kQ2hpbGRUb0NvbnRhaW5lcihHZW5lcmljTm9kZSogY2hpbGQsIEdlbmVyaWNOb2RlQ29udGFp
bmVyKiBjb250YWluZXIpOwpAQCAtMTY5LDcgKzE3NSw2IEBAIHByaXZhdGU6CiAgICAgU1ZHVXNl
RWxlbWVudCogbV9jb3JyZXNwb25kaW5nVXNlRWxlbWVudDsKICAgICBTVkdVc2VFbGVtZW50KiBt
X2RpcmVjdFVzZUVsZW1lbnQ7CiAgICAgUmVmUHRyPFNWR0VsZW1lbnQ+IG1fZWxlbWVudDsKLSAg
ICBSZWZQdHI8U1ZHRWxlbWVudD4gbV9zaGFkb3dUcmVlRWxlbWVudDsKIAogICAgIFNWR0VsZW1l
bnRJbnN0YW5jZSogbV9wcmV2aW91c1NpYmxpbmc7CiAgICAgU1ZHRWxlbWVudEluc3RhbmNlKiBt
X25leHRTaWJsaW5nOwpJbmRleDogU291cmNlL1dlYkNvcmUvc3ZnL1NWR0VsZW1lbnRSYXJlRGF0
YS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdFbGVtZW50UmFyZURhdGEu
aAkocmV2aXNpb24gOTY1NzUpCisrKyBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHRWxlbWVudFJhcmVE
YXRhLmgJKHdvcmtpbmcgY29weSkKQEAgLTM4LDcgKzM4LDYgQEAgcHVibGljOgogICAgICAgICA6
IG1fY3Vyc29yRWxlbWVudCgwKQogICAgICAgICAsIG1fY3Vyc29ySW1hZ2VWYWx1ZSgwKQogICAg
ICAgICAsIG1fY29ycmVzcG9uZGluZ0VsZW1lbnQoMCkKLSAgICAgICAgLCBtX2luc3RhbmNlc1Vw
ZGF0ZXNCbG9ja2VkKGZhbHNlKQogICAgICAgICAsIG1faGFzUGVuZGluZ1Jlc291cmNlcyhmYWxz
ZSkKICAgICB7CiAgICAgfQpAQCAtNTksOSArNTgsNiBAQCBwdWJsaWM6CiAgICAgSGFzaFNldDxT
VkdFbGVtZW50SW5zdGFuY2UqPiYgZWxlbWVudEluc3RhbmNlcygpIHsgcmV0dXJuIG1fZWxlbWVu
dEluc3RhbmNlczsgfQogICAgIGNvbnN0IEhhc2hTZXQ8U1ZHRWxlbWVudEluc3RhbmNlKj4mIGVs
ZW1lbnRJbnN0YW5jZXMoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRJbnN0YW5jZXM7IH0KIAot
ICAgIGJvb2wgaW5zdGFuY2VVcGRhdGVzQmxvY2tlZCgpIGNvbnN0IHsgcmV0dXJuIG1faW5zdGFu
Y2VzVXBkYXRlc0Jsb2NrZWQ7IH0KLSAgICB2b2lkIHNldEluc3RhbmNlVXBkYXRlc0Jsb2NrZWQo
Ym9vbCB2YWx1ZSkgeyBtX2luc3RhbmNlc1VwZGF0ZXNCbG9ja2VkID0gdmFsdWU7IH0KLQogICAg
IGJvb2wgaGFzUGVuZGluZ1Jlc291cmNlcygpIGNvbnN0IHsgcmV0dXJuIG1faGFzUGVuZGluZ1Jl
c291cmNlczsgfQogICAgIHZvaWQgc2V0SGFzUGVuZGluZ1Jlc291cmNlcyhib29sIHZhbHVlKSB7
IG1faGFzUGVuZGluZ1Jlc291cmNlcyA9IHZhbHVlOyB9CiAKQEAgLTc5LDcgKzc1LDYgQEAgcHJp
dmF0ZToKICAgICBTVkdDdXJzb3JFbGVtZW50KiBtX2N1cnNvckVsZW1lbnQ7CiAgICAgQ1NTQ3Vy
c29ySW1hZ2VWYWx1ZSogbV9jdXJzb3JJbWFnZVZhbHVlOwogICAgIFNWR0VsZW1lbnQqIG1fY29y
cmVzcG9uZGluZ0VsZW1lbnQ7Ci0gICAgYm9vbCBtX2luc3RhbmNlc1VwZGF0ZXNCbG9ja2VkIDog
MTsKICAgICBib29sIG1faGFzUGVuZGluZ1Jlc291cmNlcyA6IDE7CiB9OwogCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9zdmcvU1ZHTGVuZ3RoLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9zdmcvU1ZHTGVuZ3RoLmNwcAkocmV2aXNpb24gOTY1NzUpCisrKyBTb3VyY2UvV2ViQ29yZS9z
dmcvU1ZHTGVuZ3RoLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzAsMTEgKzMwLDEzIEBACiAjaW5j
bHVkZSAiRnJhbWVWaWV3LmgiCiAjaW5jbHVkZSAiUmVuZGVyT2JqZWN0LmgiCiAjaW5jbHVkZSAi
UmVuZGVyUGFydC5oIgorI2luY2x1ZGUgIlJlbmRlclNWR1ZpZXdwb3J0Q29udGFpbmVyLmgiCiAj
aW5jbHVkZSAiUmVuZGVyVmlldy5oIgogI2luY2x1ZGUgIlNWR0V4Y2VwdGlvbi5oIgogI2luY2x1
ZGUgIlNWR05hbWVzLmgiCiAjaW5jbHVkZSAiU1ZHUGFyc2VyVXRpbGl0aWVzLmgiCiAjaW5jbHVk
ZSAiU1ZHU1ZHRWxlbWVudC5oIgorI2luY2x1ZGUgIlNWR1N5bWJvbEVsZW1lbnQuaCIKIAogI2lu
Y2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+
CkBAIC0zNzgsMTcgKzM4MCwzMyBAQCBib29sIFNWR0xlbmd0aDo6ZGV0ZXJtaW5lVmlld3BvcnQo
Y29uc3QgCiAKICAgICAvLyBUYWtlIHNpemUgZnJvbSBuZWFyZXN0IHZpZXdwb3J0IGVsZW1lbnQg
KGNvbW1vbiBjYXNlOiBpbm5lciA8c3ZnPiBlbGVtZW50cykKICAgICBTVkdFbGVtZW50KiB2aWV3
cG9ydEVsZW1lbnQgPSBjb250ZXh0LT52aWV3cG9ydEVsZW1lbnQoKTsKLSAgICBpZiAodmlld3Bv
cnRFbGVtZW50ICYmIHZpZXdwb3J0RWxlbWVudC0+aXNTVkcoKSkgewotICAgICAgICBjb25zdCBT
VkdTVkdFbGVtZW50KiBzdmcgPSBzdGF0aWNfY2FzdDxjb25zdCBTVkdTVkdFbGVtZW50Kj4odmll
d3BvcnRFbGVtZW50KTsKLSAgICAgICAgaWYgKHN2Zy0+aGFzQXR0cmlidXRlKFNWR05hbWVzOjp2
aWV3Qm94QXR0cikpIHsKLSAgICAgICAgICAgIHdpZHRoID0gc3ZnLT52aWV3Qm94KCkud2lkdGgo
KTsKLSAgICAgICAgICAgIGhlaWdodCA9IHN2Zy0+dmlld0JveCgpLmhlaWdodCgpOwotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgd2lkdGggPSBzdmctPndpZHRoKCkudmFsdWUoc3ZnKTsK
LSAgICAgICAgICAgIGhlaWdodCA9IHN2Zy0+aGVpZ2h0KCkudmFsdWUoc3ZnKTsKKyAgICBpZiAo
dmlld3BvcnRFbGVtZW50KSB7CisgICAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQtPmlzU1ZHKCkp
IHsKKyAgICAgICAgICAgIGNvbnN0IFNWR1NWR0VsZW1lbnQqIHN2ZyA9IHN0YXRpY19jYXN0PGNv
bnN0IFNWR1NWR0VsZW1lbnQqPih2aWV3cG9ydEVsZW1lbnQpOworICAgICAgICAgICAgaWYgKHN2
Zy0+aGFzQXR0cmlidXRlKFNWR05hbWVzOjp2aWV3Qm94QXR0cikpIHsKKyAgICAgICAgICAgICAg
ICB3aWR0aCA9IHN2Zy0+dmlld0JveCgpLndpZHRoKCk7CisgICAgICAgICAgICAgICAgaGVpZ2h0
ID0gc3ZnLT52aWV3Qm94KCkuaGVpZ2h0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICAgIHdpZHRoID0gc3ZnLT53aWR0aCgpLnZhbHVlKHN2Zyk7CisgICAgICAgICAgICAg
ICAgaGVpZ2h0ID0gc3ZnLT5oZWlnaHQoKS52YWx1ZShzdmcpOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICh2
aWV3cG9ydEVsZW1lbnQtPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN5bWJvbFRhZykpIHsKKyAgICAg
ICAgICAgIGNvbnN0IFNWR1N5bWJvbEVsZW1lbnQqIHN5bWJvbCA9IHN0YXRpY19jYXN0PGNvbnN0
IFNWR1N5bWJvbEVsZW1lbnQqPih2aWV3cG9ydEVsZW1lbnQpOworICAgICAgICAgICAgaWYgKHN5
bWJvbC0+aGFzQXR0cmlidXRlKFNWR05hbWVzOjp2aWV3Qm94QXR0cikpIHsKKyAgICAgICAgICAg
ICAgICB3aWR0aCA9IHN5bWJvbC0+dmlld0JveCgpLndpZHRoKCk7CisgICAgICAgICAgICAgICAg
aGVpZ2h0ID0gc3ltYm9sLT52aWV3Qm94KCkuaGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAg
ICAgICBpZiAoUmVuZGVyU1ZHVmlld3BvcnRDb250YWluZXIqIHN5bWJvbFJlbmRlcmVyID0gdG9S
ZW5kZXJTVkdWaWV3cG9ydENvbnRhaW5lcihzeW1ib2wtPnJlbmRlcmVyKCkpKSB7CisgICAgICAg
ICAgICAgICAgd2lkdGggPSBzeW1ib2xSZW5kZXJlci0+dmlld3BvcnQoKS53aWR0aCgpOworICAg
ICAgICAgICAgICAgIGhlaWdodCA9IHN5bWJvbFJlbmRlcmVyLT52aWV3cG9ydCgpLmhlaWdodCgp
OworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSAgIAorICAgICAg
ICB9CiAgICAgfQogICAgIAogICAgIC8vIFRha2Ugc2l6ZSBmcm9tIGVuY2xvc2luZyBub24tU1ZH
IFJlbmRlckJveCAoY29tbW9uIGNhc2U6IGlubGluZSBTVkcpCkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9zdmcvU1ZHU3R5bGVkRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
c3ZnL1NWR1N0eWxlZEVsZW1lbnQuY3BwCShyZXZpc2lvbiA5NjU3NSkKKysrIFNvdXJjZS9XZWJD
b3JlL3N2Zy9TVkdTdHlsZWRFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtODksNyArODks
NyBAQCBTdHJpbmcgU1ZHU3R5bGVkRWxlbWVudDo6dGl0bGUoKSBjb25zdAogICAgIH0KICAgICAK
ICAgICAvLyBXYWxrIHVwIHRoZSB0cmVlLCB0byBmaW5kIG91dCB3aGV0aGVyIHdlJ3JlIGluc2lk
ZSBhIDx1c2U+IHNoYWRvdyB0cmVlLCB0byBmaW5kIHRoZSByaWdodCB0aXRsZS4KLSAgICBOb2Rl
KiBwYXJlbnQgPSBjb25zdF9jYXN0PFNWR1N0eWxlZEVsZW1lbnQqPih0aGlzKTsKKyAgICAvKiBG
SVhNRTogTm9kZSogcGFyZW50ID0gY29uc3RfY2FzdDxTVkdTdHlsZWRFbGVtZW50Kj4odGhpcyk7
CiAgICAgd2hpbGUgKHBhcmVudCkgewogICAgICAgICBpZiAoIXBhcmVudC0+aXNTVkdTaGFkb3dS
b290KCkpIHsKICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC0+cGFyZW50Tm9kZUd1YXJhbnRl
ZWRIb3N0RnJlZSgpOwpAQCAtMTA4LDcgKzEwOCw3IEBAIFN0cmluZyBTVkdTdHlsZWRFbGVtZW50
Ojp0aXRsZSgpIGNvbnN0CiAgICAgICAgIH0KICAgICAgICAgcGFyZW50ID0gcGFyZW50LT5wYXJl
bnROb2RlKCk7CiAgICAgfQotICAgIAorICAgKi8gCiAgICAgLy8gSWYgd2UgYXJlbid0IGFuIGlu
c3RhbmNlIGluIGEgPHVzZT4gb3IgdGhlIDx1c2U+IHRpdGxlIHdhcyBub3QgZm91bmQsIHRoZW4g
ZmluZCB0aGUgZmlyc3QKICAgICAvLyA8dGl0bGU+IGNoaWxkIG9mIHRoaXMgZWxlbWVudC4KICAg
ICBFbGVtZW50KiB0aXRsZUVsZW1lbnQgPSBmaXJzdEVsZW1lbnRDaGlsZCgpOwpAQCAtMzUxLDcg
KzM1MSw3IEBAIHZvaWQgU1ZHU3R5bGVkRWxlbWVudDo6c3ZnQXR0cmlidXRlQ2hhbmcKICAgICAg
ICAgICAgIG9iamVjdC0+dG9SZW5kZXJTVkdSZXNvdXJjZUNvbnRhaW5lcigpLT5pZENoYW5nZWQo
KTsKICAgICAgICAgaWYgKGluRG9jdW1lbnQoKSkKICAgICAgICAgICAgIGJ1aWxkUGVuZGluZ1Jl
c291cmNlc0lmTmVlZGVkKCk7Ci0gICAgICAgIFNWR0VsZW1lbnRJbnN0YW5jZTo6aW52YWxpZGF0
ZUFsbEluc3RhbmNlc09mRWxlbWVudCh0aGlzKTsKKyAgICAgICAgU1ZHRWxlbWVudEluc3RhbmNl
OjppbnZhbGlkYXRlQWxsSW5zdGFuY2VzT2ZFbGVtZW50KHRoaXMsIFNWR0VsZW1lbnRJbnN0YW5j
ZTo6UmVidWlsZEluc3RhbmNlVHJlZSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiB9CkBAIC0z
NjIsMTMgKzM2MiwxNCBAQCB2b2lkIFNWR1N0eWxlZEVsZW1lbnQ6OmF0dGFjaCgpCiAKICAgICBp
ZiAoUmVuZGVyT2JqZWN0KiBvYmplY3QgPSByZW5kZXJlcigpKQogICAgICAgICBvYmplY3QtPnVw
ZGF0ZUZyb21FbGVtZW50KCk7CisKKyAgICBidWlsZFBlbmRpbmdSZXNvdXJjZXNJZk5lZWRlZCgp
OwogfQogCiB2b2lkIFNWR1N0eWxlZEVsZW1lbnQ6Omluc2VydGVkSW50b0RvY3VtZW50KCkKIHsK
ICAgICBTVkdFbGVtZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCgpOwogICAgIHVwZGF0ZVJlbGF0
aXZlTGVuZ3Roc0luZm9ybWF0aW9uKCk7Ci0gICAgYnVpbGRQZW5kaW5nUmVzb3VyY2VzSWZOZWVk
ZWQoKTsKIH0KIAogdm9pZCBTVkdTdHlsZWRFbGVtZW50OjpidWlsZFBlbmRpbmdSZXNvdXJjZXNJ
Zk5lZWRlZCgpCkBAIC0zOTcsNyArMzk4LDcgQEAgdm9pZCBTVkdTdHlsZWRFbGVtZW50OjpyZW1v
dmVkRnJvbURvY3VtZQogewogICAgIHVwZGF0ZVJlbGF0aXZlTGVuZ3Roc0luZm9ybWF0aW9uKGZh
bHNlLCB0aGlzKTsKICAgICBTVkdFbGVtZW50OjpyZW1vdmVkRnJvbURvY3VtZW50KCk7Ci0gICAg
U1ZHRWxlbWVudEluc3RhbmNlOjppbnZhbGlkYXRlQWxsSW5zdGFuY2VzT2ZFbGVtZW50KHRoaXMp
OworICAgIFNWR0VsZW1lbnRJbnN0YW5jZTo6aW52YWxpZGF0ZUFsbEluc3RhbmNlc09mRWxlbWVu
dCh0aGlzLCBTVkdFbGVtZW50SW5zdGFuY2U6OlJlYnVpbGRJbnN0YW5jZVRyZWUpOwogCiAgICAg
RG9jdW1lbnQqIGRvY3VtZW50ID0gdGhpcy0+ZG9jdW1lbnQoKTsKICAgICBpZiAoIW5lZWRzUGVu
ZGluZ1Jlc291cmNlSGFuZGxpbmcoKSB8fCAhZG9jdW1lbnQpCkBAIC00MTIsNyArNDEzLDcgQEAg
dm9pZCBTVkdTdHlsZWRFbGVtZW50OjpjaGlsZHJlbkNoYW5nZWQoYgogCiAgICAgLy8gSW52YWxp
ZGF0ZSBhbGwgU1ZHRWxlbWVudEluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdXMKICAgICBpZiAo
IWNoYW5nZWRCeVBhcnNlcikKLSAgICAgICAgU1ZHRWxlbWVudEluc3RhbmNlOjppbnZhbGlkYXRl
QWxsSW5zdGFuY2VzT2ZFbGVtZW50KHRoaXMpOworICAgICAgICBTVkdFbGVtZW50SW5zdGFuY2U6
OmludmFsaWRhdGVBbGxJbnN0YW5jZXNPZkVsZW1lbnQodGhpcywgU1ZHRWxlbWVudEluc3RhbmNl
OjpSZWJ1aWxkSW5zdGFuY2VUcmVlKTsKIH0KIAogUGFzc1JlZlB0cjxDU1NWYWx1ZT4gU1ZHU3R5
bGVkRWxlbWVudDo6Z2V0UHJlc2VudGF0aW9uQXR0cmlidXRlKGNvbnN0IFN0cmluZyYgbmFtZSkK
QEAgLTQ0MCwxNyArNDQxLDYgQEAgUGFzc1JlZlB0cjxDU1NWYWx1ZT4gU1ZHU3R5bGVkRWxlbWVu
dDo6ZwogICAgIHJldHVybiBjc3NTVkdBdHRyLT5zdHlsZSgpLT5nZXRQcm9wZXJ0eUNTU1ZhbHVl
KG5hbWUpOwogfQogCi1ib29sIFNWR1N0eWxlZEVsZW1lbnQ6Omluc3RhbmNlVXBkYXRlc0Jsb2Nr
ZWQoKSBjb25zdAotewotICAgIHJldHVybiBoYXNSYXJlU1ZHRGF0YSgpICYmIHJhcmVTVkdEYXRh
KCktPmluc3RhbmNlVXBkYXRlc0Jsb2NrZWQoKTsKLX0KLQotdm9pZCBTVkdTdHlsZWRFbGVtZW50
OjpzZXRJbnN0YW5jZVVwZGF0ZXNCbG9ja2VkKGJvb2wgdmFsdWUpCi17Ci0gICAgaWYgKGhhc1Jh
cmVTVkdEYXRhKCkpCi0gICAgICAgIHJhcmVTVkdEYXRhKCktPnNldEluc3RhbmNlVXBkYXRlc0Js
b2NrZWQodmFsdWUpOwotfQotCiBib29sIFNWR1N0eWxlZEVsZW1lbnQ6Omhhc1BlbmRpbmdSZXNv
dXJjZXMoKSBjb25zdAogewogICAgIHJldHVybiBoYXNSYXJlU1ZHRGF0YSgpICYmIHJhcmVTVkdE
YXRhKCktPmhhc1BlbmRpbmdSZXNvdXJjZXMoKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3N2Zy9T
VkdTdHlsZWRFbGVtZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvc3ZnL1NWR1N0
eWxlZEVsZW1lbnQuaAkocmV2aXNpb24gOTY1NzUpCisrKyBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZH
U3R5bGVkRWxlbWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC00Niw5ICs0Niw2IEBAIHB1YmxpYzoK
IAogICAgIGJvb2wgaXNLbm93bkF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJik7CiAKLSAg
ICBib29sIGluc3RhbmNlVXBkYXRlc0Jsb2NrZWQoKSBjb25zdDsKLSAgICB2b2lkIHNldEluc3Rh
bmNlVXBkYXRlc0Jsb2NrZWQoYm9vbCk7Ci0KICAgICBib29sIGhhc1BlbmRpbmdSZXNvdXJjZXMo
KSBjb25zdDsKICAgICB2b2lkIHNldEhhc1BlbmRpbmdSZXNvdXJjZXMoKTsKICAgICB2b2lkIGNs
ZWFySGFzUGVuZGluZ1Jlc291cmNlc0lmUG9zc2libGUoKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L3N2Zy9TVkdTeW1ib2xFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9z
dmcvU1ZHU3ltYm9sRWxlbWVudC5jcHAJKHJldmlzaW9uIDk2NTc1KQorKysgU291cmNlL1dlYkNv
cmUvc3ZnL1NWR1N5bWJvbEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMyw2ICsyMyw3
IEBACiAjaWYgRU5BQkxFKFNWRykKICNpbmNsdWRlICJTVkdTeW1ib2xFbGVtZW50LmgiCiAKKyNp
bmNsdWRlICJSZW5kZXJTVkdWaWV3cG9ydENvbnRhaW5lci5oIgogI2luY2x1ZGUgIlNWR0VsZW1l
bnRJbnN0YW5jZS5oIgogI2luY2x1ZGUgIlNWR0ZpdFRvVmlld0JveC5oIgogI2luY2x1ZGUgIlNW
R05hbWVzLmgiCkBAIC0xMDAsNiArMTAxLDE2IEBAIGJvb2wgU1ZHU3ltYm9sRWxlbWVudDo6c2Vs
Zkhhc1JlbGF0aXZlTGUKICAgICByZXR1cm4gaGFzQXR0cmlidXRlKFNWR05hbWVzOjp2aWV3Qm94
QXR0cik7CiB9CiAKK1JlbmRlck9iamVjdCogU1ZHU3ltYm9sRWxlbWVudDo6Y3JlYXRlUmVuZGVy
ZXIoUmVuZGVyQXJlbmEqIGFyZW5hLCBSZW5kZXJTdHlsZSopCit7CisgICAgcmV0dXJuIG5ldyAo
YXJlbmEpIFJlbmRlclNWR1ZpZXdwb3J0Q29udGFpbmVyKHRoaXMpOworfQorCitBZmZpbmVUcmFu
c2Zvcm0gU1ZHU3ltYm9sRWxlbWVudDo6dmlld0JveFRvVmlld1RyYW5zZm9ybShmbG9hdCB2aWV3
V2lkdGgsIGZsb2F0IHZpZXdIZWlnaHQpIGNvbnN0Cit7CisgICAgcmV0dXJuIFNWR0ZpdFRvVmll
d0JveDo6dmlld0JveFRvVmlld1RyYW5zZm9ybSh2aWV3Qm94KCksIHByZXNlcnZlQXNwZWN0UmF0
aW8oKSwgdmlld1dpZHRoLCB2aWV3SGVpZ2h0KTsKK30KKwogfQogCiAjZW5kaWYgLy8gRU5BQkxF
KFNWRykKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdTeW1ib2xFbGVtZW50LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvc3ZnL1NWR1N5bWJvbEVsZW1lbnQuaAkocmV2aXNpb24g
OTY1NzUpCisrKyBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHU3ltYm9sRWxlbWVudC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0zOSw2ICszOSw4IEBAIGNsYXNzIFNWR1N5bWJvbEVsZW1lbnQgOiBwdWJsaWMg
U1ZHU3R5bGUKIHB1YmxpYzoKICAgICBzdGF0aWMgUGFzc1JlZlB0cjxTVkdTeW1ib2xFbGVtZW50
PiBjcmVhdGUoY29uc3QgUXVhbGlmaWVkTmFtZSYsIERvY3VtZW50Kik7CiAKKyAgICBBZmZpbmVU
cmFuc2Zvcm0gdmlld0JveFRvVmlld1RyYW5zZm9ybShmbG9hdCB2aWV3V2lkdGgsIGZsb2F0IHZp
ZXdIZWlnaHQpIGNvbnN0OworCiBwcml2YXRlOgogICAgIFNWR1N5bWJvbEVsZW1lbnQoY29uc3Qg
UXVhbGlmaWVkTmFtZSYsIERvY3VtZW50Kik7CiAKQEAgLTQ3LDggKzQ5LDggQEAgcHJpdmF0ZToK
ICAgICBib29sIGlzU3VwcG9ydGVkQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmKTsKICAg
ICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoQXR0cmlidXRlKik7CiAgICAgdmly
dHVhbCB2b2lkIHN2Z0F0dHJpYnV0ZUNoYW5nZWQoY29uc3QgUXVhbGlmaWVkTmFtZSYpOwotICAg
IHZpcnR1YWwgYm9vbCByZW5kZXJlcklzTmVlZGVkKGNvbnN0IE5vZGVSZW5kZXJpbmdDb250ZXh0
JikgeyByZXR1cm4gZmFsc2U7IH0KIAorICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0KiBjcmVhdGVS
ZW5kZXJlcihSZW5kZXJBcmVuYSosIFJlbmRlclN0eWxlKik7CiAgICAgdmlydHVhbCBib29sIHNl
bGZIYXNSZWxhdGl2ZUxlbmd0aHMoKSBjb25zdDsKIAogICAgIEJFR0lOX0RFQ0xBUkVfQU5JTUFU
RURfUFJPUEVSVElFUyhTVkdTeW1ib2xFbGVtZW50KQpJbmRleDogU291cmNlL1dlYkNvcmUvc3Zn
L1NWR1VzZUVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdV
c2VFbGVtZW50LmNwcAkocmV2aXNpb24gOTY1NzUpCisrKyBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZH
VXNlRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMsNiArMyw3IEBACiAgKiBDb3B5cmln
aHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgUm9iIEJ1aXMgPGJ1aXNAa2RlLm9yZz4KICAq
IENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAwOS0yMDEwLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChDKSAyMDExIFRvcmNoIE1vYmlsZSAoQmVp
amluZykgQ28uIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgUmVz
ZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAxMS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAg
KiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg
YW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYwpAQCAtMjUsMzQgKzI2LDExIEBACiAjaWYgRU5BQkxFKFNWRykKICNpbmNs
dWRlICJTVkdVc2VFbGVtZW50LmgiCiAKLSNpbmNsdWRlICJBdHRyaWJ1dGUuaCIKLSNpbmNsdWRl
ICJDU1NTdHlsZVNlbGVjdG9yLmgiCi0jaW5jbHVkZSAiRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJF
dmVudC5oIgotI2luY2x1ZGUgIkV2ZW50TGlzdGVuZXIuaCIKLSNpbmNsdWRlICJIVE1MTmFtZXMu
aCIKLSNpbmNsdWRlICJOb2RlUmVuZGVyU3R5bGUuaCIKLSNpbmNsdWRlICJSZWdpc3RlcmVkRXZl
bnRMaXN0ZW5lci5oIgotI2luY2x1ZGUgIlJlbmRlclNWR1Jlc291cmNlLmgiCi0jaW5jbHVkZSAi
UmVuZGVyU1ZHU2hhZG93VHJlZVJvb3RDb250YWluZXIuaCIKLSNpbmNsdWRlICJTVkdFbGVtZW50
SW5zdGFuY2UuaCIKLSNpbmNsdWRlICJTVkdFbGVtZW50UmFyZURhdGEuaCIKLSNpbmNsdWRlICJT
VkdFbGVtZW50SW5zdGFuY2VMaXN0LmgiCi0jaW5jbHVkZSAiU1ZHR0VsZW1lbnQuaCIKKyNpbmNs
dWRlICJSZW5kZXJTVkdEdXBsaWNhdGUuaCIKKyNpbmNsdWRlICJTVkdEb2N1bWVudEV4dGVuc2lv
bnMuaCIKICNpbmNsdWRlICJTVkdOYW1lcy5oIgogI2luY2x1ZGUgIlNWR1NNSUxFbGVtZW50Lmgi
Ci0jaW5jbHVkZSAiU1ZHU1ZHRWxlbWVudC5oIgotI2luY2x1ZGUgIlNWR1NoYWRvd1RyZWVFbGVt
ZW50cy5oIgotI2luY2x1ZGUgIlNWR1N5bWJvbEVsZW1lbnQuaCIKLSNpbmNsdWRlICJYTGlua05h
bWVzLmgiCiAjaW5jbHVkZSAiWE1MRG9jdW1lbnRQYXJzZXIuaCIKLSNpbmNsdWRlICJYTUxTZXJp
YWxpemVyLmgiCi0KLS8vIER1bXAgU1ZHRWxlbWVudEluc3RhbmNlIG9iamVjdCB0cmVlIC0gdXNl
ZnVsIHRvIGRlYnVnIGluc3RhbmNlUm9vdCBwcm9ibGVtcwotLy8gI2RlZmluZSBEVU1QX0lOU1RB
TkNFX1RSRUUKLQotLy8gRHVtcCB0aGUgZGVlcC1leHBhbmRlZCBzaGFkb3cgdHJlZSAod2hlcmUg
dGhlIHJlbmRlcmVycyBhcmUgYnVpbHQgZnJvbSkKLS8vICNkZWZpbmUgRFVNUF9TSEFET1dfVFJF
RQogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTgxLDEzICs1OSw5IEBAIGlubGluZSBTVkdV
c2VFbGVtZW50OjpTVkdVc2VFbGVtZW50KGNvbnMKICAgICAsIG1feShMZW5ndGhNb2RlSGVpZ2h0
KQogICAgICwgbV93aWR0aChMZW5ndGhNb2RlV2lkdGgpCiAgICAgLCBtX2hlaWdodChMZW5ndGhN
b2RlSGVpZ2h0KQotICAgICwgbV91cGRhdGVzQmxvY2tlZChmYWxzZSkKLSAgICAsIG1fbmVlZHNT
aGFkb3dUcmVlUmVjcmVhdGlvbihmYWxzZSkKIHsKICAgICBBU1NFUlQoaGFzVGFnTmFtZShTVkdO
YW1lczo6dXNlVGFnKSk7CiAgICAgcmVnaXN0ZXJBbmltYXRlZFByb3BlcnRpZXNGb3JTVkdVc2VF
bGVtZW50KCk7Ci0gICAgCi0gICAgc2V0SGFzQ3VzdG9tV2lsbE9yRGlkUmVjYWxjU3R5bGUoKTsK
IH0KIAogUGFzc1JlZlB0cjxTVkdVc2VFbGVtZW50PiBTVkdVc2VFbGVtZW50OjpjcmVhdGUoY29u
c3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQqIGRvY3VtZW50KQpAQCAtOTcsMTMg
KzcxLDYgQEAgUGFzc1JlZlB0cjxTVkdVc2VFbGVtZW50PiBTVkdVc2VFbGVtZW50OgogCiBTVkdF
bGVtZW50SW5zdGFuY2UqIFNWR1VzZUVsZW1lbnQ6Omluc3RhbmNlUm9vdCgpCiB7Ci0gICAgLy8g
SWYgdGhlcmUgaXMgbm8gZWxlbWVudCBpbnN0YW5jZSB0cmVlLCBmb3JjZSBpbW1lZGlhdGUgU1ZH
RWxlbWVudEluc3RhbmNlIHRyZWUKLSAgICAvLyBjcmVhdGlvbiBieSBhc2tpbmcgdGhlIGRvY3Vt
ZW50IHRvIGludm9rZSBvdXIgcmVjYWxjU3R5bGUgZnVuY3Rpb24gLSBhcyB3ZSBjYW4ndAotICAg
IC8vIHdhaXQgZm9yIHRoZSBsYXp5IGNyZWF0aW9uIHRvIGhhcHBlbiBpZiBlLmcuIEpTIHdhbnRz
IHRvIGFjY2VzcyB0aGUgaW5zdGFuY2VSb290Ci0gICAgLy8gb2JqZWN0IHJpZ2h0IGFmdGVyIGNy
ZWF0aW5nIHRoZSBlbGVtZW50IG9uLXRoZS1mbHkKLSAgICBpZiAoIW1fdGFyZ2V0RWxlbWVudElu
c3RhbmNlKQotICAgICAgICBkb2N1bWVudCgpLT51cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5
bGVzaGVldHMoKTsKLQogICAgIHJldHVybiBtX3RhcmdldEVsZW1lbnRJbnN0YW5jZS5nZXQoKTsK
IH0KIApAQCAtMTY1LDcgKzEzMiw2IEBAIHZvaWQgU1ZHVXNlRWxlbWVudDo6aW5zZXJ0ZWRJbnRv
RG9jdW1lbnQKICAgICAvLyBUaGlzIGZ1bmN0aW9ucyBleGlzdHMgdG8gYXNzdXJlIGFzc3VtcHRp
b25zIG1hZGUgaW4gdGhlIGNvZGUgcmVnYXJkaW5nIFNWR0VsZW1lbnRJbnN0YW5jZSBjcmVhdGlv
bi9kZXN0cnVjdGlvbiBhcmUgc2F0aXNmaWVkLgogICAgIFNWR1N0eWxlZFRyYW5zZm9ybWFibGVF
bGVtZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCgpOwogICAgIEFTU0VSVCghbV90YXJnZXRFbGVt
ZW50SW5zdGFuY2UgfHwgIWlzV2VsbEZvcm1lZERvY3VtZW50KGRvY3VtZW50KCkpKTsKLSAgICBB
U1NFUlQoIWhhc1BlbmRpbmdSZXNvdXJjZXMoKSB8fCAhaXNXZWxsRm9ybWVkRG9jdW1lbnQoZG9j
dW1lbnQoKSkpOwogfQogCiB2b2lkIFNWR1VzZUVsZW1lbnQ6OnJlbW92ZWRGcm9tRG9jdW1lbnQo
KQpAQCAtMTkyLDE5MSArMTU4LDE5IEBAIHZvaWQgU1ZHVXNlRWxlbWVudDo6c3ZnQXR0cmlidXRl
Q2hhbmdlZCgKICAgICBpZiAoU1ZHVGVzdHM6OmhhbmRsZUF0dHJpYnV0ZUNoYW5nZSh0aGlzLCBh
dHRyTmFtZSkpCiAgICAgICAgIHJldHVybjsKIAotICAgIFJlbmRlck9iamVjdCogb2JqZWN0ID0g
cmVuZGVyZXIoKTsKLSAgICBpZiAoIW9iamVjdCkKLSAgICAgICAgcmV0dXJuOwotCiAgICAgaWYg
KFNWR1VSSVJlZmVyZW5jZTo6aXNLbm93bkF0dHJpYnV0ZShhdHRyTmFtZSkpIHsKLSAgICAgICAg
aWYgKGhhc1BlbmRpbmdSZXNvdXJjZXMoKSkgewotICAgICAgICAgICAgT3duUHRyPFNWR0RvY3Vt
ZW50RXh0ZW5zaW9uczo6U1ZHUGVuZGluZ0VsZW1lbnRzPiBjbGllbnRzKGRvY3VtZW50KCktPmFj
Y2Vzc1NWR0V4dGVuc2lvbnMoKS0+cmVtb3ZlUGVuZGluZ1Jlc291cmNlKG1fcmVzb3VyY2VJZCkp
OwotICAgICAgICAgICAgQVNTRVJUKCFjbGllbnRzLT5pc0VtcHR5KCkpOwotCi0gICAgICAgICAg
ICBjb25zdCBTVkdEb2N1bWVudEV4dGVuc2lvbnM6OlNWR1BlbmRpbmdFbGVtZW50czo6Y29uc3Rf
aXRlcmF0b3IgZW5kID0gY2xpZW50cy0+ZW5kKCk7Ci0gICAgICAgICAgICBmb3IgKFNWR0RvY3Vt
ZW50RXh0ZW5zaW9uczo6U1ZHUGVuZGluZ0VsZW1lbnRzOjpjb25zdF9pdGVyYXRvciBpdCA9IGNs
aWVudHMtPmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAgICAgICAgIEFTU0VS
VCgoKml0KS0+aGFzUGVuZGluZ1Jlc291cmNlcygpKTsKLSAgICAgICAgICAgICAgICAoKml0KS0+
Y2xlYXJIYXNQZW5kaW5nUmVzb3VyY2VzSWZQb3NzaWJsZSgpOwotICAgICAgICAgICAgfQotCi0g
ICAgICAgICAgICBtX3Jlc291cmNlSWQgPSBTdHJpbmcoKTsKLSAgICAgICAgICAgIGNsZWFySGFz
UGVuZGluZ1Jlc291cmNlc0lmUG9zc2libGUoKTsKKyAgICAgICAgU3RyaW5nIGlkOworICAgICAg
ICBFbGVtZW50KiB0YXJnZXQgPSBTVkdVUklSZWZlcmVuY2U6OnRhcmdldEVsZW1lbnRGcm9tSVJJ
U3RyaW5nKGhyZWYoKSwgZG9jdW1lbnQoKSwgJmlkKTsKKyAgICAgICAgaWYgKCF0YXJnZXQpIHsK
KyAgICAgICAgICAgIGRvY3VtZW50KCktPmFjY2Vzc1NWR0V4dGVuc2lvbnMoKS0+YWRkUGVuZGlu
Z1Jlc291cmNlKGlkLCB0aGlzKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAg
ICAgICAgIG1fdGFyZ2V0RWxlbWVudEluc3RhbmNlID0gMDsKLSAgICAgICAgaW52YWxpZGF0ZVNo
YWRvd1RyZWUoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChpc1hZQXR0cmli
dXRlKSB7Ci0gICAgICAgIHVwZGF0ZUNvbnRhaW5lck9mZnNldHMoKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotICAgIGlmIChpc1dpZHRoSGVpZ2h0QXR0cmlidXRlKSB7Ci0gICAgICAgIHVw
ZGF0ZUNvbnRhaW5lclNpemVzKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBC
ZSB2ZXJ5IGNhcmVmdWwgaGVyZSwgaWYgc3ZnQXR0cmlidXRlQ2hhbmdlZCgpIGhhcyBiZWVuIGNh
bGxlZCBiZWNhdXNlIGEgU1ZHIENTUyBwcm9wZXJ0eSBjaGFuZ2VkLCB3ZSBkbyBOT1Qgd2FudCB0
byByZWNsb25lIHRoZSB0cmVlIQotICAgIGlmIChTVkdTdHlsZWRFbGVtZW50Ojppc0tub3duQXR0
cmlidXRlKGF0dHJOYW1lKSkgewotICAgICAgICBzZXROZWVkc1N0eWxlUmVjYWxjKCk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoU1ZHTGFuZ1NwYWNlOjppc0tub3duQXR0cmli
dXRlKGF0dHJOYW1lKSB8fCBTVkdFeHRlcm5hbFJlc291cmNlc1JlcXVpcmVkOjppc0tub3duQXR0
cmlidXRlKGF0dHJOYW1lKSkgewotICAgICAgICBpbnZhbGlkYXRlU2hhZG93VHJlZSgpOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci19Ci0KLXN0
YXRpYyB2b2lkIHVwZGF0ZUNvbnRhaW5lclNpemUoU1ZHRWxlbWVudEluc3RhbmNlKiB0YXJnZXRJ
bnN0YW5jZSkKLXsKLSAgICAvLyBEZXB0aC1maXJzdCB1c2VkIHRvIHdyaXRlIHRoZSBtZXRob2Qg
aW4gZWFybHkgZXhpdCBzdHlsZSwgbm8gcGFydGljdWxhciBvdGhlciByZWFzb24uCi0gICAgZm9y
IChTVkdFbGVtZW50SW5zdGFuY2UqIGluc3RhbmNlID0gdGFyZ2V0SW5zdGFuY2UtPmZpcnN0Q2hp
bGQoKTsgaW5zdGFuY2U7IGluc3RhbmNlID0gaW5zdGFuY2UtPm5leHRTaWJsaW5nKCkpCi0gICAg
ICAgIHVwZGF0ZUNvbnRhaW5lclNpemUoaW5zdGFuY2UpOwotCi0gICAgU1ZHVXNlRWxlbWVudCog
dXNlRWxlbWVudCA9IHRhcmdldEluc3RhbmNlLT5kaXJlY3RVc2VFbGVtZW50KCk7Ci0gICAgaWYg
KCF1c2VFbGVtZW50KQotICAgICAgICByZXR1cm47Ci0KLSAgICBTVkdFbGVtZW50KiBjb3JyZXNw
b25kaW5nRWxlbWVudCA9IHRhcmdldEluc3RhbmNlLT5jb3JyZXNwb25kaW5nRWxlbWVudCgpOwot
ICAgIEFTU0VSVChjb3JyZXNwb25kaW5nRWxlbWVudCk7Ci0KLSAgICBib29sIGlzU3ltYm9sVGFn
ID0gY29ycmVzcG9uZGluZ0VsZW1lbnQtPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN5bWJvbFRhZyk7
Ci0gICAgaWYgKCFjb3JyZXNwb25kaW5nRWxlbWVudC0+aGFzVGFnTmFtZShTVkdOYW1lczo6c3Zn
VGFnKSAmJiAhaXNTeW1ib2xUYWcpCi0gICAgICAgIHJldHVybjsKLQotICAgIFNWR0VsZW1lbnQq
IHNoYWRvd1RyZWVFbGVtZW50ID0gdGFyZ2V0SW5zdGFuY2UtPnNoYWRvd1RyZWVFbGVtZW50KCk7
Ci0gICAgQVNTRVJUKHNoYWRvd1RyZWVFbGVtZW50KTsKLSAgICBBU1NFUlQoc2hhZG93VHJlZUVs
ZW1lbnQtPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN2Z1RhZykpOwotCi0gICAgLy8gU3BlYyAoPHVz
ZT4gb24gPHN5bWJvbD4pOiBUaGlzIGdlbmVyYXRlZCAnc3ZnJyB3aWxsIGFsd2F5cyBoYXZlIGV4
cGxpY2l0IHZhbHVlcyBmb3IgYXR0cmlidXRlcyB3aWR0aCBhbmQgaGVpZ2h0LgotICAgIC8vIElm
IGF0dHJpYnV0ZXMgd2lkdGggYW5kL29yIGhlaWdodCBhcmUgcHJvdmlkZWQgb24gdGhlICd1c2Un
IGVsZW1lbnQsIHRoZW4gdGhlc2UgYXR0cmlidXRlcwotICAgIC8vIHdpbGwgYmUgdHJhbnNmZXJy
ZWQgdG8gdGhlIGdlbmVyYXRlZCAnc3ZnJy4gSWYgYXR0cmlidXRlcyB3aWR0aCBhbmQvb3IgaGVp
Z2h0IGFyZSBub3Qgc3BlY2lmaWVkLAotICAgIC8vIHRoZSBnZW5lcmF0ZWQgJ3N2ZycgZWxlbWVu
dCB3aWxsIHVzZSB2YWx1ZXMgb2YgMTAwJSBmb3IgdGhlc2UgYXR0cmlidXRlcy4KLSAgICAKLSAg
ICAvLyBTcGVjICg8dXNlPiBvbiA8c3ZnPik6IElmIGF0dHJpYnV0ZXMgd2lkdGggYW5kL29yIGhl
aWdodCBhcmUgcHJvdmlkZWQgb24gdGhlICd1c2UnIGVsZW1lbnQsIHRoZW4gdGhlc2UKLSAgICAv
LyB2YWx1ZXMgd2lsbCBvdmVycmlkZSB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGVzIG9uIHRo
ZSAnc3ZnJyBpbiB0aGUgZ2VuZXJhdGVkIHRyZWUuCi0KLSAgICBpZiAodXNlRWxlbWVudC0+aGFz
QXR0cmlidXRlKFNWR05hbWVzOjp3aWR0aEF0dHIpKQotICAgICAgICBzaGFkb3dUcmVlRWxlbWVu
dC0+c2V0QXR0cmlidXRlKFNWR05hbWVzOjp3aWR0aEF0dHIsIHVzZUVsZW1lbnQtPmdldEF0dHJp
YnV0ZShTVkdOYW1lczo6d2lkdGhBdHRyKSk7Ci0gICAgZWxzZSBpZiAoaXNTeW1ib2xUYWcgJiYg
c2hhZG93VHJlZUVsZW1lbnQtPmhhc0F0dHJpYnV0ZShTVkdOYW1lczo6d2lkdGhBdHRyKSkKLSAg
ICAgICAgc2hhZG93VHJlZUVsZW1lbnQtPnNldEF0dHJpYnV0ZShTVkdOYW1lczo6d2lkdGhBdHRy
LCAiMTAwJSIpOwotCi0gICAgaWYgKHVzZUVsZW1lbnQtPmhhc0F0dHJpYnV0ZShTVkdOYW1lczo6
aGVpZ2h0QXR0cikpCi0gICAgICAgIHNoYWRvd1RyZWVFbGVtZW50LT5zZXRBdHRyaWJ1dGUoU1ZH
TmFtZXM6OmhlaWdodEF0dHIsIHVzZUVsZW1lbnQtPmdldEF0dHJpYnV0ZShTVkdOYW1lczo6aGVp
Z2h0QXR0cikpOwotICAgIGVsc2UgaWYgKGlzU3ltYm9sVGFnICYmIHNoYWRvd1RyZWVFbGVtZW50
LT5oYXNBdHRyaWJ1dGUoU1ZHTmFtZXM6OmhlaWdodEF0dHIpKQotICAgICAgICBzaGFkb3dUcmVl
RWxlbWVudC0+c2V0QXR0cmlidXRlKFNWR05hbWVzOjpoZWlnaHRBdHRyLCAiMTAwJSIpOwotfSAg
IAotCi12b2lkIFNWR1VzZUVsZW1lbnQ6OnVwZGF0ZUNvbnRhaW5lclNpemVzKCkKLXsKLSAgICBp
ZiAoIW1fdGFyZ2V0RWxlbWVudEluc3RhbmNlKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBV
cGRhdGUgd2hvbGUgc3VidHJlZSwgc2Nhbm5pbmcgZm9yIHNoYWRvdyBjb250YWluZXIgZWxlbWVu
dHMsIHRoYXQgY29ycmVzcG9uZCB0byA8c3ZnPi88c3ltYm9sPiB0YWdzCi0gICAgQVNTRVJUKG1f
dGFyZ2V0RWxlbWVudEluc3RhbmNlLT5kaXJlY3RVc2VFbGVtZW50KCkgPT0gdGhpcyk7Ci0gICAg
dXBkYXRlQ29udGFpbmVyU2l6ZShtX3RhcmdldEVsZW1lbnRJbnN0YW5jZS5nZXQoKSk7Ci0KLSAg
ICBpZiAoUmVuZGVyT2JqZWN0KiBvYmplY3QgPSByZW5kZXJlcigpKQotICAgICAgICBSZW5kZXJT
VkdSZXNvdXJjZTo6bWFya0ZvckxheW91dEFuZFBhcmVudFJlc291cmNlSW52YWxpZGF0aW9uKG9i
amVjdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZUNvbnRhaW5lck9mZnNldChTVkdFbGVtZW50
SW5zdGFuY2UqIHRhcmdldEluc3RhbmNlKQotewotICAgIC8vIERlcHRoLWZpcnN0IHVzZWQgdG8g
d3JpdGUgdGhlIG1ldGhvZCBpbiBlYXJseSBleGl0IHN0eWxlLCBubyBwYXJ0aWN1bGFyIG90aGVy
IHJlYXNvbi4KLSAgICBmb3IgKFNWR0VsZW1lbnRJbnN0YW5jZSogaW5zdGFuY2UgPSB0YXJnZXRJ
bnN0YW5jZS0+Zmlyc3RDaGlsZCgpOyBpbnN0YW5jZTsgaW5zdGFuY2UgPSBpbnN0YW5jZS0+bmV4
dFNpYmxpbmcoKSkKLSAgICAgICAgdXBkYXRlQ29udGFpbmVyT2Zmc2V0KGluc3RhbmNlKTsKLQot
ICAgIFNWR0VsZW1lbnQqIGNvcnJlc3BvbmRpbmdFbGVtZW50ID0gdGFyZ2V0SW5zdGFuY2UtPmNv
cnJlc3BvbmRpbmdFbGVtZW50KCk7Ci0gICAgQVNTRVJUKGNvcnJlc3BvbmRpbmdFbGVtZW50KTsK
LQotICAgIGlmICghY29ycmVzcG9uZGluZ0VsZW1lbnQtPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnVz
ZVRhZykpCi0gICAgICAgIHJldHVybjsKLQotICAgIFNWR0VsZW1lbnQqIHNoYWRvd1RyZWVFbGVt
ZW50ID0gdGFyZ2V0SW5zdGFuY2UtPnNoYWRvd1RyZWVFbGVtZW50KCk7Ci0gICAgQVNTRVJUKHNo
YWRvd1RyZWVFbGVtZW50KTsKLSAgICBBU1NFUlQoc2hhZG93VHJlZUVsZW1lbnQtPmhhc1RhZ05h
bWUoU1ZHTmFtZXM6OmdUYWcpKTsKLQotICAgIGlmICghc3RhdGljX2Nhc3Q8U1ZHR0VsZW1lbnQq
PihzaGFkb3dUcmVlRWxlbWVudCktPmlzU2hhZG93VHJlZUNvbnRhaW5lckVsZW1lbnQoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgLy8gU3BlYzogQW4gYWRkaXRpb25hbCB0cmFuc2Zvcm1hdGlv
biB0cmFuc2xhdGUoeCx5KSBpcyBhcHBlbmRlZCB0byB0aGUgZW5kCi0gICAgLy8gKGkuZS4sIHJp
Z2h0LXNpZGUpIG9mIHRoZSB0cmFuc2Zvcm0gYXR0cmlidXRlIG9uIHRoZSBnZW5lcmF0ZWQgJ2cn
LCB3aGVyZSB4Ci0gICAgLy8gYW5kIHkgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgdGhlIHggYW5k
IHkgYXR0cmlidXRlcyBvbiB0aGUgJ3VzZScgZWxlbWVudC4gCi0gICAgU1ZHVXNlRWxlbWVudCog
dXNlRWxlbWVudCA9IHN0YXRpY19jYXN0PFNWR1VzZUVsZW1lbnQqPihjb3JyZXNwb25kaW5nRWxl
bWVudCk7Ci0gICAgU1ZHU2hhZG93VHJlZUNvbnRhaW5lckVsZW1lbnQqIGNvbnRhaW5lckVsZW1l
bnQgPSBzdGF0aWNfY2FzdDxTVkdTaGFkb3dUcmVlQ29udGFpbmVyRWxlbWVudCo+KHNoYWRvd1Ry
ZWVFbGVtZW50KTsKLSAgICBjb250YWluZXJFbGVtZW50LT5zZXRDb250YWluZXJPZmZzZXQodXNl
RWxlbWVudC0+eCgpLCB1c2VFbGVtZW50LT55KCkpOwotfQotCi12b2lkIFNWR1VzZUVsZW1lbnQ6
OnVwZGF0ZUNvbnRhaW5lck9mZnNldHMoKQotewotICAgIGlmICghbV90YXJnZXRFbGVtZW50SW5z
dGFuY2UpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFVwZGF0ZSByb290IGNvbnRhaW5lciBv
ZmZzZXQgKG5vdCByZWFjaGFibGUgdGhyb3VnaCBpbnN0YW5jZSB0cmVlKQotICAgIFNWR0VsZW1l
bnQqIHNoYWRvd1Jvb3QgPSBtX3RhcmdldEVsZW1lbnRJbnN0YW5jZS0+c2hhZG93VHJlZUVsZW1l
bnQoKTsKLSAgICBBU1NFUlQoc2hhZG93Um9vdCk7Ci0KLSAgICBDb250YWluZXJOb2RlKiBwYXJl
bnROb2RlID0gc2hhZG93Um9vdC0+cGFyZW50Tm9kZSgpOwotICAgIEFTU0VSVChwYXJlbnROb2Rl
KTsKLSAgICBBU1NFUlQocGFyZW50Tm9kZS0+aXNTVkdFbGVtZW50KCkpOwotICAgIEFTU0VSVChw
YXJlbnROb2RlLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpnVGFnKSk7Ci0gICAgQVNTRVJUKHN0YXRp
Y19jYXN0PFNWR0dFbGVtZW50Kj4ocGFyZW50Tm9kZSktPmlzU2hhZG93VHJlZUNvbnRhaW5lckVs
ZW1lbnQoKSk7Ci0KLSAgICBTVkdTaGFkb3dUcmVlQ29udGFpbmVyRWxlbWVudCogY29udGFpbmVy
RWxlbWVudCA9IHN0YXRpY19jYXN0PFNWR1NoYWRvd1RyZWVDb250YWluZXJFbGVtZW50Kj4ocGFy
ZW50Tm9kZSk7Ci0gICAgY29udGFpbmVyRWxlbWVudC0+c2V0Q29udGFpbmVyT2Zmc2V0KHgoKSwg
eSgpKTsKLQotICAgIC8vIFVwZGF0ZSB3aG9sZSBzdWJ0cmVlLCBzY2FubmluZyBmb3Igc2hhZG93
IGNvbnRhaW5lciBlbGVtZW50cywgbWFya2luZyBhIGNsb25lZCB1c2Ugc3VidHJlZQotICAgIHVw
ZGF0ZUNvbnRhaW5lck9mZnNldChtX3RhcmdldEVsZW1lbnRJbnN0YW5jZS5nZXQoKSk7Ci0KLSAg
ICBpZiAoUmVuZGVyT2JqZWN0KiBvYmplY3QgPSByZW5kZXJlcigpKQotICAgICAgICBSZW5kZXJT
VkdSZXNvdXJjZTo6bWFya0ZvckxheW91dEFuZFBhcmVudFJlc291cmNlSW52YWxpZGF0aW9uKG9i
amVjdCk7Ci19Ci0KLWJvb2wgU1ZHVXNlRWxlbWVudDo6d2lsbFJlY2FsY1N0eWxlKFN0eWxlQ2hh
bmdlIGNoYW5nZSkKLXsKLSAgICAvLyBFdmVudHVhbGx5IG1hcmsgc2hhZG93IHJvb3QgZWxlbWVu
dCBuZWVkaW5nIHN0eWxlIHJlY2FsYwotICAgIGlmICgoY2hhbmdlID49IEluaGVyaXQgfHwgbmVl
ZHNTdHlsZVJlY2FsYygpIHx8IGNoaWxkTmVlZHNTdHlsZVJlY2FsYygpKSAmJiBtX3RhcmdldEVs
ZW1lbnRJbnN0YW5jZSAmJiAhbV91cGRhdGVzQmxvY2tlZCkgewotICAgICAgICBpZiAoU1ZHRWxl
bWVudCogc2hhZG93Um9vdCA9IG1fdGFyZ2V0RWxlbWVudEluc3RhbmNlLT5zaGFkb3dUcmVlRWxl
bWVudCgpKQotICAgICAgICAgICAgc2hhZG93Um9vdC0+c2V0TmVlZHNTdHlsZVJlY2FsYygpOwot
ICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBTVkdVc2VFbGVtZW50OjpkaWRSZWNh
bGNTdHlsZShTdHlsZUNoYW5nZSBjaGFuZ2UpCi17Ci0gICAgLy8gQXNzdXJlIHRoYXQgdGhlIHNo
YWRvdyB0cmVlIGhhcyBub3QgYmVlbiBtYXJrZWQgZm9yIHJlY3JlYXRpb24sIHdoaWxlIHdlJ3Jl
IGJ1aWxkaW5nIGl0LgotICAgIGlmIChtX3VwZGF0ZXNCbG9ja2VkKQotICAgICAgICBBU1NFUlQo
IW1fbmVlZHNTaGFkb3dUcmVlUmVjcmVhdGlvbik7Ci0KLSAgICBSZW5kZXJTVkdTaGFkb3dUcmVl
Um9vdENvbnRhaW5lciogc2hhZG93Um9vdCA9IHN0YXRpY19jYXN0PFJlbmRlclNWR1NoYWRvd1Ry
ZWVSb290Q29udGFpbmVyKj4ocmVuZGVyZXIoKSk7Ci0gICAgaWYgKCFzaGFkb3dSb290KQotICAg
ICAgICByZXR1cm47Ci0gICAgCi0gICAgYm9vbCBuZWVkc1N0eWxlVXBkYXRlID0gIW1fbmVlZHNT
aGFkb3dUcmVlUmVjcmVhdGlvbjsKLSAgICBpZiAobV9uZWVkc1NoYWRvd1RyZWVSZWNyZWF0aW9u
KSB7Ci0gICAgICAgIHNoYWRvd1Jvb3QtPm1hcmtTaGFkb3dUcmVlRm9yUmVjcmVhdGlvbigpOwot
ICAgICAgICBtX25lZWRzU2hhZG93VHJlZVJlY3JlYXRpb24gPSBmYWxzZTsKICAgICB9CiAKLSAg
ICBzaGFkb3dSb290LT51cGRhdGVGcm9tRWxlbWVudCgpOwotCi0gICAgaWYgKCFuZWVkc1N0eWxl
VXBkYXRlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBzaGFkb3dSb290LT51cGRhdGVTdHlsZShj
aGFuZ2UpOworICAgIGlmIChSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gdGhpcy0+cmVuZGVyZXIo
KSkKKyAgICAgICAgcmVuZGVyZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7CiB9CiAKICNpZmRlZiBE
VU1QX0lOU1RBTkNFX1RSRUUKQEAgLTM4NSwyNCArMTc5LDIwIEBAIHZvaWQgZHVtcEluc3RhbmNl
VHJlZSh1bnNpZ25lZCBpbnQmIGRlcHQKICAgICBTVkdFbGVtZW50KiBlbGVtZW50ID0gdGFyZ2V0
SW5zdGFuY2UtPmNvcnJlc3BvbmRpbmdFbGVtZW50KCk7CiAgICAgQVNTRVJUKGVsZW1lbnQpOwog
Ci0gICAgU1ZHRWxlbWVudCogc2hhZG93VHJlZUVsZW1lbnQgPSB0YXJnZXRJbnN0YW5jZS0+c2hh
ZG93VHJlZUVsZW1lbnQoKTsKLSAgICBBU1NFUlQoc2hhZG93VHJlZUVsZW1lbnQpOwotCiAgICAg
U1ZHVXNlRWxlbWVudCogZGlyZWN0VXNlRWxlbWVudCA9IHRhcmdldEluc3RhbmNlLT5kaXJlY3RV
c2VFbGVtZW50KCk7CiAgICAgU3RyaW5nIGRpcmVjdFVzZUVsZW1lbnROYW1lID0gZGlyZWN0VXNl
RWxlbWVudCA/IGRpcmVjdFVzZUVsZW1lbnQtPm5vZGVOYW1lKCkgOiAibnVsbCI7CiAKICAgICBT
dHJpbmcgZWxlbWVudElkID0gZWxlbWVudC0+Z2V0SWRBdHRyaWJ1dGUoKTsKICAgICBTdHJpbmcg
ZWxlbWVudE5vZGVOYW1lID0gZWxlbWVudC0+bm9kZU5hbWUoKTsKLSAgICBTdHJpbmcgc2hhZG93
VHJlZUVsZW1lbnROb2RlTmFtZSA9IHNoYWRvd1RyZWVFbGVtZW50LT5ub2RlTmFtZSgpOwogICAg
IFN0cmluZyBwYXJlbnROb2RlTmFtZSA9IGVsZW1lbnQtPnBhcmVudE5vZGUoKSA/IGVsZW1lbnQt
PnBhcmVudE5vZGUoKS0+bm9kZU5hbWUoKSA6ICJudWxsIjsKICAgICBTdHJpbmcgZmlyc3RDaGls
ZE5vZGVOYW1lID0gZWxlbWVudC0+Zmlyc3RDaGlsZCgpID8gZWxlbWVudC0+Zmlyc3RDaGlsZCgp
LT5ub2RlTmFtZSgpIDogIm51bGwiOwogCiAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkg
PCBkZXB0aDsgKytpKQogICAgICAgICB0ZXh0ICs9ICIgICI7CiAKLSAgICB0ZXh0ICs9IFN0cmlu
Zzo6Zm9ybWF0KCJTVkdFbGVtZW50SW5zdGFuY2UgdGhpcz0lcCwgKHBhcmVudE5vZGU9JXMgKCVw
KSwgZmlyc3RDaGlsZD0lcyAoJXApLCBjb3JyZXNwb25kaW5nRWxlbWVudD0lcyAoJXApLCBkaXJl
Y3RVc2VFbGVtZW50PSVzICglcCksIHNoYWRvd1RyZWVFbGVtZW50PSVzICglcCksIGlkPSVzKVxu
IiwKKyAgICB0ZXh0ICs9IFN0cmluZzo6Zm9ybWF0KCJTVkdFbGVtZW50SW5zdGFuY2UgdGhpcz0l
cCwgKHBhcmVudE5vZGU9JXMgKCVwKSwgZmlyc3RDaGlsZD0lcyAoJXApLCBjb3JyZXNwb25kaW5n
RWxlbWVudD0lcyAoJXApLCBkaXJlY3RVc2VFbGVtZW50PSVzICglcCksIGlkPSVzKVxuIiwKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEluc3RhbmNlLCBwYXJlbnROb2RlTmFtZS5s
YXRpbjEoKS5kYXRhKCksIGVsZW1lbnQtPnBhcmVudE5vZGUoKSwgZmlyc3RDaGlsZE5vZGVOYW1l
LmxhdGluMSgpLmRhdGEoKSwgZWxlbWVudC0+Zmlyc3RDaGlsZCgpLAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZWxlbWVudE5vZGVOYW1lLmxhdGluMSgpLmRhdGEoKSwgZWxlbWVudCwgZGly
ZWN0VXNlRWxlbWVudE5hbWUubGF0aW4xKCkuZGF0YSgpLCBkaXJlY3RVc2VFbGVtZW50LCBzaGFk
b3dUcmVlRWxlbWVudE5vZGVOYW1lLmxhdGluMSgpLmRhdGEoKSwgc2hhZG93VHJlZUVsZW1lbnQs
IGVsZW1lbnRJZC5sYXRpbjEoKS5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZWxlbWVudE5vZGVOYW1lLmxhdGluMSgpLmRhdGEoKSwgZWxlbWVudCwgZGlyZWN0VXNlRWxlbWVu
dE5hbWUubGF0aW4xKCkuZGF0YSgpLCBkaXJlY3RVc2VFbGVtZW50LCBlbGVtZW50SWQubGF0aW4x
KCkuZGF0YSgpKTsKIAogICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgZGVwdGg7ICsr
aSkKICAgICAgICAgdGV4dCArPSAiICAiOwpAQCAtNDE1LDggKzIwNSw3IEBAIHZvaWQgZHVtcElu
c3RhbmNlVHJlZSh1bnNpZ25lZCBpbnQmIGRlcHQKICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQg
aSA9IDA7IGkgPCBkZXB0aDsgKytpKQogICAgICAgICAgICAgdGV4dCArPSAiICAiOwogCi0gICAg
ICAgIHRleHQgKz0gU3RyaW5nOjpmb3JtYXQoIiAtPiBTVkdFbGVtZW50SW5zdGFuY2UgdGhpcz0l
cCwgKHJlZkNvdW50OiAlaSwgc2hhZG93VHJlZUVsZW1lbnQgaW4gZG9jdW1lbnQ/ICVpKVxuIiwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaXQsICgqaXQpLT5yZWZDb3VudCgpLCAo
Kml0KS0+c2hhZG93VHJlZUVsZW1lbnQoKS0+aW5Eb2N1bWVudCgpKTsKKyAgICAgICAgdGV4dCAr
PSBTdHJpbmc6OmZvcm1hdCgiIC0+IFNWR0VsZW1lbnRJbnN0YW5jZSB0aGlzPSVwLCAocmVmQ291
bnQ6ICVpKVxuIiwgKml0LCAoKml0KS0+cmVmQ291bnQoKSk7CiAgICAgfQogCiAgICAgKytkZXB0
aDsKQEAgLTQzOCw4NiArMjI3LDI1IEBAIHN0YXRpYyBib29sIGlzRGlzYWxsb3dlZEVsZW1lbnQo
Tm9kZSogZWwKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBib29sIHN1YnRyZWVDb250
YWluc0Rpc2FsbG93ZWRFbGVtZW50KE5vZGUqIHN0YXJ0KQotewotICAgIGlmIChpc0Rpc2FsbG93
ZWRFbGVtZW50KHN0YXJ0KSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBmb3IgKE5vZGUq
IGN1ciA9IHN0YXJ0LT5maXJzdENoaWxkKCk7IGN1cjsgY3VyID0gY3VyLT5uZXh0U2libGluZygp
KSB7Ci0gICAgICAgIGlmIChzdWJ0cmVlQ29udGFpbnNEaXNhbGxvd2VkRWxlbWVudChjdXIpKQot
ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQot
CiB2b2lkIFNWR1VzZUVsZW1lbnQ6OmJ1aWxkUGVuZGluZ1Jlc291cmNlKCkKIHsKLSAgICAvLyBJ
ZiB3ZSdyZSBjYWxsZWQgdGhlIGZpcnN0IHRpbWUgKGR1cmluZyBzaGFkb3cgdHJlZSByb290IGNy
ZWF0aW9uIGZyb20gUmVuZGVyU1ZHU2hhZG93VHJlZVJvb3RDb250YWluZXIpCi0gICAgLy8gd2Ug
ZWl0aGVyIGRldGVybWluZSB0aGF0IG91ciB0YXJnZXQgaXMgYXZhaWxhYmxlIG9yIG5vdCAtIHRo
ZW4gd2UgYWRkIG91cnNlbHZlcyB0byB0aGUgcGVuZGluZyByZXNvdXJjZSBsaXN0Ci0gICAgLy8g
T25jZSB0aGUgcGVuZGluZyByZXNvdXJjZSBhcHBlYXJzLCBpdCB3aWxsIGNhbGwgYnVpbGRQZW5k
aW5nUmVzb3VyY2UoKSwgc28gd2UncmUgY2FsbGVkIGEgc2Vjb25kIHRpbWUuCisgICAgZnByaW50
ZihzdGRlcnIsICJ2b2lkIFNWR1VzZUVsZW1lbnQ6OmJ1aWxkUGVuZGluZ1Jlc291cmNlKCkgdGhp
cz0lcFxuIiwgdGhpcyk7CisKICAgICBTdHJpbmcgaWQ7CiAgICAgRWxlbWVudCogdGFyZ2V0RWxl
bWVudCA9IFNWR1VSSVJlZmVyZW5jZTo6dGFyZ2V0RWxlbWVudEZyb21JUklTdHJpbmcoaHJlZigp
LCBkb2N1bWVudCgpLCAmaWQpOwotICAgIEFTU0VSVCghbV90YXJnZXRFbGVtZW50SW5zdGFuY2Up
OwotCi0gICAgaWYgKCF0YXJnZXRFbGVtZW50KSB7Ci0gICAgICAgIGlmIChoYXNQZW5kaW5nUmVz
b3VyY2VzKCkgfHwgaWQuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAg
IG1fcmVzb3VyY2VJZCA9IGlkOwotICAgICAgICBBU1NFUlQoIWhhc1BlbmRpbmdSZXNvdXJjZXMo
KSk7Ci0gICAgICAgIGRvY3VtZW50KCktPmFjY2Vzc1NWR0V4dGVuc2lvbnMoKS0+YWRkUGVuZGlu
Z1Jlc291cmNlKGlkLCB0aGlzKTsKLSAgICAgICAgQVNTRVJUKGhhc1BlbmRpbmdSZXNvdXJjZXMo
KSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CiAKKyAgICBBU1NFUlRfVU5VU0VEKHRhcmdldEVs
ZW1lbnQsIHRhcmdldEVsZW1lbnQpOworICAgIEFTU0VSVCghbV90YXJnZXRFbGVtZW50SW5zdGFu
Y2UpOwogCi0gICAgaWYgKGhhc1BlbmRpbmdSZXNvdXJjZXMoKSkgewotICAgICAgICBBU1NFUlQo
IW1fdGFyZ2V0RWxlbWVudEluc3RhbmNlKTsKLSAgICAgICAgbV9yZXNvdXJjZUlkID0gU3RyaW5n
KCk7Ci0gICAgICAgIGludmFsaWRhdGVTaGFkb3dUcmVlKCk7Ci0gICAgfQorICAgIGlmIChSZW5k
ZXJPYmplY3QqIHJlbmRlcmVyID0gdGhpcy0+cmVuZGVyZXIoKSkKKyAgICAgICAgcmVuZGVyZXIt
PnVwZGF0ZUZyb21FbGVtZW50KCk7CiB9CiAKLXZvaWQgU1ZHVXNlRWxlbWVudDo6YnVpbGRTaGFk
b3dBbmRJbnN0YW5jZVRyZWUoU1ZHU2hhZG93VHJlZVJvb3RFbGVtZW50KiBzaGFkb3dSb290KQor
dm9pZCBTVkdVc2VFbGVtZW50OjpidWlsZEluc3RhbmNlVHJlZSgpCiB7Ci0gICAgc3RydWN0IFNo
YWRvd1RyZWVVcGRhdGVCbG9ja2VyIHsKLSAgICAgICAgU2hhZG93VHJlZVVwZGF0ZUJsb2NrZXIo
U1ZHVXNlRWxlbWVudCogY3VycmVudFVzZUVsZW1lbnQpCi0gICAgICAgICAgICA6IHVzZUVsZW1l
bnQoY3VycmVudFVzZUVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzZUVsZW1lbnQt
PnNldFVwZGF0ZXNCbG9ja2VkKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgflNoYWRvd1Ry
ZWVVcGRhdGVCbG9ja2VyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNlRWxlbWVudC0+c2V0
VXBkYXRlc0Jsb2NrZWQoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgU1ZHVXNlRWxlbWVu
dCogdXNlRWxlbWVudDsKLSAgICB9OwotCi0gICAgLy8gV2hlbiBjbG9uaW5nIHRoZSB0YXJnZXQg
bm9kZXMsIHRoZXkgbWF5IGRlY2lkZSB0byBzeW5jaHJvbml6ZSBzdHlsZSBhbmQvb3IgYW5pbWF0
ZWQgU1ZHIGF0dHJpYnV0ZXMuCi0gICAgLy8gVGhhdCBjYXVzZXMgY2FsbHMgdG8gU1ZHRWxlbWVu
dEluc3RhbmNlOjp1cGRhdGVBbGxJbnN0YW5jZXNPZkVsZW1lbnQoKSwgd2hpY2ggbWFyayB0aGUg
c2hhZG93IHRyZWUgZm9yIHJlY3JlYXRpb24uCi0gICAgLy8gU29sdXRpb246IGJsb2NrIGFueSB1
cGRhdGVzIHRvIHRoZSBzaGFkb3cgdHJlZSB3aGlsZSB3ZSdyZSBidWlsZGluZyBpdC4KLSAgICBT
aGFkb3dUcmVlVXBkYXRlQmxvY2tlciBibG9ja2VyKHRoaXMpOwotCiAgICAgRWxlbWVudCogdGFy
Z2V0RWxlbWVudCA9IFNWR1VSSVJlZmVyZW5jZTo6dGFyZ2V0RWxlbWVudEZyb21JUklTdHJpbmco
aHJlZigpLCBkb2N1bWVudCgpKTsKLSAgICBpZiAoIXRhcmdldEVsZW1lbnQpIHsKLSAgICAgICAg
Ly8gVGhlIG9ubHkgdGltZSB3ZSBzaG91bGQgZ2V0IGhlcmUgaXMgd2hlbiB0aGUgdXNlIGVsZW1l
bnQgaGFzIG5vdCBiZWVuCi0gICAgICAgIC8vIGdpdmVuIGEgcmVzb3VyY2UgdG8gdGFyZ2V0Lgot
ICAgICAgICBBU1NFUlQobV9yZXNvdXJjZUlkLmlzRW1wdHkoKSk7CisgICAgaWYgKCF0YXJnZXRF
bGVtZW50KQogICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gRG8gbm90IGJ1aWxkIHRo
ZSBzaGFkb3cvaW5zdGFuY2UgdHJlZSBmb3IgPHVzZT4gZWxlbWVudHMgbGl2aW5nIGluIGEgc2hh
ZG93IHRyZWUuCi0gICAgLy8gVGhlIHdpbGwgYmUgZXhwYW5kZWQgc29vbiBhbnl3YXkgLSBzZWUg
ZXhwYW5kVXNlRWxlbWVudHNJblNoYWRvd1RyZWUoKS4KLSAgICBDb250YWluZXJOb2RlKiBwYXJl
bnQgPSBwYXJlbnROb2RlKCk7Ci0gICAgd2hpbGUgKHBhcmVudCkgewotICAgICAgICBpZiAocGFy
ZW50LT5pc1NWR1NoYWRvd1Jvb3QoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBw
YXJlbnQgPSBwYXJlbnQtPnBhcmVudE5vZGVHdWFyYW50ZWVkSG9zdEZyZWUoKTsKLSAgICB9CiAK
ICAgICBTVkdFbGVtZW50KiB0YXJnZXQgPSAwOwogICAgIGlmICh0YXJnZXRFbGVtZW50ICYmIHRh
cmdldEVsZW1lbnQtPmlzU1ZHRWxlbWVudCgpKQpAQCAtNTU1LDQ5ICsyODMsMTAgQEAgdm9pZCBT
VkdVc2VFbGVtZW50OjpidWlsZFNoYWRvd0FuZEluc3RhbgogCiAgICAgLy8gQXNzdXJlIGluc3Rh
bmNlIHRyZWUgYnVpbGRpbmcgd2FzIHN1Y2Nlc3NmdWxsCiAgICAgQVNTRVJUKG1fdGFyZ2V0RWxl
bWVudEluc3RhbmNlKTsKLSAgICBBU1NFUlQoIW1fdGFyZ2V0RWxlbWVudEluc3RhbmNlLT5zaGFk
b3dUcmVlRWxlbWVudCgpKTsKICAgICBBU1NFUlQobV90YXJnZXRFbGVtZW50SW5zdGFuY2UtPmNv
cnJlc3BvbmRpbmdVc2VFbGVtZW50KCkgPT0gdGhpcyk7CiAgICAgQVNTRVJUKG1fdGFyZ2V0RWxl
bWVudEluc3RhbmNlLT5kaXJlY3RVc2VFbGVtZW50KCkgPT0gdGhpcyk7CiAgICAgQVNTRVJUKG1f
dGFyZ2V0RWxlbWVudEluc3RhbmNlLT5jb3JyZXNwb25kaW5nRWxlbWVudCgpID09IHRhcmdldCk7
CiAKLSAgICAvLyBCdWlsZCBzaGFkb3cgdHJlZSBmcm9tIGluc3RhbmNlIHRyZWUKLSAgICAvLyBU
aGlzIGFsc28gaGFuZGxlcyB0aGUgc3BlY2lhbCBjYXNlczogPHVzZT4gb24gPHN5bWJvbD4sIDx1
c2U+IG9uIDxzdmc+LgotICAgIGJ1aWxkU2hhZG93VHJlZShzaGFkb3dSb290LCB0YXJnZXQsIG1f
dGFyZ2V0RWxlbWVudEluc3RhbmNlLmdldCgpKTsKLQotICAgIC8vIEV4cGFuZCBhbGwgPHVzZT4g
ZWxlbWVudHMgaW4gdGhlIHNoYWRvdyB0cmVlLgotICAgIC8vIEV4cGFuZCBtZWFuczogcmVwbGFj
ZSB0aGUgYWN0dWFsIDx1c2U+IGVsZW1lbnQgYnkgd2hhdCBpdCByZWZlcmVuY2VzLgotICAgIGV4
cGFuZFVzZUVsZW1lbnRzSW5TaGFkb3dUcmVlKHNoYWRvd1Jvb3QpOwotCi0gICAgLy8gRXhwYW5k
IGFsbCA8c3ltYm9sPiBlbGVtZW50cyBpbiB0aGUgc2hhZG93IHRyZWUuCi0gICAgLy8gRXhwYW5k
IG1lYW5zOiByZXBsYWNlIHRoZSBhY3R1YWwgPHN5bWJvbD4gZWxlbWVudCBieSB0aGUgPHN2Zz4g
ZWxlbWVudC4KLSAgICBleHBhbmRTeW1ib2xFbGVtZW50c0luU2hhZG93VHJlZShzaGFkb3dSb290
KTsKLQotICAgIC8vIE5vdyB0aGF0IHRoZSBzaGFkb3cgdHJlZSBpcyBjb21wbGV0bHkgZXhwYW5k
ZWQsIHdlIGNhbiBhc3NvY2lhdGUKLSAgICAvLyBzaGFkb3cgdHJlZSBlbGVtZW50cyA8LT4gaW5z
dGFuY2VzIGluIHRoZSBpbnN0YW5jZSB0cmVlLgotICAgIGFzc29jaWF0ZUluc3RhbmNlc1dpdGhT
aGFkb3dUcmVlRWxlbWVudHMoc2hhZG93Um9vdC0+Zmlyc3RDaGlsZCgpLCBtX3RhcmdldEVsZW1l
bnRJbnN0YW5jZS5nZXQoKSk7Ci0KLSAgICAvLyBJZiBubyBzaGFkb3cgdHJlZSBlbGVtZW50IGlz
IHByZXNlbnQsIHRoaXMgbWVhbnMgdGhhdCB0aGUgcmVmZXJlbmNlIHJvb3QKLSAgICAvLyBlbGVt
ZW50IHdhcyByZW1vdmVkLCBhcyBpdCBpcyBkaXNhbGxvd2VkIChpZS4gPHVzZT4gb24gPGZvcmVp
Z25PYmplY3Q+KQotICAgIC8vIERvIE5PVCBsZWF2ZSBhbiBpbmNvbnNpc3RlbnQgaW5zdGFuY2Ug
dHJlZSBhcm91bmQsIGluc3RlYWQgZGVzdHJ1Y3QgaXQuCi0gICAgaWYgKCFtX3RhcmdldEVsZW1l
bnRJbnN0YW5jZS0+c2hhZG93VHJlZUVsZW1lbnQoKSkgewotICAgICAgICBzaGFkb3dSb290LT5y
ZW1vdmVBbGxDaGlsZHJlbigpOwotICAgICAgICBkZXRhY2hJbnN0YW5jZSgpOwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQ29uc2lzdGVuY3kgY2hlY2tzIC0gdGhpcyBpcyBhc3N1
bWVkIGluIHVwZGF0ZUNvbnRhaW5lck9mZnNldCgpLgotICAgIEFTU0VSVChtX3RhcmdldEVsZW1l
bnRJbnN0YW5jZS0+c2hhZG93VHJlZUVsZW1lbnQoKS0+cGFyZW50Tm9kZSgpID09IHNoYWRvd1Jv
b3QpOwotCi0gICAgLy8gVHJhbnNmZXIgZXZlbnQgbGlzdGVuZXJzIGFzc2lnbmVkIHRvIHRoZSBy
ZWZlcmVuY2VkIGVsZW1lbnQgdG8gb3VyIHNoYWRvdyB0cmVlIGVsZW1lbnRzLgotICAgIHRyYW5z
ZmVyRXZlbnRMaXN0ZW5lcnNUb1NoYWRvd1RyZWUobV90YXJnZXRFbGVtZW50SW5zdGFuY2UuZ2V0
KCkpOwotCi0gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBvZmZzZXQvc2l6ZQotICAgIHVwZGF0ZUNv
bnRhaW5lck9mZnNldHMoKTsKLSAgICB1cGRhdGVDb250YWluZXJTaXplcygpOwotCi0gICAgLy8g
VXBkYXRlIHJlbGF0aXZlIGxlbmd0aCBpbmZvcm1hdGlvbgotICAgIHVwZGF0ZVJlbGF0aXZlTGVu
Z3Roc0luZm9ybWF0aW9uKCk7Ci0KICAgICAvLyBFdmVudHVhbGx5IGR1bXAgaW5zdGFuY2UgdHJl
ZQogI2lmZGVmIERVTVBfSU5TVEFOQ0VfVFJFRQogICAgIFN0cmluZyB0ZXh0OwpAQCAtNjA2LDE4
ICsyOTUsNiBAQCB2b2lkIFNWR1VzZUVsZW1lbnQ6OmJ1aWxkU2hhZG93QW5kSW5zdGFuCiAgICAg
ZHVtcEluc3RhbmNlVHJlZShkZXB0aCwgdGV4dCwgbV90YXJnZXRFbGVtZW50SW5zdGFuY2UuZ2V0
KCkpOwogICAgIGZwcmludGYoc3RkZXJyLCAiXG5EdW1waW5nIDx1c2U+IGluc3RhbmNlIHRyZWU6
XG4lc1xuIiwgdGV4dC5sYXRpbjEoKS5kYXRhKCkpOwogI2VuZGlmCi0KLSAgICAvLyBFdmVudHVh
bGx5IGR1bXAgc2hhZG93IHRyZWUKLSNpZmRlZiBEVU1QX1NIQURPV19UUkVFCi0gICAgRXhjZXB0
aW9uQ29kZSBlYyA9IDA7Ci0KLSAgICBSZWZQdHI8WE1MU2VyaWFsaXplcj4gc2VyaWFsaXplciA9
IFhNTFNlcmlhbGl6ZXI6OmNyZWF0ZSgpOwotCi0gICAgU3RyaW5nIG1hcmt1cCA9IHNlcmlhbGl6
ZXItPnNlcmlhbGl6ZVRvU3RyaW5nKHNoYWRvd1Jvb3QsIGVjKTsKLSAgICBBU1NFUlQoIWVjKTsK
LQotICAgIGZwcmludGYoc3RkZXJyLCAiRHVtcGluZyA8dXNlPiBzaGFkb3cgdHJlZSBtYXJrdXA6
XG4lc1xuIiwgbWFya3VwLmxhdGluMSgpLmRhdGEoKSk7Ci0jZW5kaWYKIH0KIAogdm9pZCBTVkdV
c2VFbGVtZW50OjpkZXRhY2hJbnN0YW5jZSgpCkBAIC02MzEsMjEgKzMwOCw3IEBAIHZvaWQgU1ZH
VXNlRWxlbWVudDo6ZGV0YWNoSW5zdGFuY2UoKQogCiBSZW5kZXJPYmplY3QqIFNWR1VzZUVsZW1l
bnQ6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiBhcmVuYSwgUmVuZGVyU3R5bGUqKQogewot
ICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJTVkdTaGFkb3dUcmVlUm9vdENvbnRhaW5lcih0
aGlzKTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlRnJvbUVsZW1lbnRDYWxsYmFjayhOb2RlKiBu
b2RlLCB1bnNpZ25lZCkKLXsKLSAgICBpZiAoUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUt
PnJlbmRlcmVyKCkpCi0gICAgICAgIHJlbmRlcmVyLT51cGRhdGVGcm9tRWxlbWVudCgpOwotfQot
Ci12b2lkIFNWR1VzZUVsZW1lbnQ6OmF0dGFjaCgpCi17Ci0gICAgU1ZHU3R5bGVkVHJhbnNmb3Jt
YWJsZUVsZW1lbnQ6OmF0dGFjaCgpOwotCi0gICAgaWYgKHJlbmRlcmVyKCkpCi0gICAgICAgIHF1
ZXVlUG9zdEF0dGFjaENhbGxiYWNrKHVwZGF0ZUZyb21FbGVtZW50Q2FsbGJhY2ssIHRoaXMpOwor
ICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJTVkdEdXBsaWNhdGUodGhpcyk7CiB9CiAKIHZv
aWQgU1ZHVXNlRWxlbWVudDo6ZGV0YWNoKCkKQEAgLTY2OSwyNSArMzMyLDI3IEBAIHZvaWQgU1ZH
VXNlRWxlbWVudDo6dG9DbGlwUGF0aChQYXRoJiBwYXQKIHsKICAgICBBU1NFUlQocGF0aC5pc0Vt
cHR5KCkpOwogCi0gICAgTm9kZSogbiA9IG1fdGFyZ2V0RWxlbWVudEluc3RhbmNlID8gbV90YXJn
ZXRFbGVtZW50SW5zdGFuY2UtPnNoYWRvd1RyZWVFbGVtZW50KCkgOiAwOwotICAgIGlmICghbikK
KyAgICBOb2RlKiBuID0gbV90YXJnZXRFbGVtZW50SW5zdGFuY2UgPyBtX3RhcmdldEVsZW1lbnRJ
bnN0YW5jZS0+Y29ycmVzcG9uZGluZ0VsZW1lbnQoKSA6IDA7CisgICAgaWYgKCFuIHx8ICFuLT5p
c1NWR0VsZW1lbnQoKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgaWYgKG4tPmlzU1ZHRWxlbWVu
dCgpICYmIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihuKS0+aXNTdHlsZWRUcmFuc2Zvcm1hYmxl
KCkpIHsKLSAgICAgICAgaWYgKCFpc0RpcmVjdFJlZmVyZW5jZShuKSkKLSAgICAgICAgICAgIC8v
IFNwZWM6IEluZGlyZWN0IHJlZmVyZW5jZXMgYXJlIGFuIGVycm9yICgxNC4zLjUpCi0gICAgICAg
ICAgICBkb2N1bWVudCgpLT5hY2Nlc3NTVkdFeHRlbnNpb25zKCktPnJlcG9ydEVycm9yKCJOb3Qg
YWxsb3dlZCB0byB1c2UgaW5kaXJlY3QgcmVmZXJlbmNlIGluIDxjbGlwLXBhdGg+Iik7Ci0gICAg
ICAgIGVsc2UgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U1ZHU3R5bGVkVHJhbnNmb3JtYWJs
ZUVsZW1lbnQqPihuKS0+dG9DbGlwUGF0aChwYXRoKTsKLSAgICAgICAgICAgIHBhdGgudHJhbnNs
YXRlKEZsb2F0U2l6ZSh4KCkudmFsdWUodGhpcyksIHkoKS52YWx1ZSh0aGlzKSkpOwotICAgICAg
ICAgICAgcGF0aC50cmFuc2Zvcm0oYW5pbWF0ZWRMb2NhbFRyYW5zZm9ybSgpKTsKLSAgICAgICAg
fQorICAgIGlmICghc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KG4pLT5pc1N0eWxlZFRyYW5zZm9y
bWFibGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFpc0RpcmVjdFJlZmVyZW5jZShu
KSkgeworICAgICAgICAvLyBTcGVjOiBJbmRpcmVjdCByZWZlcmVuY2VzIGFyZSBhbiBlcnJvciAo
MTQuMy41KQorICAgICAgICBkb2N1bWVudCgpLT5hY2Nlc3NTVkdFeHRlbnNpb25zKCktPnJlcG9y
dEVycm9yKCJOb3QgYWxsb3dlZCB0byB1c2UgaW5kaXJlY3QgcmVmZXJlbmNlIGluIDxjbGlwLXBh
dGg+Iik7CisgICAgICAgIHJldHVybjsKICAgICB9CisKKyAgICBzdGF0aWNfY2FzdDxTVkdTdHls
ZWRUcmFuc2Zvcm1hYmxlRWxlbWVudCo+KG4pLT50b0NsaXBQYXRoKHBhdGgpOworICAgIHBhdGgu
dHJhbnNsYXRlKEZsb2F0U2l6ZSh4KCkudmFsdWUodGhpcyksIHkoKS52YWx1ZSh0aGlzKSkpOwor
ICAgIHBhdGgudHJhbnNmb3JtKGFuaW1hdGVkTG9jYWxUcmFuc2Zvcm0oKSk7CiB9CiAKIFJlbmRl
ck9iamVjdCogU1ZHVXNlRWxlbWVudDo6cmVuZGVyZXJDbGlwQ2hpbGQoKSBjb25zdAogewotICAg
IE5vZGUqIG4gPSBtX3RhcmdldEVsZW1lbnRJbnN0YW5jZSA/IG1fdGFyZ2V0RWxlbWVudEluc3Rh
bmNlLT5zaGFkb3dUcmVlRWxlbWVudCgpIDogMDsKKyAgICBOb2RlKiBuID0gbV90YXJnZXRFbGVt
ZW50SW5zdGFuY2UgPyBtX3RhcmdldEVsZW1lbnRJbnN0YW5jZS0+Y29ycmVzcG9uZGluZ0VsZW1l
bnQoKSA6IDA7CiAgICAgaWYgKCFuKQogICAgICAgICByZXR1cm4gMDsKIApAQCAtNzc1LDI4MiAr
NDQwLDExIEBAIGJvb2wgU1ZHVXNlRWxlbWVudDo6aGFzQ3ljbGVVc2VSZWZlcmVuY2kKICAgICBy
ZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgU1ZHVXNlRWxlbWVudDo6cmVtb3ZlRGlzYWxsb3dlZEVs
ZW1lbnRzRnJvbVN1YnRyZWUoTm9kZSogc3VidHJlZSkKLXsKLSAgICBBU1NFUlQoIXN1YnRyZWUt
PmluRG9jdW1lbnQoKSk7Ci0gICAgRXhjZXB0aW9uQ29kZSBlYzsKLSAgICBOb2RlKiBub2RlID0g
c3VidHJlZS0+Zmlyc3RDaGlsZCgpOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChp
c0Rpc2FsbG93ZWRFbGVtZW50KG5vZGUpKSB7Ci0gICAgICAgICAgICBOb2RlKiBuZXh0ID0gbm9k
ZS0+dHJhdmVyc2VOZXh0U2libGluZyhzdWJ0cmVlKTsKLSAgICAgICAgICAgIC8vIFRoZSBzdWJ0
cmVlIGlzIG5vdCBpbiBkb2N1bWVudCBzbyB0aGlzIHdvbid0IGdlbmVyYXRlIGV2ZW50cyB0aGF0
IGNvdWxkIG11dGF0ZSB0aGUgdHJlZS4KLSAgICAgICAgICAgIG5vZGUtPnBhcmVudE5vZGUoKS0+
cmVtb3ZlQ2hpbGQobm9kZSwgZWMpOwotICAgICAgICAgICAgbm9kZSA9IG5leHQ7Ci0gICAgICAg
IH0gZWxzZQotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoc3VidHJl
ZSk7Ci0gICAgfQotfQotCi12b2lkIFNWR1VzZUVsZW1lbnQ6OmJ1aWxkU2hhZG93VHJlZShTVkdT
aGFkb3dUcmVlUm9vdEVsZW1lbnQqIHNoYWRvd1Jvb3QsIFNWR0VsZW1lbnQqIHRhcmdldCwgU1ZH
RWxlbWVudEluc3RhbmNlKiB0YXJnZXRJbnN0YW5jZSkKLXsKLSAgICAvLyBGb3IgaW5zdGFuY2Ug
PHVzZT4gb24gPGZvcmVpZ25PYmplY3Q+IChkaXJlY3QgY2FzZSkuCi0gICAgaWYgKGlzRGlzYWxs
b3dlZEVsZW1lbnQodGFyZ2V0KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUmVmUHRyPEVsZW1l
bnQ+IG5ld0NoaWxkID0gdGFyZ2V0SW5zdGFuY2UtPmNvcnJlc3BvbmRpbmdFbGVtZW50KCktPmNs
b25lRWxlbWVudFdpdGhDaGlsZHJlbigpOwotCi0gICAgLy8gV2UgZG9uJ3Qgd2FsayB0aGUgdGFy
Z2V0IHRyZWUgZWxlbWVudC1ieS1lbGVtZW50LCBhbmQgY2xvbmUgZWFjaCBlbGVtZW50LAotICAg
IC8vIGJ1dCBpbnN0ZWFkIHVzZSBjbG9uZUVsZW1lbnRXaXRoQ2hpbGRyZW4oKS4gVGhpcyBpcyBh
biBvcHRpbWl6YXRpb24gZm9yIHRoZSBjb21tb24KLSAgICAvLyBjYXNlIHdoZXJlIDx1c2U+IGRv
ZXNuJ3QgY29udGFpbiBkaXNhbGxvd2VkIGVsZW1lbnRzIChpZS4gPGZvcmVpZ25PYmplY3Q+KS4K
LSAgICAvLyBUaG91Z2ggaWYgdGhlcmUgYXJlIGRpc2FsbG93ZWQgZWxlbWVudHMgaW4gdGhlIHN1
YnRyZWUsIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZW0uCi0gICAgLy8gRm9yIGluc3RhbmNlOiA8dXNl
PiBvbiA8Zz4gY29udGFpbmluZyA8Zm9yZWlnbk9iamVjdD4gKGluZGlyZWN0IGNhc2UpLgotICAg
IGlmIChzdWJ0cmVlQ29udGFpbnNEaXNhbGxvd2VkRWxlbWVudChuZXdDaGlsZC5nZXQoKSkpCi0g
ICAgICAgIHJlbW92ZURpc2FsbG93ZWRFbGVtZW50c0Zyb21TdWJ0cmVlKG5ld0NoaWxkLmdldCgp
KTsKLQotICAgIFNWR0VsZW1lbnQqIG5ld0NoaWxkUHRyID0gMDsKLSAgICBpZiAobmV3Q2hpbGQt
PmlzU1ZHRWxlbWVudCgpKQotICAgICAgICBuZXdDaGlsZFB0ciA9IHN0YXRpY19jYXN0PFNWR0Vs
ZW1lbnQqPihuZXdDaGlsZC5nZXQoKSk7Ci0gICAgQVNTRVJUX1VOVVNFRChuZXdDaGlsZFB0ciwg
bmV3Q2hpbGRQdHIpOwotCi0gICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgc2hhZG93Um9v
dC0+YXBwZW5kQ2hpbGQobmV3Q2hpbGQucmVsZWFzZSgpLCBlYyk7Ci0gICAgQVNTRVJUKCFlYyk7
Ci19Ci0KLXZvaWQgU1ZHVXNlRWxlbWVudDo6ZXhwYW5kVXNlRWxlbWVudHNJblNoYWRvd1RyZWUo
Tm9kZSogZWxlbWVudCkKLXsKLSAgICAvLyBXaHkgZXhwYW5kIHRoZSA8dXNlPiBlbGVtZW50cyBp
biB0aGUgc2hhZG93IHRyZWUgaGVyZSwgYW5kIG5vdCBqdXN0Ci0gICAgLy8gZG8gdGhpcyBkaXJl
Y3RseSBpbiBidWlsZFNoYWRvd1RyZWUsIGlmIHdlIGVuY291bnRlciBhIDx1c2U+IGVsZW1lbnQ/
Ci0gICAgLy8KLSAgICAvLyBTaG9ydCBhbnN3ZXI6IEJlY2F1c2Ugd2UgbWF5IG1pc3MgdG8gZXhw
YW5kIHNvbWUgZWxlbWVudHMuIEllLiBpZiBhIDxzeW1ib2w+Ci0gICAgLy8gY29udGFpbnMgPHVz
ZT4gdGFncywgd2UnZCBtaXNzIHRoZW0uIFNvIG9uY2Ugd2UncmUgZG9uZSB3aXRoIHNldHRpbicg
dXAgdGhlCi0gICAgLy8gYWN0dWFsIHNoYWRvdyB0cmVlIChhZnRlciB0aGUgc3BlY2lhbCBjYXNl
IG1vZGlmaWNhdGlvbiBmb3Igc3ZnL3N5bWJvbCkgd2UgaGF2ZQotICAgIC8vIHRvIHdhbGsgaXQg
Y29tcGxldGVseSBhbmQgZXhwYW5kIGFsbCA8dXNlPiBlbGVtZW50cy4KLSAgICBpZiAoZWxlbWVu
dC0+aGFzVGFnTmFtZShTVkdOYW1lczo6dXNlVGFnKSkgewotICAgICAgICBTVkdVc2VFbGVtZW50
KiB1c2UgPSBzdGF0aWNfY2FzdDxTVkdVc2VFbGVtZW50Kj4oZWxlbWVudCk7Ci0KLSAgICAgICAg
RWxlbWVudCogdGFyZ2V0RWxlbWVudCA9IFNWR1VSSVJlZmVyZW5jZTo6dGFyZ2V0RWxlbWVudEZy
b21JUklTdHJpbmcodXNlLT5ocmVmKCksIGRvY3VtZW50KCkpOwotICAgICAgICBTVkdFbGVtZW50
KiB0YXJnZXQgPSAwOwotICAgICAgICBpZiAodGFyZ2V0RWxlbWVudCAmJiB0YXJnZXRFbGVtZW50
LT5pc1NWR0VsZW1lbnQoKSkKLSAgICAgICAgICAgIHRhcmdldCA9IHN0YXRpY19jYXN0PFNWR0Vs
ZW1lbnQqPih0YXJnZXRFbGVtZW50KTsKLQotICAgICAgICAvLyBEb24ndCBBU1NFUlQodGFyZ2V0
KSBoZXJlLCBpdCBtYXkgYmUgInBlbmRpbmciLCB0b28uCi0gICAgICAgIC8vIFNldHVwIHN1Yi1z
aGFkb3cgdHJlZSByb290IG5vZGUKLSAgICAgICAgUmVmUHRyPFNWR1NoYWRvd1RyZWVDb250YWlu
ZXJFbGVtZW50PiBjbG9uZVBhcmVudCA9IFNWR1NoYWRvd1RyZWVDb250YWluZXJFbGVtZW50Ojpj
cmVhdGUoZG9jdW1lbnQoKSk7Ci0gICAgICAgIHVzZS0+Y2xvbmVDaGlsZE5vZGVzKGNsb25lUGFy
ZW50LmdldCgpKTsKLQotICAgICAgICAvLyBTcGVjOiBJbiB0aGUgZ2VuZXJhdGVkIGNvbnRlbnQs
IHRoZSAndXNlJyB3aWxsIGJlIHJlcGxhY2VkIGJ5ICdnJywgd2hlcmUgYWxsIGF0dHJpYnV0ZXMg
ZnJvbSB0aGUKLSAgICAgICAgLy8gJ3VzZScgZWxlbWVudCBleGNlcHQgZm9yIHgsIHksIHdpZHRo
LCBoZWlnaHQgYW5kIHhsaW5rOmhyZWYgYXJlIHRyYW5zZmVycmVkIHRvIHRoZSBnZW5lcmF0ZWQg
J2cnIGVsZW1lbnQuCi0gICAgICAgIHRyYW5zZmVyVXNlQXR0cmlidXRlc1RvUmVwbGFjZWRFbGVt
ZW50KHVzZSwgY2xvbmVQYXJlbnQuZ2V0KCkpOwotCi0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMg
PSAwOwotICAgICAgICBpZiAodGFyZ2V0ICYmICFpc0Rpc2FsbG93ZWRFbGVtZW50KHRhcmdldCkp
IHsKLSAgICAgICAgICAgIFJlZlB0cjxFbGVtZW50PiBuZXdDaGlsZCA9IHRhcmdldC0+Y2xvbmVF
bGVtZW50V2l0aENoaWxkcmVuKCk7Ci0KLSAgICAgICAgICAgIFNWR0VsZW1lbnQqIG5ld0NoaWxk
UHRyID0gMDsKLSAgICAgICAgICAgIGlmIChuZXdDaGlsZC0+aXNTVkdFbGVtZW50KCkpCi0gICAg
ICAgICAgICAgICAgbmV3Q2hpbGRQdHIgPSBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4obmV3Q2hp
bGQuZ2V0KCkpOwotICAgICAgICAgICAgQVNTRVJUX1VOVVNFRChuZXdDaGlsZFB0ciwgbmV3Q2hp
bGRQdHIpOwotCi0gICAgICAgICAgICBjbG9uZVBhcmVudC0+YXBwZW5kQ2hpbGQobmV3Q2hpbGQu
cmVsZWFzZSgpLCBlYyk7Ci0gICAgICAgICAgICBBU1NFUlQoIWVjKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIC8vIFdlIGRvbid0IHdhbGsgdGhlIHRhcmdldCB0cmVlIGVsZW1lbnQtYnktZWxlbWVu
dCwgYW5kIGNsb25lIGVhY2ggZWxlbWVudCwKLSAgICAgICAgLy8gYnV0IGluc3RlYWQgdXNlIGNs
b25lRWxlbWVudFdpdGhDaGlsZHJlbigpLiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBmb3IgdGhl
IGNvbW1vbgotICAgICAgICAvLyBjYXNlIHdoZXJlIDx1c2U+IGRvZXNuJ3QgY29udGFpbiBkaXNh
bGxvd2VkIGVsZW1lbnRzIChpZS4gPGZvcmVpZ25PYmplY3Q+KS4KLSAgICAgICAgLy8gVGhvdWdo
IGlmIHRoZXJlIGFyZSBkaXNhbGxvd2VkIGVsZW1lbnRzIGluIHRoZSBzdWJ0cmVlLCB3ZSBoYXZl
IHRvIHJlbW92ZSB0aGVtLgotICAgICAgICAvLyBGb3IgaW5zdGFuY2U6IDx1c2U+IG9uIDxnPiBj
b250YWluaW5nIDxmb3JlaWduT2JqZWN0PiAoaW5kaXJlY3QgY2FzZSkuCi0gICAgICAgIGlmIChz
dWJ0cmVlQ29udGFpbnNEaXNhbGxvd2VkRWxlbWVudChjbG9uZVBhcmVudC5nZXQoKSkpCi0gICAg
ICAgICAgICByZW1vdmVEaXNhbGxvd2VkRWxlbWVudHNGcm9tU3VidHJlZShjbG9uZVBhcmVudC5n
ZXQoKSk7Ci0KLSAgICAgICAgUmVmUHRyPE5vZGU+IHJlcGxhY2luZ0VsZW1lbnQoY2xvbmVQYXJl
bnQuZ2V0KCkpOwotCi0gICAgICAgIC8vIFJlcGxhY2UgPHVzZT4gd2l0aCByZWZlcmVuY2VkIGNv
bnRlbnQuCi0gICAgICAgIEFTU0VSVCh1c2UtPnBhcmVudE5vZGUoKSk7IAotICAgICAgICB1c2Ut
PnBhcmVudE5vZGUoKS0+cmVwbGFjZUNoaWxkKGNsb25lUGFyZW50LnJlbGVhc2UoKSwgdXNlLCBl
Yyk7Ci0gICAgICAgIEFTU0VSVCghZWMpOwotCi0gICAgICAgIC8vIEV4cGFuZCB0aGUgc2libGlu
Z3MgYmVjYXVzZSB0aGUgKmVsZW1lbnQqIGlzIHJlcGxhY2VkIGFuZCB3ZSB3aWxsCi0gICAgICAg
IC8vIGxvc2UgdGhlIHNpYmxpbmcgY2hhaW4gd2hlbiB3ZSBhcmUgYmFjayBmcm9tIHJlY3Vyc2lv
bi4KLSAgICAgICAgZWxlbWVudCA9IHJlcGxhY2luZ0VsZW1lbnQuZ2V0KCk7Ci0gICAgICAgIGZv
ciAoUmVmUHRyPE5vZGU+IHNpYmxpbmcgPSBlbGVtZW50LT5uZXh0U2libGluZygpOyBzaWJsaW5n
OyBzaWJsaW5nID0gc2libGluZy0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgIGV4cGFuZFVz
ZUVsZW1lbnRzSW5TaGFkb3dUcmVlKHNpYmxpbmcuZ2V0KCkpOwotICAgIH0KLQotICAgIGZvciAo
UmVmUHRyPE5vZGU+IGNoaWxkID0gZWxlbWVudC0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQg
PSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgZXhwYW5kVXNlRWxlbWVudHNJblNoYWRv
d1RyZWUoY2hpbGQuZ2V0KCkpOwotfQotCi12b2lkIFNWR1VzZUVsZW1lbnQ6OmV4cGFuZFN5bWJv
bEVsZW1lbnRzSW5TaGFkb3dUcmVlKE5vZGUqIGVsZW1lbnQpCi17Ci0gICAgaWYgKGVsZW1lbnQt
Pmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN5bWJvbFRhZykpIHsKLSAgICAgICAgLy8gU3BlYzogVGhl
IHJlZmVyZW5jZWQgJ3N5bWJvbCcgYW5kIGl0cyBjb250ZW50cyBhcmUgZGVlcC1jbG9uZWQgaW50
byB0aGUgZ2VuZXJhdGVkIHRyZWUsCi0gICAgICAgIC8vIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0
IHRoZSAnc3ltYm9sJyBpcyByZXBsYWNlZCBieSBhbiAnc3ZnJy4gVGhpcyBnZW5lcmF0ZWQgJ3N2
Zycgd2lsbAotICAgICAgICAvLyBhbHdheXMgaGF2ZSBleHBsaWNpdCB2YWx1ZXMgZm9yIGF0dHJp
YnV0ZXMgd2lkdGggYW5kIGhlaWdodC4gSWYgYXR0cmlidXRlcyB3aWR0aCBhbmQvb3IKLSAgICAg
ICAgLy8gaGVpZ2h0IGFyZSBwcm92aWRlZCBvbiB0aGUgJ3VzZScgZWxlbWVudCwgdGhlbiB0aGVz
ZSBhdHRyaWJ1dGVzIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8KLSAgICAgICAgLy8gdGhlIGdlbmVy
YXRlZCAnc3ZnJy4gSWYgYXR0cmlidXRlcyB3aWR0aCBhbmQvb3IgaGVpZ2h0IGFyZSBub3Qgc3Bl
Y2lmaWVkLCB0aGUgZ2VuZXJhdGVkCi0gICAgICAgIC8vICdzdmcnIGVsZW1lbnQgd2lsbCB1c2Ug
dmFsdWVzIG9mIDEwMCUgZm9yIHRoZXNlIGF0dHJpYnV0ZXMuCi0gICAgICAgIFJlZlB0cjxTVkdT
VkdFbGVtZW50PiBzdmdFbGVtZW50ID0gU1ZHU1ZHRWxlbWVudDo6Y3JlYXRlKFNWR05hbWVzOjpz
dmdUYWcsIGRvY3VtZW50KCkpOwotCi0gICAgICAgIC8vIFRyYW5zZmVyIGFsbCBhdHRyaWJ1dGVz
IGZyb20gPHN5bWJvbD4gdG8gdGhlIG5ldyA8c3ZnPiBlbGVtZW50Ci0gICAgICAgIHN2Z0VsZW1l
bnQtPmF0dHJpYnV0ZXMoKS0+c2V0QXR0cmlidXRlcygqZWxlbWVudC0+YXR0cmlidXRlcygpKTsK
LQotICAgICAgICAvLyBPbmx5IGNsb25lIHN5bWJvbCBjaGlsZHJlbiwgYW5kIGFkZCB0aGVtIHRv
IHRoZSBuZXcgPHN2Zz4gZWxlbWVudCAgICAKLSAgICAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7
Ci0gICAgICAgIGZvciAoTm9kZSogY2hpbGQgPSBlbGVtZW50LT5maXJzdENoaWxkKCk7IGNoaWxk
OyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICBSZWZQdHI8Tm9k
ZT4gbmV3Q2hpbGQgPSBjaGlsZC0+Y2xvbmVOb2RlKHRydWUpOwotICAgICAgICAgICAgc3ZnRWxl
bWVudC0+YXBwZW5kQ2hpbGQobmV3Q2hpbGQucmVsZWFzZSgpLCBlYyk7Ci0gICAgICAgICAgICBB
U1NFUlQoIWVjKTsKLSAgICAgICAgfQotICAgIAotICAgICAgICAvLyBXZSBkb24ndCB3YWxrIHRo
ZSB0YXJnZXQgdHJlZSBlbGVtZW50LWJ5LWVsZW1lbnQsIGFuZCBjbG9uZSBlYWNoIGVsZW1lbnQs
Ci0gICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHVzZSBjbG9uZU5vZGUoZGVlcD10cnVlKS4gVGhpcyBp
cyBhbiBvcHRpbWl6YXRpb24gZm9yIHRoZSBjb21tb24KLSAgICAgICAgLy8gY2FzZSB3aGVyZSA8
dXNlPiBkb2Vzbid0IGNvbnRhaW4gZGlzYWxsb3dlZCBlbGVtZW50cyAoaWUuIDxmb3JlaWduT2Jq
ZWN0PikuCi0gICAgICAgIC8vIFRob3VnaCBpZiB0aGVyZSBhcmUgZGlzYWxsb3dlZCBlbGVtZW50
cyBpbiB0aGUgc3VidHJlZSwgd2UgaGF2ZSB0byByZW1vdmUgdGhlbS4KLSAgICAgICAgLy8gRm9y
IGluc3RhbmNlOiA8dXNlPiBvbiA8Zz4gY29udGFpbmluZyA8Zm9yZWlnbk9iamVjdD4gKGluZGly
ZWN0IGNhc2UpLgotICAgICAgICBpZiAoc3VidHJlZUNvbnRhaW5zRGlzYWxsb3dlZEVsZW1lbnQo
c3ZnRWxlbWVudC5nZXQoKSkpCi0gICAgICAgICAgICByZW1vdmVEaXNhbGxvd2VkRWxlbWVudHNG
cm9tU3VidHJlZShzdmdFbGVtZW50LmdldCgpKTsKLQotICAgICAgICBSZWZQdHI8Tm9kZT4gcmVw
bGFjaW5nRWxlbWVudChzdmdFbGVtZW50LmdldCgpKTsKLQotICAgICAgICAvLyBSZXBsYWNlIDxz
eW1ib2w+IHdpdGggPHN2Zz4uCi0gICAgICAgIEFTU0VSVChlbGVtZW50LT5wYXJlbnROb2RlKCkp
OyAKLSAgICAgICAgZWxlbWVudC0+cGFyZW50Tm9kZSgpLT5yZXBsYWNlQ2hpbGQoc3ZnRWxlbWVu
dC5yZWxlYXNlKCksIGVsZW1lbnQsIGVjKTsKLSAgICAgICAgQVNTRVJUKCFlYyk7Ci0KLSAgICAg
ICAgLy8gRXhwYW5kIHRoZSBzaWJsaW5ncyBiZWNhdXNlIHRoZSAqZWxlbWVudCogaXMgcmVwbGFj
ZWQgYW5kIHdlIHdpbGwKLSAgICAgICAgLy8gbG9zZSB0aGUgc2libGluZyBjaGFpbiB3aGVuIHdl
IGFyZSBiYWNrIGZyb20gcmVjdXJzaW9uLgotICAgICAgICBlbGVtZW50ID0gcmVwbGFjaW5nRWxl
bWVudC5nZXQoKTsKLSAgICAgICAgZm9yIChSZWZQdHI8Tm9kZT4gc2libGluZyA9IGVsZW1lbnQt
Pm5leHRTaWJsaW5nKCk7IHNpYmxpbmc7IHNpYmxpbmcgPSBzaWJsaW5nLT5uZXh0U2libGluZygp
KQotICAgICAgICAgICAgZXhwYW5kU3ltYm9sRWxlbWVudHNJblNoYWRvd1RyZWUoc2libGluZy5n
ZXQoKSk7Ci0gICAgfQotCi0gICAgZm9yIChSZWZQdHI8Tm9kZT4gY2hpbGQgPSBlbGVtZW50LT5m
aXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKQotICAgICAg
ICBleHBhbmRTeW1ib2xFbGVtZW50c0luU2hhZG93VHJlZShjaGlsZC5nZXQoKSk7Ci19Ci0KLXZv
aWQgU1ZHVXNlRWxlbWVudDo6dHJhbnNmZXJFdmVudExpc3RlbmVyc1RvU2hhZG93VHJlZShTVkdF
bGVtZW50SW5zdGFuY2UqIHRhcmdldCkKLXsKLSAgICBpZiAoIXRhcmdldCkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgU1ZHRWxlbWVudCogb3JpZ2luYWxFbGVtZW50ID0gdGFyZ2V0LT5jb3JyZXNw
b25kaW5nRWxlbWVudCgpOwotICAgIEFTU0VSVChvcmlnaW5hbEVsZW1lbnQpOwotCi0gICAgaWYg
KFNWR0VsZW1lbnQqIHNoYWRvd1RyZWVFbGVtZW50ID0gdGFyZ2V0LT5zaGFkb3dUcmVlRWxlbWVu
dCgpKSB7Ci0gICAgICAgIGlmIChFdmVudFRhcmdldERhdGEqIGRhdGEgPSBvcmlnaW5hbEVsZW1l
bnQtPmV2ZW50VGFyZ2V0RGF0YSgpKQotICAgICAgICAgICAgZGF0YS0+ZXZlbnRMaXN0ZW5lck1h
cC5jb3B5RXZlbnRMaXN0ZW5lcnNOb3RDcmVhdGVkRnJvbU1hcmt1cFRvVGFyZ2V0KHNoYWRvd1Ry
ZWVFbGVtZW50KTsKLSAgICB9Ci0KLSAgICBmb3IgKFNWR0VsZW1lbnRJbnN0YW5jZSogaW5zdGFu
Y2UgPSB0YXJnZXQtPmZpcnN0Q2hpbGQoKTsgaW5zdGFuY2U7IGluc3RhbmNlID0gaW5zdGFuY2Ut
Pm5leHRTaWJsaW5nKCkpCi0gICAgICAgIHRyYW5zZmVyRXZlbnRMaXN0ZW5lcnNUb1NoYWRvd1Ry
ZWUoaW5zdGFuY2UpOwotfQotCi12b2lkIFNWR1VzZUVsZW1lbnQ6OmFzc29jaWF0ZUluc3RhbmNl
c1dpdGhTaGFkb3dUcmVlRWxlbWVudHMoTm9kZSogdGFyZ2V0LCBTVkdFbGVtZW50SW5zdGFuY2Uq
IHRhcmdldEluc3RhbmNlKQotewotICAgIGlmICghdGFyZ2V0IHx8ICF0YXJnZXRJbnN0YW5jZSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgU1ZHRWxlbWVudCogb3JpZ2luYWxFbGVtZW50ID0gdGFy
Z2V0SW5zdGFuY2UtPmNvcnJlc3BvbmRpbmdFbGVtZW50KCk7Ci0KLSAgICBpZiAob3JpZ2luYWxF
bGVtZW50LT5oYXNUYWdOYW1lKFNWR05hbWVzOjp1c2VUYWcpKSB7Ci0gICAgICAgIC8vIDx1c2U+
IGdldHMgcmVwbGFjZWQgYnkgPGc+Ci0gICAgICAgIEFTU0VSVCh0YXJnZXQtPm5vZGVOYW1lKCkg
PT0gU1ZHTmFtZXM6OmdUYWcpOwotICAgIH0gZWxzZSBpZiAob3JpZ2luYWxFbGVtZW50LT5oYXNU
YWdOYW1lKFNWR05hbWVzOjpzeW1ib2xUYWcpKSB7Ci0gICAgICAgIC8vIDxzeW1ib2w+IGdldHMg
cmVwbGFjZWQgYnkgPHN2Zz4KLSAgICAgICAgQVNTRVJUKHRhcmdldC0+bm9kZU5hbWUoKSA9PSBT
VkdOYW1lczo6c3ZnVGFnKTsKLSAgICB9IGVsc2UKLSAgICAgICAgQVNTRVJUKHRhcmdldC0+bm9k
ZU5hbWUoKSA9PSBvcmlnaW5hbEVsZW1lbnQtPm5vZGVOYW1lKCkpOwotCi0gICAgU1ZHRWxlbWVu
dCogZWxlbWVudCA9IDA7Ci0gICAgaWYgKHRhcmdldC0+aXNTVkdFbGVtZW50KCkpCi0gICAgICAg
IGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4odGFyZ2V0KTsKLQotICAgIEFTU0VS
VCghdGFyZ2V0SW5zdGFuY2UtPnNoYWRvd1RyZWVFbGVtZW50KCkpOwotICAgIHRhcmdldEluc3Rh
bmNlLT5zZXRTaGFkb3dUcmVlRWxlbWVudChlbGVtZW50KTsKLSAgICBlbGVtZW50LT5zZXRDb3Jy
ZXNwb25kaW5nRWxlbWVudChvcmlnaW5hbEVsZW1lbnQpOwotCi0gICAgTm9kZSogbm9kZSA9IHRh
cmdldC0+Zmlyc3RDaGlsZCgpOwotICAgIGZvciAoU1ZHRWxlbWVudEluc3RhbmNlKiBpbnN0YW5j
ZSA9IHRhcmdldEluc3RhbmNlLT5maXJzdENoaWxkKCk7IG5vZGUgJiYgaW5zdGFuY2U7IGluc3Rh
bmNlID0gaW5zdGFuY2UtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgLy8gU2tpcCBhbnkgbm9u
LXN2ZyBlbGVtZW50cyBpbiBzaGFkb3cgdHJlZQotICAgICAgICB3aGlsZSAobm9kZSAmJiAhbm9k
ZS0+aXNTVkdFbGVtZW50KCkpCi0gICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0U2libGluZygp
OwotCi0gICAgICAgIGlmICghbm9kZSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGFz
c29jaWF0ZUluc3RhbmNlc1dpdGhTaGFkb3dUcmVlRWxlbWVudHMobm9kZSwgaW5zdGFuY2UpOwot
ICAgICAgICBub2RlID0gbm9kZS0+bmV4dFNpYmxpbmcoKTsKLSAgICB9Ci19Ci0KLVNWR0VsZW1l
bnRJbnN0YW5jZSogU1ZHVXNlRWxlbWVudDo6aW5zdGFuY2VGb3JTaGFkb3dUcmVlRWxlbWVudChO
b2RlKiBlbGVtZW50KSBjb25zdAorU1ZHRWxlbWVudEluc3RhbmNlKiBTVkdVc2VFbGVtZW50Ojpp
bnN0YW5jZUZvclNoYWRvd1RyZWVFbGVtZW50KE5vZGUqIC8qZWxlbWVudCovKSBjb25zdAogewot
ICAgIGlmICghbV90YXJnZXRFbGVtZW50SW5zdGFuY2UpIHsKLSAgICAgICAgQVNTRVJUKCFpbkRv
Y3VtZW50KCkpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gaW5zdGFu
Y2VGb3JTaGFkb3dUcmVlRWxlbWVudChlbGVtZW50LCBtX3RhcmdldEVsZW1lbnRJbnN0YW5jZS5n
ZXQoKSk7Ci19Ci0KLVNWR0VsZW1lbnRJbnN0YW5jZSogU1ZHVXNlRWxlbWVudDo6aW5zdGFuY2VG
b3JTaGFkb3dUcmVlRWxlbWVudChOb2RlKiBlbGVtZW50LCBTVkdFbGVtZW50SW5zdGFuY2UqIGlu
c3RhbmNlKSBjb25zdAotewotICAgIEFTU0VSVChlbGVtZW50KTsKLSAgICBBU1NFUlQoaW5zdGFu
Y2UpOwotCi0gICAgLy8gV2UncmUgZGlzcGF0Y2hpbmcgYSBtdXRhdGlvbiBldmVudCBkdXJpbmcg
c2hhZG93IHRyZWUgY29uc3RydWN0aW9uCi0gICAgLy8gdGhpcyBpbnN0YW5jZSBoYXNuJ3QgeWV0
IGJlZW4gYXNzb2NpYXRlZCB0byBhIHNoYWRvd1RyZWUgZWxlbWVudC4KLSAgICBpZiAoIWluc3Rh
bmNlLT5zaGFkb3dUcmVlRWxlbWVudCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChl
bGVtZW50ID09IGluc3RhbmNlLT5zaGFkb3dUcmVlRWxlbWVudCgpKQotICAgICAgICByZXR1cm4g
aW5zdGFuY2U7Ci0KLSAgICBmb3IgKFNWR0VsZW1lbnRJbnN0YW5jZSogY3VycmVudCA9IGluc3Rh
bmNlLT5maXJzdENoaWxkKCk7IGN1cnJlbnQ7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0U2libGlu
ZygpKSB7Ci0gICAgICAgIGlmIChTVkdFbGVtZW50SW5zdGFuY2UqIHNlYXJjaCA9IGluc3RhbmNl
Rm9yU2hhZG93VHJlZUVsZW1lbnQoZWxlbWVudCwgY3VycmVudCkpCi0gICAgICAgICAgICByZXR1
cm4gc2VhcmNoOwotICAgIH0KLQogICAgIHJldHVybiAwOwogfQogCi12b2lkIFNWR1VzZUVsZW1l
bnQ6OmludmFsaWRhdGVTaGFkb3dUcmVlKCkKLXsKLSAgICAvLyBEb24ndCBtdXRhdGUgdGhlIHNo
YWRvdyB0cmVlIHdoaWxlIHdlJ3JlIGJ1aWxkaW5nIGl0LgotICAgIGlmIChtX3VwZGF0ZXNCbG9j
a2VkKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX25lZWRzU2hhZG93VHJlZVJlY3JlYXRpb24g
PSB0cnVlOwotICAgIHNldE5lZWRzU3R5bGVSZWNhbGMoKTsKLX0KLQotdm9pZCBTVkdVc2VFbGVt
ZW50Ojp0cmFuc2ZlclVzZUF0dHJpYnV0ZXNUb1JlcGxhY2VkRWxlbWVudChTVkdFbGVtZW50KiBm
cm9tLCBTVkdFbGVtZW50KiB0bykgY29uc3QKLXsKLSAgICBBU1NFUlQoZnJvbSk7Ci0gICAgQVNT
RVJUKHRvKTsKLQotICAgIHRvLT5hdHRyaWJ1dGVzKCktPnNldEF0dHJpYnV0ZXMoKmZyb20tPmF0
dHJpYnV0ZXMoKSk7Ci0KLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLQotICAgIHRvLT5yZW1v
dmVBdHRyaWJ1dGUoU1ZHTmFtZXM6OnhBdHRyLCBlYyk7Ci0gICAgQVNTRVJUKCFlYyk7Ci0KLSAg
ICB0by0+cmVtb3ZlQXR0cmlidXRlKFNWR05hbWVzOjp5QXR0ciwgZWMpOwotICAgIEFTU0VSVCgh
ZWMpOwotCi0gICAgdG8tPnJlbW92ZUF0dHJpYnV0ZShTVkdOYW1lczo6d2lkdGhBdHRyLCBlYyk7
Ci0gICAgQVNTRVJUKCFlYyk7Ci0KLSAgICB0by0+cmVtb3ZlQXR0cmlidXRlKFNWR05hbWVzOjpo
ZWlnaHRBdHRyLCBlYyk7Ci0gICAgQVNTRVJUKCFlYyk7Ci0KLSAgICB0by0+cmVtb3ZlQXR0cmli
dXRlKFhMaW5rTmFtZXM6OmhyZWZBdHRyLCBlYyk7Ci0gICAgQVNTRVJUKCFlYyk7Ci19Ci0KIGJv
b2wgU1ZHVXNlRWxlbWVudDo6c2VsZkhhc1JlbGF0aXZlTGVuZ3RocygpIGNvbnN0CiB7CiAgICAg
aWYgKHgoKS5pc1JlbGF0aXZlKCkKQEAgLTEwNjksNiArNDYzLDM0IEBAIGJvb2wgU1ZHVXNlRWxl
bWVudDo6c2VsZkhhc1JlbGF0aXZlTGVuZ3QKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U1ZHU3R5
bGVkRWxlbWVudCo+KGVsZW1lbnQpLT5oYXNSZWxhdGl2ZUxlbmd0aHMoKTsKIH0KIAorYm9vbCBT
VkdVc2VFbGVtZW50OjphZGRFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRU
eXBlLCBQYXNzUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyLCBib29sIHVzZUNhcHR1cmUp
Cit7CisgICAgcmV0dXJuIFNWR1N0eWxlZFRyYW5zZm9ybWFibGVFbGVtZW50OjphZGRFdmVudExp
c3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpOworICAgIC8qCisgICAgaWYg
KCFtX3RhcmdldEVsZW1lbnRJbnN0YW5jZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJl
dHVybiBtX3RhcmdldEVsZW1lbnRJbnN0YW5jZS0+YWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUs
IGxpc3RlbmVyLCB1c2VDYXB0dXJlKTsKKyAgICAqLworfQorCitib29sIFNWR1VzZUVsZW1lbnQ6
OnJlbW92ZUV2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUsIEV2ZW50
TGlzdGVuZXIqIGxpc3RlbmVyLCBib29sIHVzZUNhcHR1cmUpCit7CisgICAgcmV0dXJuIFNWR1N0
eWxlZFRyYW5zZm9ybWFibGVFbGVtZW50OjpyZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwg
bGlzdGVuZXIsIHVzZUNhcHR1cmUpOworICAgIC8qCisgICAgaWYgKCFtX3RhcmdldEVsZW1lbnRJ
bnN0YW5jZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBtX3RhcmdldEVsZW1l
bnRJbnN0YW5jZS0+cmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB1c2VD
YXB0dXJlKTsKKyAgICAqLworfQorCit2b2lkIFNWR1VzZUVsZW1lbnQ6OnJlbW92ZUFsbEV2ZW50
TGlzdGVuZXJzKCkKK3sKKyAgICBTVkdTdHlsZWRUcmFuc2Zvcm1hYmxlRWxlbWVudDo6cmVtb3Zl
QWxsRXZlbnRMaXN0ZW5lcnMoKTsKKyAgICAvKmlmICghbV90YXJnZXRFbGVtZW50SW5zdGFuY2Up
CisgICAgICAgIHJldHVybjsKKyAgICBtX3RhcmdldEVsZW1lbnRJbnN0YW5jZS0+cmVtb3ZlQWxs
RXZlbnRMaXN0ZW5lcnMoKTsqLworfQorCiB9CiAKICNlbmRpZiAvLyBFTkFCTEUoU1ZHKQpJbmRl
eDogU291cmNlL1dlYkNvcmUvc3ZnL1NWR1VzZUVsZW1lbnQuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9zdmcvU1ZHVXNlRWxlbWVudC5oCShyZXZpc2lvbiA5NjU3NSkKKysrIFNvdXJj
ZS9XZWJDb3JlL3N2Zy9TVkdVc2VFbGVtZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNiArMSw3
IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IE5p
a29sYXMgWmltbWVybWFubiA8emltbWVybWFubkBrZGUub3JnPgogICogQ29weXJpZ2h0IChDKSAy
MDA0LCAyMDA1LCAyMDA2LCAyMDA3IFJvYiBCdWlzIDxidWlzQGtkZS5vcmc+CisgKiBDb3B5cmln
aHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTEuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTE4LDggKzE5LDggQEAKICAqIEJvc3RvbiwgTUEg
MDIxMTAtMTMwMSwgVVNBLgogICovCiAKLSNpZm5kZWYgU1ZHVXNlRWxlbWVudF9oCi0jZGVmaW5l
IFNWR1VzZUVsZW1lbnRfaAorI2lmbmRlZiBOZXdTVkdVc2VFbGVtZW50X2gKKyNkZWZpbmUgTmV3
U1ZHVXNlRWxlbWVudF9oCiAKICNpZiBFTkFCTEUoU1ZHKQogI2luY2x1ZGUgIlNWR0FuaW1hdGVk
Qm9vbGVhbi5oIgpAQCAtMzMsNyArMzQsNiBAQAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFz
cyBTVkdFbGVtZW50SW5zdGFuY2U7Ci1jbGFzcyBTVkdTaGFkb3dUcmVlUm9vdEVsZW1lbnQ7CiAK
IGNsYXNzIFNWR1VzZUVsZW1lbnQgOiBwdWJsaWMgU1ZHU3R5bGVkVHJhbnNmb3JtYWJsZUVsZW1l
bnQsCiAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFNWR1Rlc3RzLApAQCAtNDYsOSArNDYs
OSBAQCBwdWJsaWM6CiAgICAgU1ZHRWxlbWVudEluc3RhbmNlKiBpbnN0YW5jZVJvb3QoKTsKICAg
ICBTVkdFbGVtZW50SW5zdGFuY2UqIGFuaW1hdGVkSW5zdGFuY2VSb290KCkgY29uc3Q7CiAgICAg
U1ZHRWxlbWVudEluc3RhbmNlKiBpbnN0YW5jZUZvclNoYWRvd1RyZWVFbGVtZW50KE5vZGUqKSBj
b25zdDsKLSAgICB2b2lkIGludmFsaWRhdGVTaGFkb3dUcmVlKCk7CiAKICAgICBSZW5kZXJPYmpl
Y3QqIHJlbmRlcmVyQ2xpcENoaWxkKCkgY29uc3Q7CisgICAgdm9pZCBidWlsZEluc3RhbmNlVHJl
ZSgpOwogCiBwcml2YXRlOgogICAgIFNWR1VzZUVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYs
IERvY3VtZW50Kik7CkBAIC01Niw1MyArNTYsMjkgQEAgcHJpdmF0ZToKICAgICB2aXJ0dWFsIGJv
b2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIFNWR1Rlc3RzOjppc1ZhbGlkKCk7IH0KICAgICB2
aXJ0dWFsIGJvb2wgc3VwcG9ydHNGb2N1cygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KIAotICAg
IHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9Eb2N1bWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCBy
ZW1vdmVkRnJvbURvY3VtZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIGJ1aWxkUGVuZGluZ1Jlc291
cmNlKCk7Ci0KICAgICBib29sIGlzU3VwcG9ydGVkQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5h
bWUmKTsKICAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoQXR0cmlidXRlKik7
CiAgICAgdmlydHVhbCB2b2lkIHN2Z0F0dHJpYnV0ZUNoYW5nZWQoY29uc3QgUXVhbGlmaWVkTmFt
ZSYpOwogCi0gICAgdmlydHVhbCBib29sIHdpbGxSZWNhbGNTdHlsZShTdHlsZUNoYW5nZSk7Ci0g
ICAgdmlydHVhbCB2b2lkIGRpZFJlY2FsY1N0eWxlKFN0eWxlQ2hhbmdlKTsKKyAgICB2aXJ0dWFs
IHZvaWQgaW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlZEZy
b21Eb2N1bWVudCgpOworICAgIHZpcnR1YWwgdm9pZCBidWlsZFBlbmRpbmdSZXNvdXJjZSgpOwog
CiAgICAgdmlydHVhbCBSZW5kZXJPYmplY3QqIGNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiwg
UmVuZGVyU3R5bGUqKTsKLSAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7CiAgICAgdmlydHVhbCB2
b2lkIGRldGFjaCgpOwogCiAgICAgdmlydHVhbCB2b2lkIHRvQ2xpcFBhdGgoUGF0aCYpOwogCi0g
ICAgc3RhdGljIHZvaWQgcmVtb3ZlRGlzYWxsb3dlZEVsZW1lbnRzRnJvbVN1YnRyZWUoTm9kZSog
ZWxlbWVudCk7Ci0KLSAgICB2b2lkIHNldFVwZGF0ZXNCbG9ja2VkKGJvb2wgYmxvY2tlZCkgeyBt
X3VwZGF0ZXNCbG9ja2VkID0gYmxvY2tlZDsgfQotCi0gICAgZnJpZW5kIGNsYXNzIFJlbmRlclNW
R1NoYWRvd1RyZWVSb290Q29udGFpbmVyOwotICAgIGZyaWVuZCBjbGFzcyBTVkdFbGVtZW50Owot
ICAgIHZvaWQgYnVpbGRTaGFkb3dBbmRJbnN0YW5jZVRyZWUoU1ZHU2hhZG93VHJlZVJvb3RFbGVt
ZW50Kik7Ci0gICAgdm9pZCBkZXRhY2hJbnN0YW5jZSgpOwotCiAgICAgdmlydHVhbCBib29sIHNl
bGZIYXNSZWxhdGl2ZUxlbmd0aHMoKSBjb25zdDsKIAorICAgIHZpcnR1YWwgYm9vbCBhZGRFdmVu
dExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBQYXNzUmVmUHRyPEV2ZW50
TGlzdGVuZXI+LCBib29sIHVzZUNhcHR1cmUpOworICAgIHZpcnR1YWwgYm9vbCByZW1vdmVFdmVu
dExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyKiwg
Ym9vbCB1c2VDYXB0dXJlKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlQWxsRXZlbnRMaXN0ZW5l
cnMoKTsKKwogICAgIC8vIEluc3RhbmNlIHRyZWUgaGFuZGxpbmcKICAgICB2b2lkIGJ1aWxkSW5z
dGFuY2VUcmVlKFNWR0VsZW1lbnQqIHRhcmdldCwgU1ZHRWxlbWVudEluc3RhbmNlKiB0YXJnZXRJ
bnN0YW5jZSwgYm9vbCYgZm91bmRDeWNsZSk7CiAgICAgYm9vbCBoYXNDeWNsZVVzZVJlZmVyZW5j
aW5nKFNWR1VzZUVsZW1lbnQqLCBTVkdFbGVtZW50SW5zdGFuY2UqIHRhcmdldEluc3RhbmNlLCBT
VkdFbGVtZW50KiYgbmV3VGFyZ2V0KTsKLQotICAgIC8vIFNoYWRvdyB0cmVlIGhhbmRsaW5nCi0g
ICAgdm9pZCBidWlsZFNoYWRvd1RyZWUoU1ZHU2hhZG93VHJlZVJvb3RFbGVtZW50KiwgU1ZHRWxl
bWVudCogdGFyZ2V0LCBTVkdFbGVtZW50SW5zdGFuY2UqIHRhcmdldEluc3RhbmNlKTsKLQotICAg
IHZvaWQgZXhwYW5kVXNlRWxlbWVudHNJblNoYWRvd1RyZWUoTm9kZSogZWxlbWVudCk7Ci0gICAg
dm9pZCBleHBhbmRTeW1ib2xFbGVtZW50c0luU2hhZG93VHJlZShOb2RlKiBlbGVtZW50KTsKLQot
ICAgIC8vICJUcmVlIGNvbm5lY3RvciIgCi0gICAgdm9pZCBhc3NvY2lhdGVJbnN0YW5jZXNXaXRo
U2hhZG93VHJlZUVsZW1lbnRzKE5vZGUqIHRhcmdldCwgU1ZHRWxlbWVudEluc3RhbmNlKiB0YXJn
ZXRJbnN0YW5jZSk7Ci0gICAgU1ZHRWxlbWVudEluc3RhbmNlKiBpbnN0YW5jZUZvclNoYWRvd1Ry
ZWVFbGVtZW50KE5vZGUqIGVsZW1lbnQsIFNWR0VsZW1lbnRJbnN0YW5jZSogaW5zdGFuY2UpIGNv
bnN0OwotCi0gICAgdm9pZCB0cmFuc2ZlclVzZUF0dHJpYnV0ZXNUb1JlcGxhY2VkRWxlbWVudChT
VkdFbGVtZW50KiBmcm9tLCBTVkdFbGVtZW50KiB0bykgY29uc3Q7Ci0gICAgdm9pZCB0cmFuc2Zl
ckV2ZW50TGlzdGVuZXJzVG9TaGFkb3dUcmVlKFNWR0VsZW1lbnRJbnN0YW5jZSogdGFyZ2V0KTsK
LQotICAgIHZvaWQgdXBkYXRlQ29udGFpbmVyT2Zmc2V0cygpOwotICAgIHZvaWQgdXBkYXRlQ29u
dGFpbmVyU2l6ZXMoKTsKKyAgICB2b2lkIGRldGFjaEluc3RhbmNlKCk7CiAKICAgICBCRUdJTl9E
RUNMQVJFX0FOSU1BVEVEX1BST1BFUlRJRVMoU1ZHVXNlRWxlbWVudCkKICAgICAgICAgREVDTEFS
RV9BTklNQVRFRF9MRU5HVEgoWCwgeCkKQEAgLTExOCw5ICs5NCw2IEBAIHByaXZhdGU6CiAgICAg
dmlydHVhbCB2b2lkIHN5bmNocm9uaXplUmVxdWlyZWRFeHRlbnNpb25zKCkgeyBTVkdUZXN0czo6
c3luY2hyb25pemVSZXF1aXJlZEV4dGVuc2lvbnModGhpcyk7IH0KICAgICB2aXJ0dWFsIHZvaWQg
c3luY2hyb25pemVTeXN0ZW1MYW5ndWFnZSgpIHsgU1ZHVGVzdHM6OnN5bmNocm9uaXplU3lzdGVt
TGFuZ3VhZ2UodGhpcyk7IH0KIAotICAgIGJvb2wgbV91cGRhdGVzQmxvY2tlZDsKLSAgICBib29s
IG1fbmVlZHNTaGFkb3dUcmVlUmVjcmVhdGlvbjsKLSAgICBTdHJpbmcgbV9yZXNvdXJjZUlkOwog
ICAgIFJlZlB0cjxTVkdFbGVtZW50SW5zdGFuY2U+IG1fdGFyZ2V0RWxlbWVudEluc3RhbmNlOwog
fTsKIApJbmRleDogU291cmNlL1dlYkNvcmUvc3ZnL2FuaW1hdGlvbi9TVkdTTUlMRWxlbWVudC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvc3ZnL2FuaW1hdGlvbi9TVkdTTUlMRWxl
bWVudC5jcHAJKHJldmlzaW9uIDk2NTc1KQorKysgU291cmNlL1dlYkNvcmUvc3ZnL2FuaW1hdGlv
bi9TVkdTTUlMRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE3MCwxMSArMTcwLDYgQEAg
c3RhdGljIGlubGluZSBRdWFsaWZpZWROYW1lIGNvbnN0cnVjdFF1YQogdm9pZCBTVkdTTUlMRWxl
bWVudDo6aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKQogewogICAgIFNWR0VsZW1lbnQ6Omluc2VydGVk
SW50b0RvY3VtZW50KCk7Ci0jaWZuZGVmIE5ERUJVRwotICAgIC8vIFZlcmlmeSB3ZSBhcmUgbm90
IGluIDx1c2U+IGluc3RhbmNlIHRyZWUuCi0gICAgZm9yIChDb250YWluZXJOb2RlKiBuID0gdGhp
czsgbjsgbiA9IG4tPnBhcmVudE5vZGUoKSkKLSAgICAgICAgQVNTRVJUKCFuLT5pc1NWR1NoYWRv
d1Jvb3QoKSk7Ci0jZW5kaWYKICAgICBtX2F0dHJpYnV0ZU5hbWUgPSBjb25zdHJ1Y3RRdWFsaWZp
ZWROYW1lKHRoaXMsIGZhc3RHZXRBdHRyaWJ1dGUoU1ZHTmFtZXM6OmF0dHJpYnV0ZU5hbWVBdHRy
KSk7CiAgICAgU1ZHU1ZHRWxlbWVudCogb3duZXIgPSBvd25lclNWR0VsZW1lbnQoKTsKICAgICBp
ZiAoIW93bmVyKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>127591</attachid>
            <date>2012-02-17 08:16:10 -0800</date>
            <delta_ts>2012-02-22 05:27:05 -0800</delta_ts>
            <desc>Current prototype patch</desc>
            <filename>NextUsePatch.diff</filename>
            <type>text/plain</type>
            <size>43298</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2Nzcy9TZWxlY3RvckNoZWNrZXIuY3BwIGIvU291
cmNlL1dlYkNvcmUvY3NzL1NlbGVjdG9yQ2hlY2tlci5jcHAKaW5kZXggYmMyMTY2MC4uMmYwYjg2
NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvY3NzL1NlbGVjdG9yQ2hlY2tlci5jcHAKKysr
IGIvU291cmNlL1dlYkNvcmUvY3NzL1NlbGVjdG9yQ2hlY2tlci5jcHAKQEAgLTQ0OCw3ICs0NDgs
NyBAQCBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2ggU2VsZWN0b3JDaGVja2VyOjpjaGVj
a1NlbGVjdG9yKGNvbnN0IFNlbGVjdG9yQ2hlYwogI2lmIEVOQUJMRShTVkcpCiAgICAgLy8gU3Bl
YzogQ1NTMiBzZWxlY3RvcnMgY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIChjb25jZXB0dWFsbHkp
IGNsb25lZCBET00gdHJlZQogICAgIC8vIGJlY2F1c2UgaXRzIGNvbnRlbnRzIGFyZSBub3QgcGFy
dCBvZiB0aGUgZm9ybWFsIGRvY3VtZW50IHN0cnVjdHVyZS4KLSAgICBpZiAoY29udGV4dC5lbGVt
ZW50LT5pc1NWR1NoYWRvd1Jvb3QoKSkKKyAgICBpZiAoY29udGV4dC5lbGVtZW50LT5pc1NWR0Vs
ZW1lbnQoKSAmJiBjb250ZXh0LmVsZW1lbnQtPmlzU2hhZG93Um9vdCgpKQogICAgICAgICByZXR1
cm4gU2VsZWN0b3JGYWlsc0NvbXBsZXRlbHk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvZG9tL0NoYXJhY3RlckRhdGEuY3BwIGIvU291cmNlL1dlYkNvcmUvZG9tL0NoYXJh
Y3RlckRhdGEuY3BwCmluZGV4IDM4NzlhOTcuLmU4YjY3MGIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vQ2hh
cmFjdGVyRGF0YS5jcHAKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJNdXRhdGlvblJlY29y
ZC5oIgogI2luY2x1ZGUgIk5vZGVSZW5kZXJpbmdDb250ZXh0LmgiCiAjaW5jbHVkZSAiUmVuZGVy
VGV4dC5oIgorI2luY2x1ZGUgIlNjcmlwdGFibGVEb2N1bWVudFBhcnNlci5oIgogI2luY2x1ZGUg
IlRleHRCcmVha0l0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiV2ViS2l0TXV0YXRpb25PYnNlcnZlci5o
IgogCkBAIC04Myw5ICs4NCwxNCBAQCB1bnNpZ25lZCBDaGFyYWN0ZXJEYXRhOjpwYXJzZXJBcHBl
bmREYXRhKGNvbnN0IFVDaGFyKiBkYXRhLCB1bnNpZ25lZCBkYXRhTGVuZ3RoLAogICAgIHVwZGF0
ZVJlbmRlcmVyKG9sZExlbmd0aCwgMCk7CiAgICAgLy8gV2UgZG9uJ3QgY2FsbCBkaXNwYXRjaE1v
ZGlmaWVkRXZlbnQgaGVyZSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdGhlCiAgICAgLy8gcGFyc2Vy
IHRvIGRpc3BhdGNoIERPTSBtdXRhdGlvbiBldmVudHMuCi0gICAgaWYgKHBhcmVudE5vZGUoKSkK
LSAgICAgICAgcGFyZW50Tm9kZSgpLT5jaGlsZHJlbkNoYW5nZWQoKTsKLSAgICAKKyAgICBpZiAo
cGFyZW50Tm9kZSgpKSB7ICAgIAorICAgICAgICBib29sIGlzUGFyc2luZyA9IGZhbHNlOworICAg
ICAgICBpZiAoU2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKiBwYXJzZXIgPSBkb2N1bWVudCgpLT5z
Y3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKSkKKyAgICAgICAgICAgIGlzUGFyc2luZyA9IHBhcnNl
ci0+aXNQYXJzaW5nKCk7CisKKyAgICAgICAgcGFyZW50Tm9kZSgpLT5jaGlsZHJlbkNoYW5nZWQo
aXNQYXJzaW5nKTsKKyAgICB9CisKICAgICByZXR1cm4gZW5kOwogfQogCkBAIC0xOTUsOCArMjAx
LDE0IEBAIHZvaWQgQ2hhcmFjdGVyRGF0YTo6ZGlzcGF0Y2hNb2RpZmllZEV2ZW50KGNvbnN0IFN0
cmluZyYgb2xkRGF0YSkKICAgICBpZiAoT3duUHRyPE11dGF0aW9uT2JzZXJ2ZXJJbnRlcmVzdEdy
b3VwPiBtdXRhdGlvblJlY2lwaWVudHMgPSBNdXRhdGlvbk9ic2VydmVySW50ZXJlc3RHcm91cDo6
Y3JlYXRlRm9yQ2hhcmFjdGVyRGF0YU11dGF0aW9uKHRoaXMpKQogICAgICAgICBtdXRhdGlvblJl
Y2lwaWVudHMtPmVucXVldWVNdXRhdGlvblJlY29yZChNdXRhdGlvblJlY29yZDo6Y3JlYXRlQ2hh
cmFjdGVyRGF0YSh0aGlzLCBvbGREYXRhKSk7CiAjZW5kaWYKLSAgICBpZiAocGFyZW50Tm9kZSgp
KQotICAgICAgICBwYXJlbnROb2RlKCktPmNoaWxkcmVuQ2hhbmdlZCgpOworICAgIGlmIChwYXJl
bnROb2RlKCkpIHsKKyAgICAgICAgYm9vbCBpc1BhcnNpbmcgPSBmYWxzZTsKKyAgICAgICAgaWYg
KFNjcmlwdGFibGVEb2N1bWVudFBhcnNlciogcGFyc2VyID0gZG9jdW1lbnQoKS0+c2NyaXB0YWJs
ZURvY3VtZW50UGFyc2VyKCkpCisgICAgICAgICAgICBpc1BhcnNpbmcgPSBwYXJzZXItPmlzUGFy
c2luZygpOworCisgICAgICAgIHBhcmVudE5vZGUoKS0+Y2hpbGRyZW5DaGFuZ2VkKGlzUGFyc2lu
Zyk7CisgICAgfQorCiAgICAgaWYgKGRvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShEb2N1bWVu
dDo6RE9NQ0hBUkFDVEVSREFUQU1PRElGSUVEX0xJU1RFTkVSKSkKICAgICAgICAgZGlzcGF0Y2hF
dmVudChNdXRhdGlvbkV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLkRPTUNoYXJhY3RlckRhdGFN
b2RpZmllZEV2ZW50LCB0cnVlLCAwLCBvbGREYXRhLCBtX2RhdGEpKTsKICAgICBkaXNwYXRjaFN1
YnRyZWVNb2RpZmllZEV2ZW50KCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9kb20vRXZl
bnREaXNwYXRjaGVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9FdmVudERpc3BhdGNoZXIuY3Bw
CmluZGV4IDNlZTUyODUuLmIzM2I2YzcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2RvbS9F
dmVudERpc3BhdGNoZXIuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2RvbS9FdmVudERpc3BhdGNo
ZXIuY3BwCkBAIC02MSwxMCArNjEsMTAgQEAgc3RhdGljIEV2ZW50VGFyZ2V0KiBmaW5kRWxlbWVu
dEluc3RhbmNlKE5vZGUqIHJlZmVyZW5jZU5vZGUpCiAgICAgLy8gU3BlYzogVGhlIGV2ZW50IGhh
bmRsaW5nIGZvciB0aGUgbm9uLWV4cG9zZWQgdHJlZSB3b3JrcyBhcyBpZiB0aGUgcmVmZXJlbmNl
ZCBlbGVtZW50IGhhZCBiZWVuIHRleHR1YWxseSBpbmNsdWRlZAogICAgIC8vIGFzIGEgZGVlcGx5
IGNsb25lZCBjaGlsZCBvZiB0aGUgJ3VzZScgZWxlbWVudCwgZXhjZXB0IHRoYXQgZXZlbnRzIGFy
ZSBkaXNwYXRjaGVkIHRvIHRoZSBTVkdFbGVtZW50SW5zdGFuY2Ugb2JqZWN0cwogICAgIGZvciAo
Tm9kZSogbiA9IHJlZmVyZW5jZU5vZGU7IG47IG4gPSBuLT5wYXJlbnROb2RlKCkpIHsKLSAgICAg
ICAgaWYgKCFuLT5pc1NWR1NoYWRvd1Jvb3QoKSB8fCAhbi0+aXNTVkdFbGVtZW50KCkpCisgICAg
ICAgIGlmICghbi0+aXNTaGFkb3dSb290KCkgfHwgIW4tPmlzU1ZHRWxlbWVudCgpKQogICAgICAg
ICAgICAgY29udGludWU7CiAKLSAgICAgICAgRWxlbWVudCogc2hhZG93VHJlZVBhcmVudEVsZW1l
bnQgPSBuLT5zdmdTaGFkb3dIb3N0KCk7CisgICAgICAgIEVsZW1lbnQqIHNoYWRvd1RyZWVQYXJl
bnRFbGVtZW50ID0gbi0+c2hhZG93SG9zdCgpOwogICAgICAgICBBU1NFUlQoc2hhZG93VHJlZVBh
cmVudEVsZW1lbnQtPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnVzZVRhZykpOwogCiAgICAgICAgIGlm
IChTVkdFbGVtZW50SW5zdGFuY2UqIGluc3RhbmNlID0gc3RhdGljX2Nhc3Q8U1ZHVXNlRWxlbWVu
dCo+KHNoYWRvd1RyZWVQYXJlbnRFbGVtZW50KS0+aW5zdGFuY2VGb3JTaGFkb3dUcmVlRWxlbWVu
dChyZWZlcmVuY2VOb2RlKSkKQEAgLTEyMCwxMSArMTIwLDYgQEAgdm9pZCBFdmVudERpc3BhdGNo
ZXI6OmRpc3BhdGNoU2ltdWxhdGVkQ2xpY2soTm9kZSogbm9kZSwgUGFzc1JlZlB0cjxFdmVudD4g
dW5kZXIKICAgICBnTm9kZXNEaXNwYXRjaGluZ1NpbXVsYXRlZENsaWNrcy0+cmVtb3ZlKG5vZGUp
OwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNTaGFkb3dSb290T3JTVkdTaGFkb3dSb290KGNv
bnN0IE5vZGUqIG5vZGUpCi17Ci0gICAgcmV0dXJuIG5vZGUtPmlzU2hhZG93Um9vdCgpIHx8IG5v
ZGUtPmlzU1ZHU2hhZG93Um9vdCgpOwotfQotCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNTaGFkb3dI
b3N0KE5vZGUqIG5vZGUpCiB7CiAgICAgcmV0dXJuIG5vZGUtPmlzRWxlbWVudE5vZGUoKSAmJiB0
b0VsZW1lbnQobm9kZSktPmhhc1NoYWRvd1Jvb3QoKTsKQEAgLTE0MSw3ICsxMzYsNyBAQCBQYXNz
UmVmUHRyPEV2ZW50VGFyZ2V0PiBFdmVudERpc3BhdGNoZXI6OmFkanVzdFRvU2hhZG93Qm91bmRh
cmllcyhQYXNzUmVmUHRyPE5vZAogICAgIGJvb2wgZGl2ZXJnZWQgPSBmYWxzZTsKICAgICBmb3Ig
KFZlY3RvcjxOb2RlKj46OmNvbnN0X2l0ZXJhdG9yIGkgPSByZWxhdGVkVGFyZ2V0QW5jZXN0b3Jz
LmVuZCgpIC0gMTsgaSA+PSByZWxhdGVkVGFyZ2V0QW5jZXN0b3JzLmJlZ2luKCk7IC0taSkgewog
ICAgICAgICBpZiAoZGl2ZXJnZWQpIHsKLSAgICAgICAgICAgIGlmIChpc1NoYWRvd1Jvb3RPclNW
R1NoYWRvd1Jvb3QoKmkpKSB7CisgICAgICAgICAgICBpZiAoKCppKS0+aXNTaGFkb3dSb290KCkp
IHsKICAgICAgICAgICAgICAgICBmaXJzdERpdmVyZ2VudEJvdW5kYXJ5ID0gaSArIDE7CiAgICAg
ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xNTUsNyArMTUwLDcgQEAgUGFz
c1JlZlB0cjxFdmVudFRhcmdldD4gRXZlbnREaXNwYXRjaGVyOjphZGp1c3RUb1NoYWRvd0JvdW5k
YXJpZXMoUGFzc1JlZlB0cjxOb2QKIAogICAgICAgICB0YXJnZXRBbmNlc3Rvci0tOwogCi0gICAg
ICAgIGlmIChpc1NoYWRvd1Jvb3RPclNWR1NoYWRvd1Jvb3QoKmkpKQorICAgICAgICBpZiAoKCpp
KS0+aXNTaGFkb3dSb290KCkpCiAgICAgICAgICAgICBsb3dlc3RDb21tb25Cb3VuZGFyeSA9IHRh
cmdldEFuY2VzdG9yOwogCiAgICAgICAgIGlmICgoKmkpICE9ICgqdGFyZ2V0QW5jZXN0b3IpLm5v
ZGUoKSkKQEAgLTE2Nyw3ICsxNjIsNyBAQCBQYXNzUmVmUHRyPEV2ZW50VGFyZ2V0PiBFdmVudERp
c3BhdGNoZXI6OmFkanVzdFRvU2hhZG93Qm91bmRhcmllcyhQYXNzUmVmUHRyPE5vZAogICAgICAg
ICAvLyBGSVhNRTogUmVtb3ZlIHRoZSBmaXJzdCBjaGVjayBvbmNlIGNvbnZlcnNpb24gdG8gbmV3
IHNoYWRvdyBET00gaXMgY29tcGxldGUgPGh0dHA6Ly93ZWJraXQub3JnL2IvNDg2OTg+CiAgICAg
ICAgIGlmIChtX25vZGUtPnNoYWRvd0hvc3QoKSA9PSByZWxhdGVkVGFyZ2V0LmdldCgpIHx8IGlz
U2hhZG93SG9zdChyZWxhdGVkVGFyZ2V0LmdldCgpKSkgewogICAgICAgICAgICAgVmVjdG9yPEV2
ZW50Q29udGV4dD46OmNvbnN0X2l0ZXJhdG9yIHJlbGF0ZWRUYXJnZXRDaGlsZCA9IHRhcmdldEFu
Y2VzdG9yIC0gMTsKLSAgICAgICAgICAgIGlmIChyZWxhdGVkVGFyZ2V0Q2hpbGQgPj0gbV9hbmNl
c3RvcnMuYmVnaW4oKSAmJiBpc1NoYWRvd1Jvb3RPclNWR1NoYWRvd1Jvb3QocmVsYXRlZFRhcmdl
dENoaWxkLT5ub2RlKCkpKQorICAgICAgICAgICAgaWYgKHJlbGF0ZWRUYXJnZXRDaGlsZCA+PSBt
X2FuY2VzdG9ycy5iZWdpbigpICYmIHJlbGF0ZWRUYXJnZXRDaGlsZC0+bm9kZSgpLT5pc1NoYWRv
d1Jvb3QoKSkKICAgICAgICAgICAgICAgICBsb3dlc3RDb21tb25Cb3VuZGFyeSA9IHJlbGF0ZWRU
YXJnZXRDaGlsZDsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoKCpmaXJzdERpdmVyZ2VudEJv
dW5kYXJ5KSA9PSBtX25vZGUuZ2V0KCkpIHsKQEAgLTIxNyw3ICsyMTIsNyBAQCBQYXNzUmVmUHRy
PEV2ZW50VGFyZ2V0PiBFdmVudERpc3BhdGNoZXI6OmFkanVzdFJlbGF0ZWRUYXJnZXQoRXZlbnQq
IGV2ZW50LCBQYXNzUgogICAgIFZlY3RvcjxOb2RlKj4gcmVsYXRlZFRhcmdldEFuY2VzdG9yczsK
ICAgICBOb2RlKiBvdXRlcm1vc3RTaGFkb3dCb3VuZGFyeSA9IHJlbGF0ZWRUYXJnZXQuZ2V0KCk7
CiAgICAgZm9yIChOb2RlKiBuID0gb3V0ZXJtb3N0U2hhZG93Qm91bmRhcnk7IG47IG4gPSBuLT5w
YXJlbnRPckhvc3ROb2RlKCkpIHsKLSAgICAgICAgaWYgKGlzU2hhZG93Um9vdE9yU1ZHU2hhZG93
Um9vdChuKSkKKyAgICAgICAgaWYgKG4tPmlzU2hhZG93Um9vdCgpKQogICAgICAgICAgICAgb3V0
ZXJtb3N0U2hhZG93Qm91bmRhcnkgPSBuLT5wYXJlbnRPckhvc3ROb2RlKCk7CiAgICAgICAgIGlm
ICghbm9Db21tb25Cb3VuZGFyeSkKICAgICAgICAgICAgIHJlbGF0ZWRUYXJnZXRBbmNlc3RvcnMu
YXBwZW5kKG4pOwpAQCAtMjUzLDE1ICsyNDgsMTAgQEAgdm9pZCBFdmVudERpc3BhdGNoZXI6OmVu
c3VyZUV2ZW50QW5jZXN0b3JzKEV2ZW50KiBldmVudCkKICAgICBFdmVudFRhcmdldCogdGFyZ2V0
ID0gZXZlbnRUYXJnZXRSZXNwZWN0aW5nU1ZHVGFyZ2V0UnVsZXMoYW5jZXN0b3IpOwogICAgIGJv
b2wgc2hvdWxkU2tpcE5leHRBbmNlc3RvciA9IGZhbHNlOwogICAgIHdoaWxlICh0cnVlKSB7Ci0g
ICAgICAgIGJvb2wgaXNTVkdTaGFkb3dSb290ID0gYW5jZXN0b3ItPmlzU1ZHU2hhZG93Um9vdCgp
OwotICAgICAgICBpZiAoaXNTVkdTaGFkb3dSb290IHx8IGFuY2VzdG9yLT5pc1NoYWRvd1Jvb3Qo
KSkgeworICAgICAgICBpZiAoYW5jZXN0b3ItPmlzU2hhZG93Um9vdCgpKSB7CiAgICAgICAgICAg
ICBpZiAoZGV0ZXJtaW5lRGlzcGF0Y2hCZWhhdmlvcihldmVudCwgYW5jZXN0b3IpID09IFN0YXlJ
bnNpZGVTaGFkb3dET00pCiAgICAgICAgICAgICAgICAgcmV0dXJuOwotI2lmIEVOQUJMRShTVkcp
Ci0gICAgICAgICAgICBhbmNlc3RvciA9IGlzU1ZHU2hhZG93Um9vdCA/IGFuY2VzdG9yLT5zdmdT
aGFkb3dIb3N0KCkgOiBhbmNlc3Rvci0+c2hhZG93SG9zdCgpOwotI2Vsc2UKICAgICAgICAgICAg
IGFuY2VzdG9yID0gYW5jZXN0b3ItPnNoYWRvd0hvc3QoKTsKLSNlbmRpZgogICAgICAgICAgICAg
aWYgKCFzaG91bGRTa2lwTmV4dEFuY2VzdG9yKQogICAgICAgICAgICAgICAgIHRhcmdldCA9IGFu
Y2VzdG9yOwogICAgICAgICB9IGVsc2UKQEAgLTI3MSw4ICsyNjEsOCBAQCB2b2lkIEV2ZW50RGlz
cGF0Y2hlcjo6ZW5zdXJlRXZlbnRBbmNlc3RvcnMoRXZlbnQqIGV2ZW50KQogICAgICAgICAgICAg
cmV0dXJuOwogCiAjaWYgRU5BQkxFKFNWRykKLSAgICAgICAgLy8gU2tpcCBTVkdTaGFkb3dUcmVl
Um9vdEVsZW1lbnQuCi0gICAgICAgIHNob3VsZFNraXBOZXh0QW5jZXN0b3IgPSBhbmNlc3Rvci0+
aXNTVkdTaGFkb3dSb290KCk7CisgICAgICAgIC8vIFNraXAgU1ZHIHNoYWRvdyB0cmVlIHJvb3Qg
ZWxlbWVudC4KKyAgICAgICAgc2hvdWxkU2tpcE5leHRBbmNlc3RvciA9IGFuY2VzdG9yLT5pc1NW
R0VsZW1lbnQoKSAmJiBhbmNlc3Rvci0+aXNTaGFkb3dSb290KCk7CiAgICAgICAgIGlmIChzaG91
bGRTa2lwTmV4dEFuY2VzdG9yKQogICAgICAgICAgICAgY29udGludWU7CiAjZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9O
b2RlLmNwcAppbmRleCA2ZDJlOGYxLi5hODlhYTlmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9kb20vTm9kZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuY3BwCkBAIC0xNDcw
LDEyICsxNDcwLDYgQEAgYm9vbCBOb2RlOjpjYW5TdGFydFNlbGVjdGlvbigpIGNvbnN0CiAgICAg
cmV0dXJuIHBhcmVudE9ySG9zdE5vZGUoKSA/IHBhcmVudE9ySG9zdE5vZGUoKS0+Y2FuU3RhcnRT
ZWxlY3Rpb24oKSA6IHRydWU7CiB9CiAKLSNpZiBFTkFCTEUoU1ZHKQotU1ZHVXNlRWxlbWVudCog
Tm9kZTo6c3ZnU2hhZG93SG9zdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlzU1ZHU2hhZG93Um9v
dCgpID8gc3RhdGljX2Nhc3Q8U1ZHVXNlRWxlbWVudCo+KHBhcmVudCgpKSA6IDA7Ci19Ci0jZW5k
aWYKIAogTm9kZSogTm9kZTo6c2hhZG93QW5jZXN0b3JOb2RlKCkgY29uc3QKIHsKQEAgLTE0OTgs
NyArMTQ5Miw3IEBAIE5vZGUqIE5vZGU6OnNoYWRvd1RyZWVSb290Tm9kZSgpIGNvbnN0CiB7CiAg
ICAgTm9kZSogcm9vdCA9IGNvbnN0X2Nhc3Q8Tm9kZSo+KHRoaXMpOwogICAgIHdoaWxlIChyb290
KSB7Ci0gICAgICAgIGlmIChyb290LT5pc1NoYWRvd1Jvb3QoKSB8fCByb290LT5pc1NWR1NoYWRv
d1Jvb3QoKSkKKyAgICAgICAgaWYgKHJvb3QtPmlzU2hhZG93Um9vdCgpKQogICAgICAgICAgICAg
cmV0dXJuIHJvb3Q7CiAgICAgICAgIHJvb3QgPSByb290LT5wYXJlbnROb2RlR3VhcmFudGVlZEhv
c3RGcmVlKCk7CiAgICAgfQpAQCAtMTUxMCw3ICsxNTA0LDcgQEAgTm9kZSogTm9kZTo6bm9uQm91
bmRhcnlTaGFkb3dUcmVlUm9vdE5vZGUoKQogICAgIEFTU0VSVCghaXNTaGFkb3dSb290KCkpOwog
ICAgIE5vZGUqIHJvb3QgPSB0aGlzOwogICAgIHdoaWxlIChyb290KSB7Ci0gICAgICAgIGlmIChy
b290LT5pc1NoYWRvd1Jvb3QoKSB8fCByb290LT5pc1NWR1NoYWRvd1Jvb3QoKSkKKyAgICAgICAg
aWYgKHJvb3QtPmlzU2hhZG93Um9vdCgpKQogICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAg
ICAgIE5vZGUqIHBhcmVudCA9IHJvb3QtPnBhcmVudE5vZGVHdWFyYW50ZWVkSG9zdEZyZWUoKTsK
ICAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQtPmlzU2hhZG93Um9vdCgpKQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvZG9tL05vZGUuaCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmgK
aW5kZXggNTAyOTIwYy4uZDY4MTQ3MjhmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20v
Tm9kZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmgKQEAgLTIwNCwxNCArMjA0LDgg
QEAgcHVibGljOgogICAgIGJvb2wgaXNFbGVtZW50Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIGdldEZs
YWcoSXNFbGVtZW50RmxhZyk7IH0KICAgICBib29sIGlzQ29udGFpbmVyTm9kZSgpIGNvbnN0IHsg
cmV0dXJuIGdldEZsYWcoSXNDb250YWluZXJGbGFnKTsgfQogICAgIGJvb2wgaXNUZXh0Tm9kZSgp
IGNvbnN0IHsgcmV0dXJuIGdldEZsYWcoSXNUZXh0RmxhZyk7IH0KLQogICAgIGJvb2wgaXNIVE1M
RWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWcoSXNIVE1MRmxhZyk7IH0KLQogICAgIGJv
b2wgaXNTVkdFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZyhJc1NWR0ZsYWcpOyB9Ci0g
ICAgYm9vbCBpc1NWR1NoYWRvd1Jvb3QoKSBjb25zdCB7IHJldHVybiBnZXRGbGFnKElzU2hhZG93
Um9vdE9yU1ZHU2hhZG93Um9vdEZsYWcpICYmIGlzU1ZHRWxlbWVudCgpOyB9Ci0jaWYgRU5BQkxF
KFNWRykKLSAgICBTVkdVc2VFbGVtZW50KiBzdmdTaGFkb3dIb3N0KCkgY29uc3Q7Ci0jZW5kaWYK
IAogICAgIHZpcnR1YWwgYm9vbCBpc01lZGlhQ29udHJvbEVsZW1lbnQoKSBjb25zdCB7IHJldHVy
biBmYWxzZTsgfQogICAgIHZpcnR1YWwgYm9vbCBpc01lZGlhQ29udHJvbHMoKSBjb25zdCB7IHJl
dHVybiBmYWxzZTsgfQpAQCAtMjIxLDcgKzIxNSw3IEBAIHB1YmxpYzoKICAgICBib29sIGlzQ29t
bWVudE5vZGUoKSBjb25zdCB7IHJldHVybiBnZXRGbGFnKElzQ29tbWVudEZsYWcpOyB9CiAgICAg
dmlydHVhbCBib29sIGlzQ2hhcmFjdGVyRGF0YU5vZGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsg
fQogICAgIGJvb2wgaXNEb2N1bWVudE5vZGUoKSBjb25zdDsKLSAgICBib29sIGlzU2hhZG93Um9v
dCgpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWcoSXNTaGFkb3dSb290T3JTVkdTaGFkb3dSb290Rmxh
ZykgJiYgIWlzU1ZHRWxlbWVudCgpOyB9CisgICAgYm9vbCBpc1NoYWRvd1Jvb3QoKSBjb25zdCB7
IHJldHVybiBnZXRGbGFnKElzU2hhZG93Um9vdEZsYWcpICYmICFpc1NWR0VsZW1lbnQoKTsgfQog
ICAgIHZpcnR1YWwgYm9vbCBpc0NvbnRlbnRFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7
IH0KICNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKICAgICB2aXJ0dWFsIGJvb2wgaXNTaGFkb3dFbGVt
ZW50KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KQEAgLTIzNiw3ICsyMzAsNyBAQCBwdWJsaWM6
CiAgICAgLy8gTm9kZSdzIHBhcmVudCwgc2hhZG93IHRyZWUgaG9zdCwgb3IgU1ZHIHVzZS4KICAg
ICBDb250YWluZXJOb2RlKiBwYXJlbnRPckhvc3ROb2RlKCkgY29uc3Q7CiAgICAgRWxlbWVudCog
cGFyZW50T3JIb3N0RWxlbWVudCgpIGNvbnN0OwotICAgIC8vIFVzZSB3aGVuIGl0J3MgZ3VhcmFu
dGVlZCB0byB0aGF0IHNoYWRvd0hvc3QgaXMgMCBhbmQgc3ZnU2hhZG93SG9zdCBpcyAwLgorICAg
IC8vIFVzZSB3aGVuIGl0J3MgZ3VhcmFudGVlZCB0byB0aGF0IHNoYWRvd0hvc3QgaXMgMC4KICAg
ICBDb250YWluZXJOb2RlKiBwYXJlbnROb2RlR3VhcmFudGVlZEhvc3RGcmVlKCkgY29uc3Q7CiAg
ICAgLy8gUmV0dXJucyB0aGUgcGFyZW50IG5vZGUsIGJ1dCAwIGlmIHRoZSBwYXJlbnQgbm9kZSBp
cyBhIFNoYWRvd1Jvb3QuCiAgICAgQ29udGFpbmVyTm9kZSogbm9uU2hhZG93Qm91bmRhcnlQYXJl
bnROb2RlKCkgY29uc3Q7CkBAIC02NjUsNyArNjU5LDcgQEAgcHJpdmF0ZToKICAgICAgICAgSW5B
Y3RpdmVDaGFpbkZsYWcgPSAxIDw8IDE1LAogICAgICAgICBJbkRldGFjaEZsYWcgPSAxIDw8IDE2
LAogICAgICAgICBIYXNSYXJlRGF0YUZsYWcgPSAxIDw8IDE3LAotICAgICAgICBJc1NoYWRvd1Jv
b3RPclNWR1NoYWRvd1Jvb3RGbGFnID0gMSA8PCAxOCwKKyAgICAgICAgSXNTaGFkb3dSb290Rmxh
ZyA9IDEgPDwgMTgsCiAKICAgICAgICAgLy8gVGhlc2UgYml0cyBhcmUgdXNlZCBieSBkZXJpdmVk
IGNsYXNzZXMsIHB1bGxlZCB1cCBoZXJlIHNvIHRoZXkgY2FuCiAgICAgICAgIC8vIGJlIHN0b3Jl
ZCBpbiB0aGUgc2FtZSBtZW1vcnkgd29yZCBhcyB0aGUgTm9kZSBiaXRzIGFib3ZlLgpAQCAtNzA5
LDExICs3MDMsMTAgQEAgcHJvdGVjdGVkOgogICAgICAgICBDcmVhdGVDb21tZW50ID0gRGVmYXVs
dE5vZGVGbGFncyB8IElzQ29tbWVudEZsYWcsCiAgICAgICAgIENyZWF0ZUNvbnRhaW5lciA9IERl
ZmF1bHROb2RlRmxhZ3MgfCBJc0NvbnRhaW5lckZsYWcsIAogICAgICAgICBDcmVhdGVFbGVtZW50
ID0gQ3JlYXRlQ29udGFpbmVyIHwgSXNFbGVtZW50RmxhZywgCi0gICAgICAgIENyZWF0ZVNoYWRv
d1Jvb3QgPSBDcmVhdGVDb250YWluZXIgfCBJc1NoYWRvd1Jvb3RPclNWR1NoYWRvd1Jvb3RGbGFn
LAorICAgICAgICBDcmVhdGVTaGFkb3dSb290ID0gQ3JlYXRlQ29udGFpbmVyIHwgSXNTaGFkb3dS
b290RmxhZywKICAgICAgICAgQ3JlYXRlU3R5bGVkRWxlbWVudCA9IENyZWF0ZUVsZW1lbnQgfCBJ
c1N0eWxlZEVsZW1lbnRGbGFnLCAKICAgICAgICAgQ3JlYXRlSFRNTEVsZW1lbnQgPSBDcmVhdGVT
dHlsZWRFbGVtZW50IHwgSXNIVE1MRmxhZywgCi0gICAgICAgIENyZWF0ZVNWR0VsZW1lbnQgPSBD
cmVhdGVTdHlsZWRFbGVtZW50IHwgSXNTVkdGbGFnLAotICAgICAgICBDcmVhdGVTVkdTaGFkb3dS
b290ID0gQ3JlYXRlU1ZHRWxlbWVudCB8IElzU2hhZG93Um9vdE9yU1ZHU2hhZG93Um9vdEZsYWcs
CisgICAgICAgIENyZWF0ZVNWR0VsZW1lbnQgPSBDcmVhdGVTdHlsZWRFbGVtZW50IHwgSXNTVkdG
bGFnCiAgICAgfTsKICAgICBOb2RlKERvY3VtZW50KiwgQ29uc3RydWN0aW9uVHlwZSk7CiAKQEAg
LTgyNiw3ICs4MTksNyBAQCBpbmxpbmUgdm9pZCBhZGRTdWJyZXNvdXJjZVVSTChMaXN0SGFzaFNl
dDxLVVJMPiYgdXJscywgY29uc3QgS1VSTCYgdXJsKQogCiBpbmxpbmUgQ29udGFpbmVyTm9kZSog
Tm9kZTo6cGFyZW50Tm9kZSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGdldEZsYWcoSXNTaGFkb3dS
b290T3JTVkdTaGFkb3dSb290RmxhZykgPyAwIDogcGFyZW50KCk7CisgICAgcmV0dXJuIGdldEZs
YWcoSXNTaGFkb3dSb290RmxhZykgPyAwIDogcGFyZW50KCk7CiB9CiAKIGlubGluZSBDb250YWlu
ZXJOb2RlKiBOb2RlOjpwYXJlbnRPckhvc3ROb2RlKCkgY29uc3QKQEAgLTgzNiw3ICs4MjksNyBA
QCBpbmxpbmUgQ29udGFpbmVyTm9kZSogTm9kZTo6cGFyZW50T3JIb3N0Tm9kZSgpIGNvbnN0CiAK
IGlubGluZSBDb250YWluZXJOb2RlKiBOb2RlOjpwYXJlbnROb2RlR3VhcmFudGVlZEhvc3RGcmVl
KCkgY29uc3QKIHsKLSAgICBBU1NFUlQoIWdldEZsYWcoSXNTaGFkb3dSb290T3JTVkdTaGFkb3dS
b290RmxhZykpOworICAgIEFTU0VSVCghZ2V0RmxhZyhJc1NoYWRvd1Jvb3RGbGFnKSk7CiAgICAg
cmV0dXJuIHBhcmVudE9ySG9zdE5vZGUoKTsKIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvZG9tL1JhbmdlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9SYW5nZS5jcHAKaW5kZXggMGMw
MGNmZC4uYTdlNjZjNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL1JhbmdlLmNwcAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vUmFuZ2UuY3BwCkBAIC0xMjc1LDcgKzEyNzUsNyBAQCB2
b2lkIFJhbmdlOjpjaGVja05vZGVCQShOb2RlKiBuLCBFeGNlcHRpb25Db2RlJiBlYykgY29uc3QK
ICAgICAgICAgY2FzZSBOb2RlOjpQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6CiAgICAgICAg
IGNhc2UgTm9kZTo6VEVYVF9OT0RFOgogICAgICAgICBjYXNlIE5vZGU6OlhQQVRIX05BTUVTUEFD
RV9OT0RFOgotICAgICAgICAgICAgaWYgKHJvb3QtPmlzU1ZHU2hhZG93Um9vdCgpKQorICAgICAg
ICAgICAgaWYgKHJvb3QtPmlzU2hhZG93Um9vdCgpICYmIHJvb3QtPmlzU1ZHRWxlbWVudCgpKQog
ICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZWMgPSBSYW5nZUV4Y2VwdGlvbjo6
SU5WQUxJRF9OT0RFX1RZUEVfRVJSOwogICAgICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvZG9tL1NjcmlwdEVsZW1lbnQuY3BwIGIvU291cmNlL1dlYkNvcmUvZG9t
L1NjcmlwdEVsZW1lbnQuY3BwCmluZGV4IDg5NWU4MzMuLjg5OTM2NGMgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL2RvbS9TY3JpcHRFbGVtZW50LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9k
b20vU2NyaXB0RWxlbWVudC5jcHAKQEAgLTIwMSw3ICsyMDEsNyBAQCBib29sIFNjcmlwdEVsZW1l
bnQ6OnByZXBhcmVTY3JpcHQoY29uc3QgVGV4dFBvc2l0aW9uJiBzY3JpcHRTdGFydFBvc2l0aW9u
LCBMZWdhYwogCiAgICAgTm9kZSogYW5jZXN0b3IgPSBtX2VsZW1lbnQtPnBhcmVudE5vZGUoKTsK
ICAgICB3aGlsZSAoYW5jZXN0b3IpIHsKLSAgICAgICAgaWYgKGFuY2VzdG9yLT5pc1NWR1NoYWRv
d1Jvb3QoKSkgeworICAgICAgICBpZiAoYW5jZXN0b3ItPmlzU1ZHRWxlbWVudCgpICYmIGFuY2Vz
dG9yLT5pc1NoYWRvd1Jvb3QoKSkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJhYm9y
dGVkIHNjcmlwdDogc2hhZG93IHJvb3RcbiIpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwog
ICAgICAgICB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5jcHAKaW5kZXggMDc5NjUyZi4uOTQ0Y2Y5
YSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGFnZS9GcmFtZVZpZXcuY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BhZ2UvRnJhbWVWaWV3LmNwcApAQCAtMTE3NCw2ICsxMTc0LDEyIEBAIHZv
aWQgRnJhbWVWaWV3OjpsYXlvdXQoYm9vbCBhbGxvd1N1YnRyZWUpCiAgICAgSW5zcGVjdG9ySW5z
dHJ1bWVudGF0aW9uOjpkaWRMYXlvdXQoY29va2llKTsKIAogICAgIG1fbmVzdGVkTGF5b3V0Q291
bnQtLTsKKworI2lmbmRlZiBOREVCVUcKKyAgICBmb3IgKFJlbmRlck9iamVjdCogbyA9IGRvY3Vt
ZW50LT5yZW5kZXJlcigpOyBvOyBvID0gby0+bmV4dEluUHJlT3JkZXIoKSkKKyAgICAgICAgQVNT
RVJUKCFvLT5uZWVkc0xheW91dCgpKTsKKyNlbmRpZgorCiAgICAgaWYgKG1fbmVzdGVkTGF5b3V0
Q291bnQpCiAgICAgICAgIHJldHVybjsKIApAQCAtMjA2MSw2ICsyMDY3LDcgQEAgdm9pZCBGcmFt
ZVZpZXc6OnNjaGVkdWxlUmVsYXlvdXRPZlN1YnRyZWUoUmVuZGVyT2JqZWN0KiByZWxheW91dFJv
b3QpCiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1fbGF5b3V0U2NoZWR1bGluZ0VuYWJsZWQp
IHsKICAgICAgICAgaW50IGRlbGF5ID0gbV9mcmFtZS0+ZG9jdW1lbnQoKS0+bWluaW11bUxheW91
dERlbGF5KCk7CisgICAgICAgIEFTU0VSVCghcmVsYXlvdXRSb290LT5wYXJlbnQoKS0+bmVlZHNM
YXlvdXQoKSk7CiAgICAgICAgIG1fbGF5b3V0Um9vdCA9IHJlbGF5b3V0Um9vdDsKICAgICAgICAg
QVNTRVJUKCFtX2xheW91dFJvb3QtPmNvbnRhaW5lcigpIHx8ICFtX2xheW91dFJvb3QtPmNvbnRh
aW5lcigpLT5uZWVkc0xheW91dCgpKTsKICAgICAgICAgbV9kZWxheWVkTGF5b3V0ID0gZGVsYXkg
IT0gMDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3Qu
aCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuaAppbmRleCAxYmNkYTQ2
Li5jYmNiZDRlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2Jq
ZWN0LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5oCkBAIC0z
OTIsNiArMzkyLDcgQEAgcHVibGljOgogICAgIC8vIHRvIGFkZCBTVkcgcmVuZGVyZXIgbWV0aG9k
cyB0byBSZW5kZXJPYmplY3Qgd2l0aCBhbiBBU1NFUlRfTk9UX1JFQUNIRUQoKSBkZWZhdWx0IGlt
cGxlbWVudGF0aW9uLgogICAgIHZpcnR1YWwgYm9vbCBpc1NWR1Jvb3QoKSBjb25zdCB7IHJldHVy
biBmYWxzZTsgfQogICAgIHZpcnR1YWwgYm9vbCBpc1NWR0NvbnRhaW5lcigpIGNvbnN0IHsgcmV0
dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCBib29sIGlzU1ZHVHJhbnNmb3JtYWJsZUNvbnRhaW5l
cigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCBib29sIGlzU1ZHVmlld3Bv
cnRDb250YWluZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfSAKICAgICB2aXJ0dWFsIGJvb2wg
aXNTVkdHcmFkaWVudFN0b3AoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwg
Ym9vbCBpc1NWR0hpZGRlbkNvbnRhaW5lcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CkBAIC00
MDcsNyArNDA4LDYgQEAgcHVibGljOgogICAgIHZpcnR1YWwgYm9vbCBpc1NWR1Jlc291cmNlQ29u
dGFpbmVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNTVkdS
ZXNvdXJjZUZpbHRlcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCBib29s
IGlzU1ZHUmVzb3VyY2VGaWx0ZXJQcmltaXRpdmUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQot
ICAgIHZpcnR1YWwgYm9vbCBpc1NWR1NoYWRvd1RyZWVSb290Q29udGFpbmVyKCkgY29uc3QgeyBy
ZXR1cm4gZmFsc2U7IH0KIAogICAgIHZpcnR1YWwgUmVuZGVyU1ZHUmVzb3VyY2VDb250YWluZXIq
IHRvUmVuZGVyU1ZHUmVzb3VyY2VDb250YWluZXIoKTsKIApAQCAtMTA1NCw2ICsxMDU0LDEyIEBA
IGlubGluZSB2b2lkIFJlbmRlck9iamVjdDo6c2V0TmVlZHNMYXlvdXQoYm9vbCBiLCBib29sIG1h
cmtQYXJlbnRzKQogICAgICAgICBzZXROZWVkc1NpbXBsaWZpZWROb3JtYWxGbG93TGF5b3V0KGZh
bHNlKTsKICAgICAgICAgc2V0Tm9ybWFsQ2hpbGROZWVkc0xheW91dChmYWxzZSk7CiAgICAgICAg
IHNldE5lZWRzUG9zaXRpb25lZE1vdmVtZW50TGF5b3V0KGZhbHNlKTsKKyNpZm5kZWYgTkRFQlVH
CisgICAgICAgIGlmIChpc0JveCgpKSB7CisgICAgICAgICAgICBmb3IgKFJlbmRlck9iamVjdCog
byA9IGZpcnN0Q2hpbGQoKTsgbzsgbyA9IG8tPm5leHRTaWJsaW5nKCkpCisgICAgICAgICAgICAg
ICAgQVNTRVJUKG8tPmlzUG9zaXRpb25lZCgpIHx8ICFvLT5uZWVkc0xheW91dCgpKTsKKyAgICAg
ICAgfQorI2VuZGlmCiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvc3ZnL1JlbmRlclNWR0FsbEluT25lLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9zdmcvUmVuZGVyU1ZHQWxsSW5PbmUuY3BwCmluZGV4IDk4YmUxYmEuLmJlNmM4M2YgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHQWxsSW5PbmUuY3Bw
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHQWxsSW5PbmUuY3Bw
CkBAIC00OSw3ICs0OSw2IEBACiAjaW5jbHVkZSAiUmVuZGVyU1ZHUmVzb3VyY2VSYWRpYWxHcmFk
aWVudC5jcHAiCiAjaW5jbHVkZSAiUmVuZGVyU1ZHUmVzb3VyY2VTb2xpZENvbG9yLmNwcCIKICNp
bmNsdWRlICJSZW5kZXJTVkdSb290LmNwcCIKLSNpbmNsdWRlICJSZW5kZXJTVkdTaGFkb3dUcmVl
Um9vdENvbnRhaW5lci5jcHAiCiAjaW5jbHVkZSAiUmVuZGVyU1ZHU2hhcGUuY3BwIgogI2luY2x1
ZGUgIlJlbmRlclNWR1RTcGFuLmNwcCIKICNpbmNsdWRlICJSZW5kZXJTVkdUZXh0LmNwcCIKQEAg
LTY3LDcgKzY2LDYgQEAKICNpbmNsdWRlICJTVkdSZXNvdXJjZXNDYWNoZS5jcHAiCiAjaW5jbHVk
ZSAiU1ZHUmVzb3VyY2VzQ3ljbGVTb2x2ZXIuY3BwIgogI2luY2x1ZGUgIlNWR1Jvb3RJbmxpbmVC
b3guY3BwIgotI2luY2x1ZGUgIlNWR1NoYWRvd1RyZWVFbGVtZW50cy5jcHAiCiAjaW5jbHVkZSAi
U1ZHVGV4dENodW5rLmNwcCIKICNpbmNsdWRlICJTVkdUZXh0Q2h1bmtCdWlsZGVyLmNwcCIKICNp
bmNsdWRlICJTVkdUZXh0TGF5b3V0QXR0cmlidXRlcy5jcHAiCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR01vZGVsT2JqZWN0LmNwcCBiL1NvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHTW9kZWxPYmplY3QuY3BwCmluZGV4IDMzNzdm
YzAuLjUwODVkMDYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVu
ZGVyU1ZHTW9kZWxPYmplY3QuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcv
UmVuZGVyU1ZHTW9kZWxPYmplY3QuY3BwCkBAIC0xNjEsNyArMTYxLDcgQEAgc3RhdGljIGJvb2wg
aW50ZXJzZWN0c0FsbG93aW5nRW1wdHkoY29uc3QgRmxvYXRSZWN0JiByLCBjb25zdCBGbG9hdFJl
Y3QmIG90aGVyKQogLy8gaW1hZ2UsIGxpbmUsIHBhdGgsIHBvbHlnb24sIHBvbHlsaW5lLCByZWN0
LCB0ZXh0IGFuZCB1c2UuCiBzdGF0aWMgYm9vbCBpc0dyYXBoaWNzRWxlbWVudChSZW5kZXJPYmpl
Y3QqIHJlbmRlcmVyKQogewotICAgIHJldHVybiByZW5kZXJlci0+aXNTVkdTaGFwZSgpIHx8IHJl
bmRlcmVyLT5pc1NWR1RleHQoKSB8fCByZW5kZXJlci0+aXNTVkdJbWFnZSgpIHx8IHJlbmRlcmVy
LT5pc1NWR1NoYWRvd1RyZWVSb290Q29udGFpbmVyKCk7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5p
c1NWR1NoYXBlKCkgfHwgcmVuZGVyZXItPmlzU1ZHVGV4dCgpIHx8IHJlbmRlcmVyLT5pc1NWR0lt
YWdlKCkgfHwgcmVuZGVyZXItPm5vZGUoKS0+aGFzVGFnTmFtZShTVkdOYW1lczo6dXNlVGFnKTsK
IH0KIAogYm9vbCBSZW5kZXJTVkdNb2RlbE9iamVjdDo6Y2hlY2tJbnRlcnNlY3Rpb24oUmVuZGVy
T2JqZWN0KiByZW5kZXJlciwgY29uc3QgRmxvYXRSZWN0JiByZWN0KQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdSZXNvdXJjZUNsaXBwZXIuY3BwIGIv
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdSZXNvdXJjZUNsaXBwZXIuY3Bw
CmluZGV4IDM0ZGI1N2QuLmJhMjA1MDIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9zdmcvUmVuZGVyU1ZHUmVzb3VyY2VDbGlwcGVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR1Jlc291cmNlQ2xpcHBlci5jcHAKQEAgLTI0NCw3ICsy
NDQsNyBAQCBib29sIFJlbmRlclNWR1Jlc291cmNlQ2xpcHBlcjo6ZHJhd0NvbnRlbnRJbnRvTWFz
a0ltYWdlKENsaXBwZXJEYXRhKiBjbGlwcGVyRGF0YQogICAgICAgICAgICAgY29udGludWU7CiAK
ICAgICAgICAgV2luZFJ1bGUgbmV3Q2xpcFJ1bGUgPSBzdHlsZS0+c3ZnU3R5bGUoKS0+Y2xpcFJ1
bGUoKTsKLSAgICAgICAgYm9vbCBpc1VzZUVsZW1lbnQgPSByZW5kZXJlci0+aXNTVkdTaGFkb3dU
cmVlUm9vdENvbnRhaW5lcigpOworICAgICAgICBib29sIGlzVXNlRWxlbWVudCA9IGNoaWxkTm9k
ZS0+aGFzVGFnTmFtZShTVkdOYW1lczo6dXNlVGFnKTsKICAgICAgICAgaWYgKGlzVXNlRWxlbWVu
dCkgewogICAgICAgICAgICAgU1ZHVXNlRWxlbWVudCogdXNlRWxlbWVudCA9IHN0YXRpY19jYXN0
PFNWR1VzZUVsZW1lbnQqPihjaGlsZE5vZGUpOwogICAgICAgICAgICAgcmVuZGVyZXIgPSB1c2VF
bGVtZW50LT5yZW5kZXJlckNsaXBDaGlsZCgpOwpAQCAtMjc3LDcgKzI3Nyw3IEBAIHZvaWQgUmVu
ZGVyU1ZHUmVzb3VyY2VDbGlwcGVyOjpjYWxjdWxhdGVDbGlwQ29udGVudFJlcGFpbnRSZWN0KCkK
ICAgICAgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGNoaWxkTm9kZS0+cmVuZGVyZXIoKTsK
ICAgICAgICAgaWYgKCFjaGlsZE5vZGUtPmlzU1ZHRWxlbWVudCgpIHx8ICFzdGF0aWNfY2FzdDxT
VkdFbGVtZW50Kj4oY2hpbGROb2RlKS0+aXNTdHlsZWQoKSB8fCAhcmVuZGVyZXIpCiAgICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKCFyZW5kZXJlci0+aXNTVkdTaGFwZSgpICYmICFy
ZW5kZXJlci0+aXNTVkdUZXh0KCkgJiYgIXJlbmRlcmVyLT5pc1NWR1NoYWRvd1RyZWVSb290Q29u
dGFpbmVyKCkpCisgICAgICAgIGlmICghcmVuZGVyZXItPmlzU1ZHU2hhcGUoKSAmJiAhcmVuZGVy
ZXItPmlzU1ZHVGV4dCgpICYmICFjaGlsZE5vZGUtPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnVzZVRh
ZykpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0g
cmVuZGVyZXItPnN0eWxlKCk7CiAgICAgICAgIGlmICghc3R5bGUgfHwgc3R5bGUtPmRpc3BsYXko
KSA9PSBOT05FIHx8IHN0eWxlLT52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSkKQEAgLTMwNyw3ICsz
MDcsNyBAQCBib29sIFJlbmRlclNWR1Jlc291cmNlQ2xpcHBlcjo6aGl0VGVzdENsaXBDb250ZW50
KGNvbnN0IEZsb2F0UmVjdCYgb2JqZWN0Qm91bmRpbgogICAgICAgICBSZW5kZXJPYmplY3QqIHJl
bmRlcmVyID0gY2hpbGROb2RlLT5yZW5kZXJlcigpOwogICAgICAgICBpZiAoIWNoaWxkTm9kZS0+
aXNTVkdFbGVtZW50KCkgfHwgIXN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihjaGlsZE5vZGUpLT5p
c1N0eWxlZCgpIHx8ICFyZW5kZXJlcikKICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBp
ZiAoIXJlbmRlcmVyLT5pc1NWR1NoYXBlKCkgJiYgIXJlbmRlcmVyLT5pc1NWR1RleHQoKSAmJiAh
cmVuZGVyZXItPmlzU1ZHU2hhZG93VHJlZVJvb3RDb250YWluZXIoKSkKKyAgICAgICAgaWYgKCFy
ZW5kZXJlci0+aXNTVkdTaGFwZSgpICYmICFyZW5kZXJlci0+aXNTVkdUZXh0KCkgJiYgIWNoaWxk
Tm9kZS0+aGFzVGFnTmFtZShTVkdOYW1lczo6dXNlVGFnKSkKICAgICAgICAgICAgIGNvbnRpbnVl
OwogICAgICAgICBJbnRQb2ludCBoaXRQb2ludDsKICAgICAgICAgSGl0VGVzdFJlc3VsdCByZXN1
bHQoaGl0UG9pbnQpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9S
ZW5kZXJTVkdSZXNvdXJjZUNvbnRhaW5lci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
c3ZnL1JlbmRlclNWR1Jlc291cmNlQ29udGFpbmVyLmNwcAppbmRleCAyZTAzZTlmLi4yOTUyNDQy
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR1Jlc291
cmNlQ29udGFpbmVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRl
clNWR1Jlc291cmNlQ29udGFpbmVyLmNwcApAQCAtMjIsNyArMjIsNiBAQAogI2lmIEVOQUJMRShT
VkcpCiAjaW5jbHVkZSAiUmVuZGVyU1ZHUmVzb3VyY2VDb250YWluZXIuaCIKIAotI2luY2x1ZGUg
IlJlbmRlclNWR1NoYWRvd1RyZWVSb290Q29udGFpbmVyLmgiCiAjaW5jbHVkZSAiUmVuZGVyVmll
dy5oIgogI2luY2x1ZGUgIlNWR1Jlc291cmNlc0NhY2hlLmgiCiAjaW5jbHVkZSAiU1ZHU3R5bGVk
VHJhbnNmb3JtYWJsZUVsZW1lbnQuaCIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9zdmcvUmVuZGVyU1ZHVHJhbnNmb3JtYWJsZUNvbnRhaW5lci5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR1RyYW5zZm9ybWFibGVDb250YWluZXIuY3BwCmlu
ZGV4IDFkYjYzNjUuLjk2OTczOTAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9zdmcvUmVuZGVyU1ZHVHJhbnNmb3JtYWJsZUNvbnRhaW5lci5jcHAKKysrIGIvU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdUcmFuc2Zvcm1hYmxlQ29udGFpbmVyLmNwcApA
QCAtMjQsOCArMjQsNiBAQAogI2lmIEVOQUJMRShTVkcpCiAjaW5jbHVkZSAiUmVuZGVyU1ZHVHJh
bnNmb3JtYWJsZUNvbnRhaW5lci5oIgogCi0jaW5jbHVkZSAiU1ZHTmFtZXMuaCIKLSNpbmNsdWRl
ICJTVkdTaGFkb3dUcmVlRWxlbWVudHMuaCIKICNpbmNsdWRlICJTVkdTdHlsZWRUcmFuc2Zvcm1h
YmxlRWxlbWVudC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC0zOCwyOCArMzYsMTMgQEAg
UmVuZGVyU1ZHVHJhbnNmb3JtYWJsZUNvbnRhaW5lcjo6UmVuZGVyU1ZHVHJhbnNmb3JtYWJsZUNv
bnRhaW5lcihTVkdTdHlsZWRUcmFuc2YKIAogYm9vbCBSZW5kZXJTVkdUcmFuc2Zvcm1hYmxlQ29u
dGFpbmVyOjpjYWxjdWxhdGVMb2NhbFRyYW5zZm9ybSgpCiB7Ci0gICAgU1ZHU3R5bGVkVHJhbnNm
b3JtYWJsZUVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxTVkdTdHlsZWRUcmFuc2Zvcm1h
YmxlRWxlbWVudCo+KG5vZGUoKSk7Ci0KLSAgICBib29sIG5lZWRzVXBkYXRlID0gbV9uZWVkc1Ry
YW5zZm9ybVVwZGF0ZTsKLSAgICBpZiAobmVlZHNVcGRhdGUpIHsKLSAgICAgICAgbV9sb2NhbFRy
YW5zZm9ybSA9IGVsZW1lbnQtPmFuaW1hdGVkTG9jYWxUcmFuc2Zvcm0oKTsKLSAgICAgICAgbV9u
ZWVkc1RyYW5zZm9ybVVwZGF0ZSA9IGZhbHNlOwotICAgIH0KLQotICAgIGlmICghZWxlbWVudC0+
aGFzVGFnTmFtZShTVkdOYW1lczo6Z1RhZykgfHwgIXN0YXRpY19jYXN0PFNWR0dFbGVtZW50Kj4o
ZWxlbWVudCktPmlzU2hhZG93VHJlZUNvbnRhaW5lckVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJu
IG5lZWRzVXBkYXRlOworICAgIGlmICghbV9uZWVkc1RyYW5zZm9ybVVwZGF0ZSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOwogCi0gICAgU1ZHU2hhZG93VHJlZUNvbnRhaW5lckVsZW1lbnQqIHNoYWRv
d0VsZW1lbnQgPSBzdGF0aWNfY2FzdDxTVkdTaGFkb3dUcmVlQ29udGFpbmVyRWxlbWVudCo+KGVs
ZW1lbnQpOwotICAgIEZsb2F0U2l6ZSB0cmFuc2xhdGlvbiA9IHNoYWRvd0VsZW1lbnQtPmNvbnRh
aW5lclRyYW5zbGF0aW9uKCk7Ci0gICAgaWYgKCFzaGFkb3dFbGVtZW50LT5jb250YWluZXJPZmZz
ZXRDaGFuZ2VkKCkgJiYgIXRyYW5zbGF0aW9uLndpZHRoKCkgJiYgIXRyYW5zbGF0aW9uLmhlaWdo
dCgpKQotICAgICAgICByZXR1cm4gbmVlZHNVcGRhdGU7Ci0KLSAgICAvLyBGSVhNRTogQ291bGQg
b3B0aW1pemUgdGhpcyBjYXNlIGZvciB1c2UgdG8gYXZvaWQgcmVmZXRjaGluZyB0aGUgYW5pbWF0
ZWRMb2NhbFRyYW5zZm9ybSgpIGhlcmUsIGlmIG9ubHkgdGhlIGNvbnRhaW5lclRyYW5zbGF0aW9u
KCkgY2hhbmdlZC4KLSAgICBpZiAoIW5lZWRzVXBkYXRlKQotICAgICAgICBtX2xvY2FsVHJhbnNm
b3JtID0gZWxlbWVudC0+YW5pbWF0ZWRMb2NhbFRyYW5zZm9ybSgpOwotCi0gICAgbV9sb2NhbFRy
YW5zZm9ybS50cmFuc2xhdGUodHJhbnNsYXRpb24ud2lkdGgoKSwgdHJhbnNsYXRpb24uaGVpZ2h0
KCkpOwotICAgIHNoYWRvd0VsZW1lbnQtPnNldENvbnRhaW5lck9mZnNldENoYW5nZWQoZmFsc2Up
OworICAgIFNWR1N0eWxlZFRyYW5zZm9ybWFibGVFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nh
c3Q8U1ZHU3R5bGVkVHJhbnNmb3JtYWJsZUVsZW1lbnQqPihub2RlKCkpOworICAgIG1fbG9jYWxU
cmFuc2Zvcm0gPSBlbGVtZW50LT5hbmltYXRlZExvY2FsVHJhbnNmb3JtKCk7CisgICAgbV9sb2Nh
bFRyYW5zZm9ybS50cmFuc2xhdGUobV90cmFuc2xhdGlvbi53aWR0aCgpLCBtX3RyYW5zbGF0aW9u
LmhlaWdodCgpKTsKKyAgICBtX25lZWRzVHJhbnNmb3JtVXBkYXRlID0gZmFsc2U7CiAgICAgcmV0
dXJuIHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcv
UmVuZGVyU1ZHVHJhbnNmb3JtYWJsZUNvbnRhaW5lci5oIGIvU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL3N2Zy9SZW5kZXJTVkdUcmFuc2Zvcm1hYmxlQ29udGFpbmVyLmgKaW5kZXggNDAxYmZhOC4u
NjhiOGVmMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJT
VkdUcmFuc2Zvcm1hYmxlQ29udGFpbmVyLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L3N2Zy9SZW5kZXJTVkdUcmFuc2Zvcm1hYmxlQ29udGFpbmVyLmgKQEAgLTM0LDEzICszNCwzNiBA
QCBwdWJsaWM6CiAgICAgdmlydHVhbCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIGxvY2FsVG9QYXJl
bnRUcmFuc2Zvcm0oKSBjb25zdCB7IHJldHVybiBtX2xvY2FsVHJhbnNmb3JtOyB9CiAgICAgdmly
dHVhbCB2b2lkIHNldE5lZWRzVHJhbnNmb3JtVXBkYXRlKCkgeyBtX25lZWRzVHJhbnNmb3JtVXBk
YXRlID0gdHJ1ZTsgfQogCisgICAgLy8gVXNlZCB0byByZXByZXNlbnQgdGhlIHgveSB0cmFuc2xh
dGlvbiBvbiBhIDx1c2U+IHNoYWRvdyB0cmVlIGNvbnRhaW5lci4KKyAgICB2b2lkIHNldFRyYW5z
bGF0aW9uKGNvbnN0IEZsb2F0U2l6ZSYgdHJhbnNsYXRpb24pIHsgbV90cmFuc2xhdGlvbiA9IHRy
YW5zbGF0aW9uOyB9CisKIHByaXZhdGU6CisgICAgdmlydHVhbCBib29sIGlzU1ZHVHJhbnNmb3Jt
YWJsZUNvbnRhaW5lcigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICAvLyBGSVhNRTogT3Zl
cnJpZGUgcmVuZGVyTmFtZSBoZXJlLgorCiAgICAgdmlydHVhbCBib29sIGNhbGN1bGF0ZUxvY2Fs
VHJhbnNmb3JtKCk7CiAgICAgdmlydHVhbCBBZmZpbmVUcmFuc2Zvcm0gbG9jYWxUcmFuc2Zvcm0o
KSBjb25zdCB7IHJldHVybiBtX2xvY2FsVHJhbnNmb3JtOyB9CiAKICAgICBib29sIG1fbmVlZHNU
cmFuc2Zvcm1VcGRhdGUgOiAxOwogICAgIEFmZmluZVRyYW5zZm9ybSBtX2xvY2FsVHJhbnNmb3Jt
OworICAgIEZsb2F0U2l6ZSBtX3RyYW5zbGF0aW9uOwogfTsKKworaW5saW5lIFJlbmRlclNWR1Ry
YW5zZm9ybWFibGVDb250YWluZXIqIHRvUmVuZGVyU1ZHVHJhbnNmb3JtYWJsZUNvbnRhaW5lcihS
ZW5kZXJPYmplY3QqIG9iamVjdCkKK3sKKyAgICBBU1NFUlQoIW9iamVjdCB8fCBvYmplY3QtPmlz
U1ZHVHJhbnNmb3JtYWJsZUNvbnRhaW5lcigpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVu
ZGVyU1ZHVHJhbnNmb3JtYWJsZUNvbnRhaW5lcio+KG9iamVjdCk7Cit9CisKK2lubGluZSBjb25z
dCBSZW5kZXJTVkdDb250YWluZXIqIHRvUmVuZGVyU1ZHVHJhbnNmb3JtYWJsZUNvbnRhaW5lcihj
b25zdCBSZW5kZXJPYmplY3QqIG9iamVjdCkKK3sKKyAgICBBU1NFUlQoIW9iamVjdCB8fCBvYmpl
Y3QtPmlzU1ZHVHJhbnNmb3JtYWJsZUNvbnRhaW5lcigpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8Y29uc3QgUmVuZGVyU1ZHVHJhbnNmb3JtYWJsZUNvbnRhaW5lcio+KG9iamVjdCk7Cit9CisK
Ky8vIFRoaXMgd2lsbCBjYXRjaCBhbnlvbmUgZG9pbmcgYW4gdW5uZWNlc3NhcnkgY2FzdC4KK3Zv
aWQgdG9SZW5kZXJTVkdUcmFuc2Zvcm1hYmxlQ29udGFpbmVyKGNvbnN0IFJlbmRlclNWR1RyYW5z
Zm9ybWFibGVDb250YWluZXIqKTsKKwogfQogCiAjZW5kaWYgLy8gRU5BQkxFKFNWRykKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHVmlld3BvcnRDb250
YWluZXIuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHVmlld3BvcnRD
b250YWluZXIuaAppbmRleCA0MThmY2ZiLi4wY2UxMzI5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR1ZpZXdwb3J0Q29udGFpbmVyLmgKKysrIGIvU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdWaWV3cG9ydENvbnRhaW5lci5oCkBA
IC00MSw3ICs0MSw2IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNUcmFuc2Zv
cm1VcGRhdGUoKSB7IG1fbmVlZHNUcmFuc2Zvcm1VcGRhdGUgPSB0cnVlOyB9CiAKIHByaXZhdGU6
Ci0gICAgdmlydHVhbCBib29sIGlzU1ZHQ29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsg
fQogICAgIHZpcnR1YWwgYm9vbCBpc1NWR1ZpZXdwb3J0Q29udGFpbmVyKCkgY29uc3QgeyByZXR1
cm4gdHJ1ZTsgfQogICAgIHZpcnR1YWwgY29uc3QgY2hhciogcmVuZGVyTmFtZSgpIGNvbnN0IHsg
cmV0dXJuICJSZW5kZXJTVkdWaWV3cG9ydENvbnRhaW5lciI7IH0KIApkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvc3ZnL1NWR0VsZW1lbnRJbnN0YW5jZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9z
dmcvU1ZHRWxlbWVudEluc3RhbmNlLmNwcAppbmRleCBkMjNjMmNmLi4zMDM3MmE5IDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9zdmcvU1ZHRWxlbWVudEluc3RhbmNlLmNwcAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9zdmcvU1ZHRWxlbWVudEluc3RhbmNlLmNwcApAQCAtMTE3LDcgKzExNyw5IEBA
IHZvaWQgU1ZHRWxlbWVudEluc3RhbmNlOjppbnZhbGlkYXRlQWxsSW5zdGFuY2VzT2ZFbGVtZW50
KFNWR0VsZW1lbnQqIGVsZW1lbnQpCiAgICAgaWYgKHNldC5pc0VtcHR5KCkpCiAgICAgICAgIHJl
dHVybjsKIAotICAgIC8vIE1hcmsgYWxsIHVzZSBlbGVtZW50cyByZWZlcmVuY2luZyAnZWxlbWVu
dCcgZm9yIHJlYnVpbGRpbmcKKyAgICBWZWN0b3I8UmVmUHRyPFNWR1VzZUVsZW1lbnQ+ID4gdG9C
ZVVwZGF0ZWQ7CisKKyAgICAvLyBSZWJ1aWxkIHNoYWRvdyB0cmVlcwogICAgIGNvbnN0IEhhc2hT
ZXQ8U1ZHRWxlbWVudEluc3RhbmNlKj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IHNldC5lbmQoKTsK
ICAgICBmb3IgKEhhc2hTZXQ8U1ZHRWxlbWVudEluc3RhbmNlKj46OmNvbnN0X2l0ZXJhdG9yIGl0
ID0gc2V0LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewogICAgICAgICBBU1NFUlQoKCppdCkt
PnNoYWRvd1RyZWVFbGVtZW50KCkpOwpAQCAtMTI2LDExICsxMjgsMTQgQEAgdm9pZCBTVkdFbGVt
ZW50SW5zdGFuY2U6OmludmFsaWRhdGVBbGxJbnN0YW5jZXNPZkVsZW1lbnQoU1ZHRWxlbWVudCog
ZWxlbWVudCkKICAgICAgICAgKCppdCktPnNoYWRvd1RyZWVFbGVtZW50KCktPnNldENvcnJlc3Bv
bmRpbmdFbGVtZW50KDApOwogICAgICAgICBpZiAoU1ZHVXNlRWxlbWVudCogZWxlbWVudCA9ICgq
aXQpLT5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCgpKSB7CiAgICAgICAgICAgICBBU1NFUlQoZWxl
bWVudC0+aW5Eb2N1bWVudCgpKTsKLSAgICAgICAgICAgIGVsZW1lbnQtPmludmFsaWRhdGVTaGFk
b3dUcmVlKCk7CisgICAgICAgICAgICB0b0JlVXBkYXRlZC5hcHBlbmQoZWxlbWVudCk7CiAgICAg
ICAgIH0KICAgICB9CiAKLSAgICAvLyBCZSBzdXJlIHRvIHJlYnVpbGQgdXNlIHRyZWVzLCBpZiBu
ZWVkZWQKKyAgICB1bnNpZ25lZCB1cGRhdGVTaXplID0gdG9CZVVwZGF0ZWQuc2l6ZSgpOworICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdXBkYXRlU2l6ZTsgKytpKQorICAgICAgICB0b0JlVXBk
YXRlZFtpXS0+aW52YWxpZGF0ZVNoYWRvd1RyZWUoKTsKKwogICAgIGVsZW1lbnQtPmRvY3VtZW50
KCktPnVwZGF0ZUxheW91dElnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cygpOwogfQogCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9zdmcvU1ZHRm9udEZhY2VFbGVtZW50LmNwcCBiL1NvdXJjZS9X
ZWJDb3JlL3N2Zy9TVkdGb250RmFjZUVsZW1lbnQuY3BwCmluZGV4IGFmNzg5NTYuLjUxY2I3MzIg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N2Zy9TVkdGb250RmFjZUVsZW1lbnQuY3BwCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3N2Zy9TVkdGb250RmFjZUVsZW1lbnQuY3BwCkBAIC0zMjksNiAr
MzI5LDcgQEAgdm9pZCBTVkdGb250RmFjZUVsZW1lbnQ6OnJlbW92ZWRGcm9tRG9jdW1lbnQoKQog
ewogICAgIHJlbW92ZUZyb21NYXBwZWRFbGVtZW50U2hlZXQoKTsKICAgICBTVkdFbGVtZW50Ojpy
ZW1vdmVkRnJvbURvY3VtZW50KCk7CisgICAgbV9mb250RmFjZVJ1bGUtPmRlY2xhcmF0aW9uKCkt
PnBhcnNlRGVjbGFyYXRpb24oZW1wdHlTdHJpbmcoKSk7CiB9CiAKIHZvaWQgU1ZHRm9udEZhY2VF
bGVtZW50OjpjaGlsZHJlbkNoYW5nZWQoYm9vbCBjaGFuZ2VkQnlQYXJzZXIsIE5vZGUqIGJlZm9y
ZUNoYW5nZSwgTm9kZSogYWZ0ZXJDaGFuZ2UsIGludCBjaGlsZENvdW50RGVsdGEpCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9zdmcvU1ZHR0VsZW1lbnQuY3BwIGIvU291cmNlL1dlYkNvcmUv
c3ZnL1NWR0dFbGVtZW50LmNwcAppbmRleCA0ZjUzOWYyLi5lZWJiNWYzIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9zdmcvU1ZHR0VsZW1lbnQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N2
Zy9TVkdHRWxlbWVudC5jcHAKQEAgLTExMCw3ICsxMTAsOSBAQCBSZW5kZXJPYmplY3QqIFNWR0dF
bGVtZW50OjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSogYXJlbmEsIFJlbmRlclN0eWxlKiBz
dHlsZQogCiBib29sIFNWR0dFbGVtZW50OjpyZW5kZXJlcklzTmVlZGVkKGNvbnN0IE5vZGVSZW5k
ZXJpbmdDb250ZXh0JikKIHsKLSAgICByZXR1cm4gcGFyZW50Tm9kZSgpICYmIHBhcmVudE5vZGUo
KS0+aXNTVkdFbGVtZW50KCk7IAorICAgIGlmICghcGFyZW50Tm9kZSgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgcmV0dXJuIHBhcmVudE5vZGUoKS0+aXNTVkdFbGVtZW50KCkgfHwgcGFy
ZW50Tm9kZSgpLT5pc1NoYWRvd1Jvb3QoKTsKIH0KIAogfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvc3ZnL1NWR1N0eWxlZEVsZW1lbnQuY3BwIGIvU291cmNlL1dlYkNvcmUvc3ZnL1NWR1N0
eWxlZEVsZW1lbnQuY3BwCmluZGV4IDM3NjU1MWUuLjAxYWZiMmMgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL3N2Zy9TVkdTdHlsZWRFbGVtZW50LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9z
dmcvU1ZHU3R5bGVkRWxlbWVudC5jcHAKQEAgLTkxLDEzICs5MSwxMyBAQCBTdHJpbmcgU1ZHU3R5
bGVkRWxlbWVudDo6dGl0bGUoKSBjb25zdAogICAgIC8vIFdhbGsgdXAgdGhlIHRyZWUsIHRvIGZp
bmQgb3V0IHdoZXRoZXIgd2UncmUgaW5zaWRlIGEgPHVzZT4gc2hhZG93IHRyZWUsIHRvIGZpbmQg
dGhlIHJpZ2h0IHRpdGxlLgogICAgIE5vZGUqIHBhcmVudCA9IGNvbnN0X2Nhc3Q8U1ZHU3R5bGVk
RWxlbWVudCo+KHRoaXMpOwogICAgIHdoaWxlIChwYXJlbnQpIHsKLSAgICAgICAgaWYgKCFwYXJl
bnQtPmlzU1ZHU2hhZG93Um9vdCgpKSB7CisgICAgICAgIGlmICghcGFyZW50LT5pc1NoYWRvd1Jv
b3QoKSkgewogICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LT5wYXJlbnROb2RlR3VhcmFudGVl
ZEhvc3RGcmVlKCk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICAK
ICAgICAgICAgLy8gR2V0IHRoZSA8dXNlPiBlbGVtZW50LgotICAgICAgICBFbGVtZW50KiBzaGFk
b3dQYXJlbnQgPSBwYXJlbnQtPnN2Z1NoYWRvd0hvc3QoKTsKKyAgICAgICAgRWxlbWVudCogc2hh
ZG93UGFyZW50ID0gcGFyZW50LT5zaGFkb3dIb3N0KCk7CiAgICAgICAgIGlmIChzaGFkb3dQYXJl
bnQgJiYgc2hhZG93UGFyZW50LT5pc1NWR0VsZW1lbnQoKSAmJiBzaGFkb3dQYXJlbnQtPmhhc1Rh
Z05hbWUoU1ZHTmFtZXM6OnVzZVRhZykpIHsKICAgICAgICAgICAgIFNWR1VzZUVsZW1lbnQqIHVz
ZUVsZW1lbnQgPSBzdGF0aWNfY2FzdDxTVkdVc2VFbGVtZW50Kj4oc2hhZG93UGFyZW50KTsKICAg
ICAgICAgICAgIC8vIElmIHRoZSA8dXNlPiB0aXRsZSBpcyBub3QgZW1wdHkgd2UgZm91bmQgdGhl
IHRpdGxlIHRvIHVzZS4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N2Zy9TVkdVc2VFbGVt
ZW50LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N2Zy9TVkdVc2VFbGVtZW50LmNwcAppbmRleCBmZDdm
MmQyLi45MDI3Njk2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdmcvU1ZHVXNlRWxlbWVu
dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvc3ZnL1NWR1VzZUVsZW1lbnQuY3BwCkBAIC0zNCw3
ICszNCw4IEBACiAjaW5jbHVkZSAiTm9kZVJlbmRlclN0eWxlLmgiCiAjaW5jbHVkZSAiUmVnaXN0
ZXJlZEV2ZW50TGlzdGVuZXIuaCIKICNpbmNsdWRlICJSZW5kZXJTVkdSZXNvdXJjZS5oIgotI2lu
Y2x1ZGUgIlJlbmRlclNWR1NoYWRvd1RyZWVSb290Q29udGFpbmVyLmgiCisjaW5jbHVkZSAiUmVu
ZGVyU1ZHVHJhbnNmb3JtYWJsZUNvbnRhaW5lci5oIgorI2luY2x1ZGUgIlNoYWRvd1Jvb3QuaCIK
ICNpbmNsdWRlICJTVkdFbGVtZW50SW5zdGFuY2UuaCIKICNpbmNsdWRlICJTVkdFbGVtZW50UmFy
ZURhdGEuaCIKICNpbmNsdWRlICJTVkdFbGVtZW50SW5zdGFuY2VMaXN0LmgiCkBAIC00Myw3ICs0
NCw2IEBACiAjaW5jbHVkZSAiU1ZHTmFtZXMuaCIKICNpbmNsdWRlICJTVkdTTUlMRWxlbWVudC5o
IgogI2luY2x1ZGUgIlNWR1NWR0VsZW1lbnQuaCIKLSNpbmNsdWRlICJTVkdTaGFkb3dUcmVlRWxl
bWVudHMuaCIKICNpbmNsdWRlICJTVkdTeW1ib2xFbGVtZW50LmgiCiAjaW5jbHVkZSAiWExpbmtO
YW1lcy5oIgogI2luY2x1ZGUgIlhNTERvY3VtZW50UGFyc2VyLmgiCkBAIC04MywxMiArODMsOSBA
QCBpbmxpbmUgU1ZHVXNlRWxlbWVudDo6U1ZHVXNlRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1l
JiB0YWdOYW1lLCBEb2N1bWVudCogZG9jdQogICAgICwgbV93aWR0aChMZW5ndGhNb2RlV2lkdGgp
CiAgICAgLCBtX2hlaWdodChMZW5ndGhNb2RlSGVpZ2h0KQogICAgICwgbV91cGRhdGVzQmxvY2tl
ZChmYWxzZSkKLSAgICAsIG1fbmVlZHNTaGFkb3dUcmVlUmVjcmVhdGlvbihmYWxzZSkKIHsKICAg
ICBBU1NFUlQoaGFzVGFnTmFtZShTVkdOYW1lczo6dXNlVGFnKSk7CiAgICAgcmVnaXN0ZXJBbmlt
YXRlZFByb3BlcnRpZXNGb3JTVkdVc2VFbGVtZW50KCk7Ci0gICAgCi0gICAgc2V0SGFzQ3VzdG9t
V2lsbE9yRGlkUmVjYWxjU3R5bGUoKTsKIH0KIAogUGFzc1JlZlB0cjxTVkdVc2VFbGVtZW50PiBT
VkdVc2VFbGVtZW50OjpjcmVhdGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1l
bnQqIGRvY3VtZW50KQpAQCAtMzAyLDE1ICsyOTksMTggQEAgc3RhdGljIHZvaWQgdXBkYXRlQ29u
dGFpbmVyT2Zmc2V0KFNWR0VsZW1lbnRJbnN0YW5jZSogdGFyZ2V0SW5zdGFuY2UpCiAgICAgQVNT
RVJUKHNoYWRvd1RyZWVFbGVtZW50KTsKICAgICBBU1NFUlQoc2hhZG93VHJlZUVsZW1lbnQtPmhh
c1RhZ05hbWUoU1ZHTmFtZXM6OmdUYWcpKTsKIAotICAgIGlmICghc3RhdGljX2Nhc3Q8U1ZHR0Vs
ZW1lbnQqPihzaGFkb3dUcmVlRWxlbWVudCktPmlzU2hhZG93VHJlZUNvbnRhaW5lckVsZW1lbnQo
KSkKKyAgICBSZW5kZXJTVkdUcmFuc2Zvcm1hYmxlQ29udGFpbmVyKiBjb250YWluZXIgPSB0b1Jl
bmRlclNWR1RyYW5zZm9ybWFibGVDb250YWluZXIoc2hhZG93VHJlZUVsZW1lbnQtPnJlbmRlcmVy
KCkpOworICAgIGlmICghY29udGFpbmVyKQogICAgICAgICByZXR1cm47CiAKICAgICAvLyBTcGVj
OiBBbiBhZGRpdGlvbmFsIHRyYW5zZm9ybWF0aW9uIHRyYW5zbGF0ZSh4LHkpIGlzIGFwcGVuZGVk
IHRvIHRoZSBlbmQKICAgICAvLyAoaS5lLiwgcmlnaHQtc2lkZSkgb2YgdGhlIHRyYW5zZm9ybSBh
dHRyaWJ1dGUgb24gdGhlIGdlbmVyYXRlZCAnZycsIHdoZXJlIHgKICAgICAvLyBhbmQgeSByZXBy
ZXNlbnQgdGhlIHZhbHVlcyBvZiB0aGUgeCBhbmQgeSBhdHRyaWJ1dGVzIG9uIHRoZSAndXNlJyBl
bGVtZW50LiAKICAgICBTVkdVc2VFbGVtZW50KiB1c2VFbGVtZW50ID0gc3RhdGljX2Nhc3Q8U1ZH
VXNlRWxlbWVudCo+KGNvcnJlc3BvbmRpbmdFbGVtZW50KTsKLSAgICBTVkdTaGFkb3dUcmVlQ29u
dGFpbmVyRWxlbWVudCogY29udGFpbmVyRWxlbWVudCA9IHN0YXRpY19jYXN0PFNWR1NoYWRvd1Ry
ZWVDb250YWluZXJFbGVtZW50Kj4oc2hhZG93VHJlZUVsZW1lbnQpOwotICAgIGNvbnRhaW5lckVs
ZW1lbnQtPnNldENvbnRhaW5lck9mZnNldCh1c2VFbGVtZW50LT54KCksIHVzZUVsZW1lbnQtPnko
KSk7CisKKyAgICBTVkdMZW5ndGhDb250ZXh0IGxlbmd0aENvbnRleHQodXNlRWxlbWVudCk7Cisg
ICAgY29udGFpbmVyLT5zZXRUcmFuc2xhdGlvbihGbG9hdFNpemUodXNlRWxlbWVudC0+eCgpLnZh
bHVlKGxlbmd0aENvbnRleHQpLCB1c2VFbGVtZW50LT55KCkudmFsdWUobGVuZ3RoQ29udGV4dCkp
KTsKKyAgICBjb250YWluZXItPnNldE5lZWRzVHJhbnNmb3JtVXBkYXRlKCk7CiB9CiAKIHZvaWQg
U1ZHVXNlRWxlbWVudDo6dXBkYXRlQ29udGFpbmVyT2Zmc2V0cygpCkBAIC0zMjYsMTAgKzMyNiwx
MiBAQCB2b2lkIFNWR1VzZUVsZW1lbnQ6OnVwZGF0ZUNvbnRhaW5lck9mZnNldHMoKQogICAgIEFT
U0VSVChwYXJlbnROb2RlKTsKICAgICBBU1NFUlQocGFyZW50Tm9kZS0+aXNTVkdFbGVtZW50KCkp
OwogICAgIEFTU0VSVChwYXJlbnROb2RlLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpnVGFnKSk7Ci0g
ICAgQVNTRVJUKHN0YXRpY19jYXN0PFNWR0dFbGVtZW50Kj4ocGFyZW50Tm9kZSktPmlzU2hhZG93
VHJlZUNvbnRhaW5lckVsZW1lbnQoKSk7CiAKLSAgICBTVkdTaGFkb3dUcmVlQ29udGFpbmVyRWxl
bWVudCogY29udGFpbmVyRWxlbWVudCA9IHN0YXRpY19jYXN0PFNWR1NoYWRvd1RyZWVDb250YWlu
ZXJFbGVtZW50Kj4ocGFyZW50Tm9kZSk7Ci0gICAgY29udGFpbmVyRWxlbWVudC0+c2V0Q29udGFp
bmVyT2Zmc2V0KHgoKSwgeSgpKTsKKyAgICBpZiAoUmVuZGVyU1ZHVHJhbnNmb3JtYWJsZUNvbnRh
aW5lciogY29udGFpbmVyID0gdG9SZW5kZXJTVkdUcmFuc2Zvcm1hYmxlQ29udGFpbmVyKHBhcmVu
dE5vZGUtPnJlbmRlcmVyKCkpKSB7CisgICAgICAgIFNWR0xlbmd0aENvbnRleHQgbGVuZ3RoQ29u
dGV4dCh0aGlzKTsKKyAgICAgICAgY29udGFpbmVyLT5zZXRUcmFuc2xhdGlvbihGbG9hdFNpemUo
eCgpLnZhbHVlKGxlbmd0aENvbnRleHQpLCB5KCkudmFsdWUobGVuZ3RoQ29udGV4dCkpKTsKKyAg
ICAgICAgY29udGFpbmVyLT5zZXROZWVkc1RyYW5zZm9ybVVwZGF0ZSgpOworICAgIH0KIAogICAg
IC8vIFVwZGF0ZSB3aG9sZSBzdWJ0cmVlLCBzY2FubmluZyBmb3Igc2hhZG93IGNvbnRhaW5lciBl
bGVtZW50cywgbWFya2luZyBhIGNsb25lZCB1c2Ugc3VidHJlZQogICAgIHVwZGF0ZUNvbnRhaW5l
ck9mZnNldChtX3RhcmdldEVsZW1lbnRJbnN0YW5jZS5nZXQoKSk7CkBAIC0zMzgsMzUgKzM0MCw2
IEBAIHZvaWQgU1ZHVXNlRWxlbWVudDo6dXBkYXRlQ29udGFpbmVyT2Zmc2V0cygpCiAgICAgICAg
IFJlbmRlclNWR1Jlc291cmNlOjptYXJrRm9yTGF5b3V0QW5kUGFyZW50UmVzb3VyY2VJbnZhbGlk
YXRpb24ob2JqZWN0KTsKIH0KIAotYm9vbCBTVkdVc2VFbGVtZW50Ojp3aWxsUmVjYWxjU3R5bGUo
U3R5bGVDaGFuZ2UgY2hhbmdlKQotewotICAgIC8vIEV2ZW50dWFsbHkgbWFyayBzaGFkb3cgcm9v
dCBlbGVtZW50IG5lZWRpbmcgc3R5bGUgcmVjYWxjCi0gICAgaWYgKChjaGFuZ2UgPj0gSW5oZXJp
dCB8fCBuZWVkc1N0eWxlUmVjYWxjKCkgfHwgY2hpbGROZWVkc1N0eWxlUmVjYWxjKCkpICYmIG1f
dGFyZ2V0RWxlbWVudEluc3RhbmNlICYmICFtX3VwZGF0ZXNCbG9ja2VkKSB7Ci0gICAgICAgIGlm
IChTVkdFbGVtZW50KiBzaGFkb3dSb290ID0gbV90YXJnZXRFbGVtZW50SW5zdGFuY2UtPnNoYWRv
d1RyZWVFbGVtZW50KCkpCi0gICAgICAgICAgICBzaGFkb3dSb290LT5zZXROZWVkc1N0eWxlUmVj
YWxjKCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNWR1VzZUVsZW1lbnQ6
OmRpZFJlY2FsY1N0eWxlKFN0eWxlQ2hhbmdlIGNoYW5nZSkKLXsKLSAgICAvLyBBc3N1cmUgdGhh
dCB0aGUgc2hhZG93IHRyZWUgaGFzIG5vdCBiZWVuIG1hcmtlZCBmb3IgcmVjcmVhdGlvbiwgd2hp
bGUgd2UncmUgYnVpbGRpbmcgaXQuCi0gICAgaWYgKG1fdXBkYXRlc0Jsb2NrZWQpCi0gICAgICAg
IEFTU0VSVCghbV9uZWVkc1NoYWRvd1RyZWVSZWNyZWF0aW9uKTsKLQotICAgIFJlbmRlclNWR1No
YWRvd1RyZWVSb290Q29udGFpbmVyKiBzaGFkb3dSb290ID0gc3RhdGljX2Nhc3Q8UmVuZGVyU1ZH
U2hhZG93VHJlZVJvb3RDb250YWluZXIqPihyZW5kZXJlcigpKTsKLSAgICBpZiAoIXNoYWRvd1Jv
b3QpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBpZiAobV9uZWVkc1NoYWRvd1RyZWVSZWNy
ZWF0aW9uKSB7Ci0gICAgICAgIHNoYWRvd1Jvb3QtPm1hcmtTaGFkb3dUcmVlRm9yUmVjcmVhdGlv
bigpOwotICAgICAgICBtX25lZWRzU2hhZG93VHJlZVJlY3JlYXRpb24gPSBmYWxzZTsKLSAgICB9
Ci0KLSAgICBzaGFkb3dSb290LT51cGRhdGVGcm9tRWxlbWVudCgpOwotICAgIHNoYWRvd1Jvb3Qt
PnVwZGF0ZVN0eWxlKGNoYW5nZSk7Ci19Ci0KICNpZmRlZiBEVU1QX0lOU1RBTkNFX1RSRUUKIHZv
aWQgZHVtcEluc3RhbmNlVHJlZSh1bnNpZ25lZCBpbnQmIGRlcHRoLCBTdHJpbmcmIHRleHQsIFNW
R0VsZW1lbnRJbnN0YW5jZSogdGFyZ2V0SW5zdGFuY2UpCiB7CkBAIC00NDEsOSArNDE0LDYgQEAg
c3RhdGljIGJvb2wgc3VidHJlZUNvbnRhaW5zRGlzYWxsb3dlZEVsZW1lbnQoTm9kZSogc3RhcnQp
CiAKIHZvaWQgU1ZHVXNlRWxlbWVudDo6YnVpbGRQZW5kaW5nUmVzb3VyY2UoKQogewotICAgIC8v
IElmIHdlJ3JlIGNhbGxlZCB0aGUgZmlyc3QgdGltZSAoZHVyaW5nIHNoYWRvdyB0cmVlIHJvb3Qg
Y3JlYXRpb24gZnJvbSBSZW5kZXJTVkdTaGFkb3dUcmVlUm9vdENvbnRhaW5lcikKLSAgICAvLyB3
ZSBlaXRoZXIgZGV0ZXJtaW5lIHRoYXQgb3VyIHRhcmdldCBpcyBhdmFpbGFibGUgb3Igbm90IC0g
dGhlbiB3ZSBhZGQgb3Vyc2VsdmVzIHRvIHRoZSBwZW5kaW5nIHJlc291cmNlIGxpc3QKLSAgICAv
LyBPbmNlIHRoZSBwZW5kaW5nIHJlc291cmNlIGFwcGVhcnMsIGl0IHdpbGwgY2FsbCBidWlsZFBl
bmRpbmdSZXNvdXJjZSgpLCBzbyB3ZSdyZSBjYWxsZWQgYSBzZWNvbmQgdGltZS4KICAgICBTdHJp
bmcgaWQ7CiAgICAgRWxlbWVudCogdGFyZ2V0RWxlbWVudCA9IFNWR1VSSVJlZmVyZW5jZTo6dGFy
Z2V0RWxlbWVudEZyb21JUklTdHJpbmcoaHJlZigpLCBkb2N1bWVudCgpLCAmaWQpOwogICAgIEFT
U0VSVCghbV90YXJnZXRFbGVtZW50SW5zdGFuY2UpOwpAQCAtNDY2LDcgKzQzNiw3IEBAIHZvaWQg
U1ZHVXNlRWxlbWVudDo6YnVpbGRQZW5kaW5nUmVzb3VyY2UoKQogICAgIH0KIH0KIAotdm9pZCBT
VkdVc2VFbGVtZW50OjpidWlsZFNoYWRvd0FuZEluc3RhbmNlVHJlZShTVkdTaGFkb3dUcmVlUm9v
dEVsZW1lbnQqIHNoYWRvd1Jvb3QpCit2b2lkIFNWR1VzZUVsZW1lbnQ6OmJ1aWxkU2hhZG93QW5k
SW5zdGFuY2VUcmVlKCkKIHsKICAgICBzdHJ1Y3QgU2hhZG93VHJlZVVwZGF0ZUJsb2NrZXIgewog
ICAgICAgICBTaGFkb3dUcmVlVXBkYXRlQmxvY2tlcihTVkdVc2VFbGVtZW50KiBjdXJyZW50VXNl
RWxlbWVudCkKQEAgLTUwMCw3ICs0NzAsNyBAQCB2b2lkIFNWR1VzZUVsZW1lbnQ6OmJ1aWxkU2hh
ZG93QW5kSW5zdGFuY2VUcmVlKFNWR1NoYWRvd1RyZWVSb290RWxlbWVudCogc2hhZG93UgogICAg
IC8vIFRoZSB3aWxsIGJlIGV4cGFuZGVkIHNvb24gYW55d2F5IC0gc2VlIGV4cGFuZFVzZUVsZW1l
bnRzSW5TaGFkb3dUcmVlKCkuCiAgICAgQ29udGFpbmVyTm9kZSogcGFyZW50ID0gcGFyZW50Tm9k
ZSgpOwogICAgIHdoaWxlIChwYXJlbnQpIHsKLSAgICAgICAgaWYgKHBhcmVudC0+aXNTVkdTaGFk
b3dSb290KCkpCisgICAgICAgIGlmIChwYXJlbnQtPmlzU2hhZG93Um9vdCgpKQogICAgICAgICAg
ICAgcmV0dXJuOwogCiAgICAgICAgIHBhcmVudCA9IHBhcmVudC0+cGFyZW50Tm9kZUd1YXJhbnRl
ZWRIb3N0RnJlZSgpOwpAQCAtNTQ2LDM0ICs1MTYsMzQgQEAgdm9pZCBTVkdVc2VFbGVtZW50Ojpi
dWlsZFNoYWRvd0FuZEluc3RhbmNlVHJlZShTVkdTaGFkb3dUcmVlUm9vdEVsZW1lbnQqIHNoYWRv
d1IKICAgICBBU1NFUlQobV90YXJnZXRFbGVtZW50SW5zdGFuY2UtPmNvcnJlc3BvbmRpbmdVc2VF
bGVtZW50KCkgPT0gdGhpcyk7CiAgICAgQVNTRVJUKG1fdGFyZ2V0RWxlbWVudEluc3RhbmNlLT5k
aXJlY3RVc2VFbGVtZW50KCkgPT0gdGhpcyk7CiAgICAgQVNTRVJUKG1fdGFyZ2V0RWxlbWVudElu
c3RhbmNlLT5jb3JyZXNwb25kaW5nRWxlbWVudCgpID09IHRhcmdldCk7CisgICAgQVNTRVJUKG1f
c2hhZG93VHJlZVJvb3RFbGVtZW50KTsKIAogICAgIC8vIEJ1aWxkIHNoYWRvdyB0cmVlIGZyb20g
aW5zdGFuY2UgdHJlZQogICAgIC8vIFRoaXMgYWxzbyBoYW5kbGVzIHRoZSBzcGVjaWFsIGNhc2Vz
OiA8dXNlPiBvbiA8c3ltYm9sPiwgPHVzZT4gb24gPHN2Zz4uCi0gICAgYnVpbGRTaGFkb3dUcmVl
KHNoYWRvd1Jvb3QsIHRhcmdldCwgbV90YXJnZXRFbGVtZW50SW5zdGFuY2UuZ2V0KCkpOworICAg
IGJ1aWxkU2hhZG93VHJlZSh0YXJnZXQsIG1fdGFyZ2V0RWxlbWVudEluc3RhbmNlLmdldCgpKTsK
IAogICAgIC8vIEV4cGFuZCBhbGwgPHVzZT4gZWxlbWVudHMgaW4gdGhlIHNoYWRvdyB0cmVlLgog
ICAgIC8vIEV4cGFuZCBtZWFuczogcmVwbGFjZSB0aGUgYWN0dWFsIDx1c2U+IGVsZW1lbnQgYnkg
d2hhdCBpdCByZWZlcmVuY2VzLgotICAgIGV4cGFuZFVzZUVsZW1lbnRzSW5TaGFkb3dUcmVlKHNo
YWRvd1Jvb3QpOworICAgIGV4cGFuZFVzZUVsZW1lbnRzSW5TaGFkb3dUcmVlKG1fc2hhZG93VHJl
ZVJvb3RFbGVtZW50LmdldCgpKTsKIAogICAgIC8vIEV4cGFuZCBhbGwgPHN5bWJvbD4gZWxlbWVu
dHMgaW4gdGhlIHNoYWRvdyB0cmVlLgogICAgIC8vIEV4cGFuZCBtZWFuczogcmVwbGFjZSB0aGUg
YWN0dWFsIDxzeW1ib2w+IGVsZW1lbnQgYnkgdGhlIDxzdmc+IGVsZW1lbnQuCi0gICAgZXhwYW5k
U3ltYm9sRWxlbWVudHNJblNoYWRvd1RyZWUoc2hhZG93Um9vdCk7CisgICAgZXhwYW5kU3ltYm9s
RWxlbWVudHNJblNoYWRvd1RyZWUobV9zaGFkb3dUcmVlUm9vdEVsZW1lbnQuZ2V0KCkpOwogCiAg
ICAgLy8gTm93IHRoYXQgdGhlIHNoYWRvdyB0cmVlIGlzIGNvbXBsZXRseSBleHBhbmRlZCwgd2Ug
Y2FuIGFzc29jaWF0ZQogICAgIC8vIHNoYWRvdyB0cmVlIGVsZW1lbnRzIDwtPiBpbnN0YW5jZXMg
aW4gdGhlIGluc3RhbmNlIHRyZWUuCi0gICAgYXNzb2NpYXRlSW5zdGFuY2VzV2l0aFNoYWRvd1Ry
ZWVFbGVtZW50cyhzaGFkb3dSb290LT5maXJzdENoaWxkKCksIG1fdGFyZ2V0RWxlbWVudEluc3Rh
bmNlLmdldCgpKTsKKyAgICBhc3NvY2lhdGVJbnN0YW5jZXNXaXRoU2hhZG93VHJlZUVsZW1lbnRz
KG1fc2hhZG93VHJlZVJvb3RFbGVtZW50LT5maXJzdENoaWxkKCksIG1fdGFyZ2V0RWxlbWVudElu
c3RhbmNlLmdldCgpKTsKIAogICAgIC8vIElmIG5vIHNoYWRvdyB0cmVlIGVsZW1lbnQgaXMgcHJl
c2VudCwgdGhpcyBtZWFucyB0aGF0IHRoZSByZWZlcmVuY2Ugcm9vdAogICAgIC8vIGVsZW1lbnQg
d2FzIHJlbW92ZWQsIGFzIGl0IGlzIGRpc2FsbG93ZWQgKGllLiA8dXNlPiBvbiA8Zm9yZWlnbk9i
amVjdD4pCiAgICAgLy8gRG8gTk9UIGxlYXZlIGFuIGluY29uc2lzdGVudCBpbnN0YW5jZSB0cmVl
IGFyb3VuZCwgaW5zdGVhZCBkZXN0cnVjdCBpdC4KICAgICBpZiAoIW1fdGFyZ2V0RWxlbWVudElu
c3RhbmNlLT5zaGFkb3dUcmVlRWxlbWVudCgpKSB7Ci0gICAgICAgIHNoYWRvd1Jvb3QtPnJlbW92
ZUFsbENoaWxkcmVuKCk7CiAgICAgICAgIGRldGFjaEluc3RhbmNlKCk7CiAgICAgICAgIHJldHVy
bjsKICAgICB9CiAKICAgICAvLyBDb25zaXN0ZW5jeSBjaGVja3MgLSB0aGlzIGlzIGFzc3VtZWQg
aW4gdXBkYXRlQ29udGFpbmVyT2Zmc2V0KCkuCi0gICAgQVNTRVJUKG1fdGFyZ2V0RWxlbWVudElu
c3RhbmNlLT5zaGFkb3dUcmVlRWxlbWVudCgpLT5wYXJlbnROb2RlKCkgPT0gc2hhZG93Um9vdCk7
CisgICAgQVNTRVJUKG1fdGFyZ2V0RWxlbWVudEluc3RhbmNlLT5zaGFkb3dUcmVlRWxlbWVudCgp
LT5wYXJlbnROb2RlKCkgPT0gbV9zaGFkb3dUcmVlUm9vdEVsZW1lbnQuZ2V0KCkpOwogCiAgICAg
Ly8gVHJhbnNmZXIgZXZlbnQgbGlzdGVuZXJzIGFzc2lnbmVkIHRvIHRoZSByZWZlcmVuY2VkIGVs
ZW1lbnQgdG8gb3VyIHNoYWRvdyB0cmVlIGVsZW1lbnRzLgogICAgIHRyYW5zZmVyRXZlbnRMaXN0
ZW5lcnNUb1NoYWRvd1RyZWUobV90YXJnZXRFbGVtZW50SW5zdGFuY2UuZ2V0KCkpOwpAQCAtNjAw
LDcgKzU3MCw3IEBAIHZvaWQgU1ZHVXNlRWxlbWVudDo6YnVpbGRTaGFkb3dBbmRJbnN0YW5jZVRy
ZWUoU1ZHU2hhZG93VHJlZVJvb3RFbGVtZW50KiBzaGFkb3dSCiAKICAgICBSZWZQdHI8WE1MU2Vy
aWFsaXplcj4gc2VyaWFsaXplciA9IFhNTFNlcmlhbGl6ZXI6OmNyZWF0ZSgpOwogCi0gICAgU3Ry
aW5nIG1hcmt1cCA9IHNlcmlhbGl6ZXItPnNlcmlhbGl6ZVRvU3RyaW5nKHNoYWRvd1Jvb3QsIGVj
KTsKKyAgICBTdHJpbmcgbWFya3VwID0gc2VyaWFsaXplci0+c2VyaWFsaXplVG9TdHJpbmcobV9z
aGFkb3dUcmVlUm9vdEVsZW1lbnQuZ2V0KCksIGVjKTsKICAgICBBU1NFUlQoIWVjKTsKIAogICAg
IGZwcmludGYoc3RkZXJyLCAiRHVtcGluZyA8dXNlPiBzaGFkb3cgdHJlZSBtYXJrdXA6XG4lc1xu
IiwgbWFya3VwLmxhdGluMSgpLmRhdGEoKSk7CkBAIC02MDksNiArNTc5LDkgQEAgdm9pZCBTVkdV
c2VFbGVtZW50OjpidWlsZFNoYWRvd0FuZEluc3RhbmNlVHJlZShTVkdTaGFkb3dUcmVlUm9vdEVs
ZW1lbnQqIHNoYWRvd1IKIAogdm9pZCBTVkdVc2VFbGVtZW50OjpkZXRhY2hJbnN0YW5jZSgpCiB7
CisgICAgaWYgKG1fc2hhZG93VHJlZVJvb3RFbGVtZW50KQorICAgICAgICBtX3NoYWRvd1RyZWVS
b290RWxlbWVudC0+cmVtb3ZlQWxsQ2hpbGRyZW4oKTsKKwogICAgIGlmICghbV90YXJnZXRFbGVt
ZW50SW5zdGFuY2UpCiAgICAgICAgIHJldHVybjsKICAgICBtX3RhcmdldEVsZW1lbnRJbnN0YW5j
ZS0+ZGV0YWNoKCk7CkBAIC02MTcsMjEgKzU5MCwyNSBAQCB2b2lkIFNWR1VzZUVsZW1lbnQ6OmRl
dGFjaEluc3RhbmNlKCkKIAogUmVuZGVyT2JqZWN0KiBTVkdVc2VFbGVtZW50OjpjcmVhdGVSZW5k
ZXJlcihSZW5kZXJBcmVuYSogYXJlbmEsIFJlbmRlclN0eWxlKikKIHsKLSAgICByZXR1cm4gbmV3
IChhcmVuYSkgUmVuZGVyU1ZHU2hhZG93VHJlZVJvb3RDb250YWluZXIodGhpcyk7CisgICAgcmV0
dXJuIG5ldyAoYXJlbmEpIFJlbmRlclNWR1RyYW5zZm9ybWFibGVDb250YWluZXIodGhpcyk7CiB9
CiAKLXN0YXRpYyB2b2lkIHVwZGF0ZUZyb21FbGVtZW50Q2FsbGJhY2soTm9kZSogbm9kZSwgdW5z
aWduZWQpCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRlU2hhZG93VHJlZUNhbGxiYWNrKE5vZGUqIG5v
ZGUsIHVuc2lnbmVkKQogewotICAgIGlmIChSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbm9kZS0+
cmVuZGVyZXIoKSkKLSAgICAgICAgcmVuZGVyZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7CisgICAg
c3RhdGljX2Nhc3Q8U1ZHVXNlRWxlbWVudCo+KG5vZGUpLT5pbnZhbGlkYXRlU2hhZG93VHJlZSgp
OwogfQogCiB2b2lkIFNWR1VzZUVsZW1lbnQ6OmF0dGFjaCgpCiB7CisgICAgaWYgKCFtX3NoYWRv
d1RyZWVSb290RWxlbWVudCkgeworICAgICAgICBtX3NoYWRvd1RyZWVSb290RWxlbWVudCA9IFNW
R0dFbGVtZW50OjpjcmVhdGUoU1ZHTmFtZXM6OmdUYWcsIGRvY3VtZW50KCkpOworICAgICAgICBl
bnN1cmVTaGFkb3dSb290KCktPmFwcGVuZENoaWxkKG1fc2hhZG93VHJlZVJvb3RFbGVtZW50Lmdl
dCgpKTsKKyAgICB9CisKICAgICBTVkdTdHlsZWRUcmFuc2Zvcm1hYmxlRWxlbWVudDo6YXR0YWNo
KCk7CiAKICAgICBpZiAocmVuZGVyZXIoKSkKLSAgICAgICAgcXVldWVQb3N0QXR0YWNoQ2FsbGJh
Y2sodXBkYXRlRnJvbUVsZW1lbnRDYWxsYmFjaywgdGhpcyk7CisgICAgICAgIHF1ZXVlUG9zdEF0
dGFjaENhbGxiYWNrKGludmFsaWRhdGVTaGFkb3dUcmVlQ2FsbGJhY2ssIHRoaXMpOwogfQogCiB2
b2lkIFNWR1VzZUVsZW1lbnQ6OmRldGFjaCgpCkBAIC03NzksNyArNzU2LDcgQEAgdm9pZCBTVkdV
c2VFbGVtZW50OjpyZW1vdmVEaXNhbGxvd2VkRWxlbWVudHNGcm9tU3VidHJlZShOb2RlKiBzdWJ0
cmVlKQogICAgIH0KIH0KIAotdm9pZCBTVkdVc2VFbGVtZW50OjpidWlsZFNoYWRvd1RyZWUoU1ZH
U2hhZG93VHJlZVJvb3RFbGVtZW50KiBzaGFkb3dSb290LCBTVkdFbGVtZW50KiB0YXJnZXQsIFNW
R0VsZW1lbnRJbnN0YW5jZSogdGFyZ2V0SW5zdGFuY2UpCit2b2lkIFNWR1VzZUVsZW1lbnQ6OmJ1
aWxkU2hhZG93VHJlZShTVkdFbGVtZW50KiB0YXJnZXQsIFNWR0VsZW1lbnRJbnN0YW5jZSogdGFy
Z2V0SW5zdGFuY2UpCiB7CiAgICAgLy8gRm9yIGluc3RhbmNlIDx1c2U+IG9uIDxmb3JlaWduT2Jq
ZWN0PiAoZGlyZWN0IGNhc2UpLgogICAgIGlmIChpc0Rpc2FsbG93ZWRFbGVtZW50KHRhcmdldCkp
CkBAIC04MDEsNyArNzc4LDcgQEAgdm9pZCBTVkdVc2VFbGVtZW50OjpidWlsZFNoYWRvd1RyZWUo
U1ZHU2hhZG93VHJlZVJvb3RFbGVtZW50KiBzaGFkb3dSb290LCBTVkdFbGUKICAgICBBU1NFUlRf
VU5VU0VEKG5ld0NoaWxkUHRyLCBuZXdDaGlsZFB0cik7CiAKICAgICBFeGNlcHRpb25Db2RlIGVj
ID0gMDsKLSAgICBzaGFkb3dSb290LT5hcHBlbmRDaGlsZChuZXdDaGlsZC5yZWxlYXNlKCksIGVj
KTsKKyAgICBtX3NoYWRvd1RyZWVSb290RWxlbWVudC0+YXBwZW5kQ2hpbGQobmV3Q2hpbGQucmVs
ZWFzZSgpLCBlYyk7CiAgICAgQVNTRVJUKCFlYyk7CiB9CiAKQEAgLTgyNCw3ICs4MDEsNyBAQCB2
b2lkIFNWR1VzZUVsZW1lbnQ6OmV4cGFuZFVzZUVsZW1lbnRzSW5TaGFkb3dUcmVlKE5vZGUqIGVs
ZW1lbnQpCiAKICAgICAgICAgLy8gRG9uJ3QgQVNTRVJUKHRhcmdldCkgaGVyZSwgaXQgbWF5IGJl
ICJwZW5kaW5nIiwgdG9vLgogICAgICAgICAvLyBTZXR1cCBzdWItc2hhZG93IHRyZWUgcm9vdCBu
b2RlCi0gICAgICAgIFJlZlB0cjxTVkdTaGFkb3dUcmVlQ29udGFpbmVyRWxlbWVudD4gY2xvbmVQ
YXJlbnQgPSBTVkdTaGFkb3dUcmVlQ29udGFpbmVyRWxlbWVudDo6Y3JlYXRlKGRvY3VtZW50KCkp
OworICAgICAgICBSZWZQdHI8U1ZHR0VsZW1lbnQ+IGNsb25lUGFyZW50ID0gU1ZHR0VsZW1lbnQ6
OmNyZWF0ZShTVkdOYW1lczo6Z1RhZywgZG9jdW1lbnQoKSk7CiAgICAgICAgIHVzZS0+Y2xvbmVD
aGlsZE5vZGVzKGNsb25lUGFyZW50LmdldCgpKTsKIAogICAgICAgICAvLyBTcGVjOiBJbiB0aGUg
Z2VuZXJhdGVkIGNvbnRlbnQsIHRoZSAndXNlJyB3aWxsIGJlIHJlcGxhY2VkIGJ5ICdnJywgd2hl
cmUgYWxsIGF0dHJpYnV0ZXMgZnJvbSB0aGUKQEAgLTEwMDYsMTIgKzk4MywxMSBAQCBTVkdFbGVt
ZW50SW5zdGFuY2UqIFNWR1VzZUVsZW1lbnQ6Omluc3RhbmNlRm9yU2hhZG93VHJlZUVsZW1lbnQo
Tm9kZSogZWxlbWVudCwgUwogCiB2b2lkIFNWR1VzZUVsZW1lbnQ6OmludmFsaWRhdGVTaGFkb3dU
cmVlKCkKIHsKLSAgICAvLyBEb24ndCBtdXRhdGUgdGhlIHNoYWRvdyB0cmVlIHdoaWxlIHdlJ3Jl
IGJ1aWxkaW5nIGl0LgogICAgIGlmIChtX3VwZGF0ZXNCbG9ja2VkKQogICAgICAgICByZXR1cm47
Ci0KLSAgICBtX25lZWRzU2hhZG93VHJlZVJlY3JlYXRpb24gPSB0cnVlOwotICAgIHNldE5lZWRz
U3R5bGVSZWNhbGMoKTsKKyAgICBBU1NFUlQobV9zaGFkb3dUcmVlUm9vdEVsZW1lbnQpOworICAg
IGRldGFjaEluc3RhbmNlKCk7CisgICAgYnVpbGRTaGFkb3dBbmRJbnN0YW5jZVRyZWUoKTsKIH0K
IAogdm9pZCBTVkdVc2VFbGVtZW50Ojp0cmFuc2ZlclVzZUF0dHJpYnV0ZXNUb1JlcGxhY2VkRWxl
bWVudChTVkdFbGVtZW50KiBmcm9tLCBTVkdFbGVtZW50KiB0bykgY29uc3QKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3N2Zy9TVkdVc2VFbGVtZW50LmggYi9Tb3VyY2UvV2ViQ29yZS9zdmcv
U1ZHVXNlRWxlbWVudC5oCmluZGV4IDBkOWMwNmUuLmYyYjExYTIgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL3N2Zy9TVkdVc2VFbGVtZW50LmgKKysrIGIvU291cmNlL1dlYkNvcmUvc3ZnL1NW
R1VzZUVsZW1lbnQuaApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgIlNWR0FuaW1hdGVkQm9v
bGVhbi5oIgogI2luY2x1ZGUgIlNWR0FuaW1hdGVkTGVuZ3RoLmgiCiAjaW5jbHVkZSAiU1ZHRXh0
ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZC5oIgorI2luY2x1ZGUgIlNWR0dFbGVtZW50LmgiCiAjaW5j
bHVkZSAiU1ZHTGFuZ1NwYWNlLmgiCiAjaW5jbHVkZSAiU1ZHU3R5bGVkVHJhbnNmb3JtYWJsZUVs
ZW1lbnQuaCIKICNpbmNsdWRlICJTVkdUZXN0cy5oIgpAQCAtMzMsNyArMzQsNiBAQAogbmFtZXNw
YWNlIFdlYkNvcmUgewogCiBjbGFzcyBTVkdFbGVtZW50SW5zdGFuY2U7Ci1jbGFzcyBTVkdTaGFk
b3dUcmVlUm9vdEVsZW1lbnQ7CiAKIGNsYXNzIFNWR1VzZUVsZW1lbnQgOiBwdWJsaWMgU1ZHU3R5
bGVkVHJhbnNmb3JtYWJsZUVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFNW
R1Rlc3RzLApAQCAtNDYsOCArNDYsMTEgQEAgcHVibGljOgogICAgIFNWR0VsZW1lbnRJbnN0YW5j
ZSogaW5zdGFuY2VSb290KCk7CiAgICAgU1ZHRWxlbWVudEluc3RhbmNlKiBhbmltYXRlZEluc3Rh
bmNlUm9vdCgpIGNvbnN0OwogICAgIFNWR0VsZW1lbnRJbnN0YW5jZSogaW5zdGFuY2VGb3JTaGFk
b3dUcmVlRWxlbWVudChOb2RlKikgY29uc3Q7CisKICAgICB2b2lkIGludmFsaWRhdGVTaGFkb3dU
cmVlKCk7CisgICAgdm9pZCBjcmVhdGVBbmRBcHBlbmRTaGFkb3dUcmVlUm9vdEVsZW1lbnQoKTsK
IAorICAgIFNWR0dFbGVtZW50KiBzaGFkb3dUcmVlUm9vdEVsZW1lbnQoKSBjb25zdCB7IHJldHVy
biBtX3NoYWRvd1RyZWVSb290RWxlbWVudC5nZXQoKTsgfQogICAgIFJlbmRlck9iamVjdCogcmVu
ZGVyZXJDbGlwQ2hpbGQoKSBjb25zdDsKIAogcHJpdmF0ZToKQEAgLTY0LDkgKzY3LDYgQEAgcHJp
dmF0ZToKICAgICB2aXJ0dWFsIHZvaWQgcGFyc2VBdHRyaWJ1dGUoQXR0cmlidXRlKikgT1ZFUlJJ
REU7CiAgICAgdmlydHVhbCB2b2lkIHN2Z0F0dHJpYnV0ZUNoYW5nZWQoY29uc3QgUXVhbGlmaWVk
TmFtZSYpOwogCi0gICAgdmlydHVhbCBib29sIHdpbGxSZWNhbGNTdHlsZShTdHlsZUNoYW5nZSk7
Ci0gICAgdmlydHVhbCB2b2lkIGRpZFJlY2FsY1N0eWxlKFN0eWxlQ2hhbmdlKTsKLQogICAgIHZp
cnR1YWwgUmVuZGVyT2JqZWN0KiBjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSosIFJlbmRlclN0
eWxlKik7CiAgICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwogICAgIHZpcnR1YWwgdm9pZCBkZXRh
Y2goKTsKQEAgLTc3LDkgKzc3LDcgQEAgcHJpdmF0ZToKIAogICAgIHZvaWQgc2V0VXBkYXRlc0Js
b2NrZWQoYm9vbCBibG9ja2VkKSB7IG1fdXBkYXRlc0Jsb2NrZWQgPSBibG9ja2VkOyB9CiAKLSAg
ICBmcmllbmQgY2xhc3MgUmVuZGVyU1ZHU2hhZG93VHJlZVJvb3RDb250YWluZXI7Ci0gICAgZnJp
ZW5kIGNsYXNzIFNWR0VsZW1lbnQ7Ci0gICAgdm9pZCBidWlsZFNoYWRvd0FuZEluc3RhbmNlVHJl
ZShTVkdTaGFkb3dUcmVlUm9vdEVsZW1lbnQqKTsKKyAgICB2b2lkIGJ1aWxkU2hhZG93QW5kSW5z
dGFuY2VUcmVlKCk7CiAgICAgdm9pZCBkZXRhY2hJbnN0YW5jZSgpOwogCiAgICAgdmlydHVhbCBi
b29sIHNlbGZIYXNSZWxhdGl2ZUxlbmd0aHMoKSBjb25zdDsKQEAgLTg5LDcgKzg3LDcgQEAgcHJp
dmF0ZToKICAgICBib29sIGhhc0N5Y2xlVXNlUmVmZXJlbmNpbmcoU1ZHVXNlRWxlbWVudCosIFNW
R0VsZW1lbnRJbnN0YW5jZSogdGFyZ2V0SW5zdGFuY2UsIFNWR0VsZW1lbnQqJiBuZXdUYXJnZXQp
OwogCiAgICAgLy8gU2hhZG93IHRyZWUgaGFuZGxpbmcKLSAgICB2b2lkIGJ1aWxkU2hhZG93VHJl
ZShTVkdTaGFkb3dUcmVlUm9vdEVsZW1lbnQqLCBTVkdFbGVtZW50KiB0YXJnZXQsIFNWR0VsZW1l
bnRJbnN0YW5jZSogdGFyZ2V0SW5zdGFuY2UpOworICAgIHZvaWQgYnVpbGRTaGFkb3dUcmVlKFNW
R0VsZW1lbnQqIHRhcmdldCwgU1ZHRWxlbWVudEluc3RhbmNlKiB0YXJnZXRJbnN0YW5jZSk7CiAK
ICAgICB2b2lkIGV4cGFuZFVzZUVsZW1lbnRzSW5TaGFkb3dUcmVlKE5vZGUqIGVsZW1lbnQpOwog
ICAgIHZvaWQgZXhwYW5kU3ltYm9sRWxlbWVudHNJblNoYWRvd1RyZWUoTm9kZSogZWxlbWVudCk7
CkBAIC0xMTksOSArMTE3LDkgQEAgcHJpdmF0ZToKICAgICB2aXJ0dWFsIHZvaWQgc3luY2hyb25p
emVTeXN0ZW1MYW5ndWFnZSgpIHsgU1ZHVGVzdHM6OnN5bmNocm9uaXplU3lzdGVtTGFuZ3VhZ2Uo
dGhpcyk7IH0KIAogICAgIGJvb2wgbV91cGRhdGVzQmxvY2tlZDsKLSAgICBib29sIG1fbmVlZHNT
aGFkb3dUcmVlUmVjcmVhdGlvbjsKICAgICBTdHJpbmcgbV9yZXNvdXJjZUlkOwogICAgIFJlZlB0
cjxTVkdFbGVtZW50SW5zdGFuY2U+IG1fdGFyZ2V0RWxlbWVudEluc3RhbmNlOworICAgIFJlZlB0
cjxTVkdHRWxlbWVudD4gbV9zaGFkb3dUcmVlUm9vdEVsZW1lbnQ7CiB9OwogCiB9CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9zdmcvYW5pbWF0aW9uL1NWR1NNSUxFbGVtZW50LmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL3N2Zy9hbmltYXRpb24vU1ZHU01JTEVsZW1lbnQuY3BwCmluZGV4IDlkNzEw
MmYuLmU0MjFjZGQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N2Zy9hbmltYXRpb24vU1ZH
U01JTEVsZW1lbnQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N2Zy9hbmltYXRpb24vU1ZHU01J
TEVsZW1lbnQuY3BwCkBAIC0xOTUsNyArMTk1LDcgQEAgdm9pZCBTVkdTTUlMRWxlbWVudDo6aW5z
ZXJ0ZWRJbnRvRG9jdW1lbnQoKQogI2lmbmRlZiBOREVCVUcKICAgICAvLyBWZXJpZnkgd2UgYXJl
IG5vdCBpbiA8dXNlPiBpbnN0YW5jZSB0cmVlLgogICAgIGZvciAoQ29udGFpbmVyTm9kZSogbiA9
IHRoaXM7IG47IG4gPSBuLT5wYXJlbnROb2RlKCkpCi0gICAgICAgIEFTU0VSVCghbi0+aXNTVkdT
aGFkb3dSb290KCkpOworICAgICAgICBBU1NFUlQoIW4tPmlzU2hhZG93Um9vdCgpKTsKICNlbmRp
ZgogICAgIG1fYXR0cmlidXRlTmFtZSA9IGNvbnN0cnVjdFF1YWxpZmllZE5hbWUodGhpcywgZmFz
dEdldEF0dHJpYnV0ZShTVkdOYW1lczo6YXR0cmlidXRlTmFtZUF0dHIpKTsKICAgICBTVkdTVkdF
bGVtZW50KiBvd25lciA9IG93bmVyU1ZHRWxlbWVudCgpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>128185</attachid>
            <date>2012-02-22 05:40:57 -0800</date>
            <delta_ts>2012-02-22 06:46:56 -0800</delta_ts>
            <desc>Patch v1</desc>
            <filename>bug-78902-20120222144035.patch</filename>
            <type>text/plain</type>
            <size>0</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64"></data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>128203</attachid>
            <date>2012-02-22 06:47:30 -0800</date>
            <delta_ts>2012-02-25 02:44:08 -0800</delta_ts>
            <desc>Patch v2</desc>
            <filename>bug-78902-20120222154709.patch</filename>
            <type>text/plain</type>
            <size>0</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64"></data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>128862</attachid>
            <date>2012-02-25 02:54:09 -0800</date>
            <delta_ts>2012-02-28 03:39:11 -0800</delta_ts>
            <desc>Patch v3</desc>
            <filename>bug-78902-20120225115348.patch</filename>
            <type>text/plain</type>
            <size>0</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64"></data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129223</attachid>
            <date>2012-02-28 03:40:37 -0800</date>
            <delta_ts>2012-03-27 12:48:53 -0700</delta_ts>
            <desc>Patch v4</desc>
            <filename>bug-78902-20120228124018.patch</filename>
            <type>text/plain</type>
            <size>0</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64"></data>

          </attachment>
      

    </bug>

</bugzilla>