<?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>78275</bug_id>
          
          <creation_ts>2012-02-09 12:57:15 -0800</creation_ts>
          <short_desc>[BlackBerry] Upstream BlackBerry WebCoreSupport FrameLoaderClientBlackBerry class</short_desc>
          <delta_ts>2012-02-15 01:19:24 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>73144</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Jacky Jiang">jkjiang</reporter>
          <assigned_to name="Jacky Jiang">jkjiang</assigned_to>
          <cc>dbates</cc>
    
    <cc>rwlbuis</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>zimmermann</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>553434</commentid>
    <comment_count>0</comment_count>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2012-02-09 12:57:15 -0800</bug_when>
    <thetext>Upstream BlackBerry WebCoreSupport FrameLoaderClientBlackBerry class.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554371</commentid>
    <comment_count>1</comment_count>
      <attachid>126578</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2012-02-10 14:01:50 -0800</bug_when>
    <thetext>Created attachment 126578
Patch

Note: Local self reviewed diff is here webkit/ad907cc8b91037c255883c2cf3e8c34ffe13aa3c</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554397</commentid>
    <comment_count>2</comment_count>
      <attachid>126578</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-10 14:32:22 -0800</bug_when>
    <thetext>Comment on attachment 126578
Patch

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

Looks good, but I think it can be cleaned up some more.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:68
&gt; +#include &lt;SkBitmap.h&gt;

You probably do not need this.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:72
&gt; +using WTF::String;

I think this means that below you dont have to do WTF::String, but just String.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:180
&gt; +void FrameLoaderClientBlackBerry::dispatchDecidePolicyForResponse(FramePolicyFunction function, const WebCore::ResourceResponse&amp; response, const WebCore::ResourceRequest&amp; request)

Remove WebCore prefix.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:185
&gt; +    if (WebCore::contentDispositionType(response.httpHeaderField(&quot;Content-Disposition&quot;)) == WebCore::ContentDispositionAttachment

Remove WebCore prefix.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:211
&gt; +    // Let the client have a chance to say whether this navigation should take

take?

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:213
&gt; +

No need for empty line

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:491
&gt; +void FrameLoaderClientBlackBerry::dispatchDidReceiveResponse(WebCore::DocumentLoader*, unsigned long identifier, const WebCore::ResourceResponse&amp; response)

Remove WebCore prefix.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:723
&gt; +        if (WebCore::isBackForwardLoadType(m_frame-&gt;loader()-&gt;loadType())) {

Remove WebCore prefix.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:804
&gt; +        return WebCore::ObjectContentOtherPlugin;

Remove WebCore prefix.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:918
&gt; +    BackForwardListImpl* backForwardList = static_cast&lt;WebCore::BackForwardListImpl*&gt;(m_webPagePrivate-&gt;m_page-&gt;backForward()-&gt;client());

Remove WebCore prefix.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:997
&gt; +    if (WebCore::isBackForwardLoadType(loader-&gt;loadType())) {

Remove WebCore prefix.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:1209
&gt; +    Image* img = WebCore::iconDatabase().synchronousIconForPageURL(url, IntSize(10, 10));

Remove WebCore prefix.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:1210
&gt; +    WTF::String iconUrl = WebCore::iconDatabase().synchronousIconURLForPageURL(url);

Remove WebCore prefix.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.h:26
&gt; +#include &quot;HTMLFormElement.h&quot;

Can be a forward reference. For all of the above please check if you can do the same.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.h:33
&gt; +class WebPluginClient;

Is this one needed?

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.h:153
&gt; +    virtual WTF::PassRefPtr&lt;Frame&gt; createFrame(const KURL&amp;, const String&amp;, HTMLFrameOwnerElement*, const String&amp;, bool, int, int);

You can probably remove WTF:: from PassRefPtr everywhere in the header.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554496</commentid>
    <comment_count>3</comment_count>
      <attachid>126604</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2012-02-10 16:39:55 -0800</bug_when>
    <thetext>Created attachment 126604
Patch

Update the patch based on Rob&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554947</commentid>
    <comment_count>4</comment_count>
      <attachid>126604</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-12 19:12:08 -0800</bug_when>
    <thetext>Comment on attachment 126604
Patch

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

Can still be cleaned up some more.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:537
&gt; +        SecurityPolicy::addOriginAccessWhitelistEntry(*securityOrigin, String(&quot;tel&quot;), String(&quot;&quot;), true);

All of the above cases should use emptyString instead of &quot;&quot;.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:591
&gt; +    RefPtr&lt;NodeList&gt; nodeList = headElement-&gt;getElementsByTagName(&quot;meta&quot;);

Can you use HTMLNames::metaTag here?

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:618
&gt; +    nodeList = headElement-&gt;getElementsByTagName(&quot;link&quot;);

Can you use HTMLNames::linkTag here?

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:815
&gt; +    if (m_pluginView) {

Please do early return here.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:1208
&gt; +    Image* img = iconDatabase().synchronousIconForPageURL(url, IntSize(10, 10));

Better add early return here: if (!img || !img-&gt;data()) return;

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:1209
&gt; +    String iconUrl = iconDatabase().synchronousIconURLForPageURL(url);

This can be moved to below just before it is actually being used.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:1211
&gt; +        NativeImageSkia* bitmap= img-&gt;nativeImageForCurrentFrame();

add space before &apos;=&apos;

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:1224
&gt; +    RefPtr&lt;NodeList&gt; nodeList = m_frame-&gt;document()-&gt;getElementsByTagName(&quot;video&quot;);

Can you use HTMLNames::videoTag here?

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:1227
&gt; +    nodeList = m_frame-&gt;document()-&gt;getElementsByTagName(&quot;audio&quot;);

Can you use HTMLNames::audioTag here?

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:1233
&gt; +    nodeList = m_frame-&gt;document()-&gt;getElementsByTagName(&quot;img&quot;);

Can you use HTMLNames::imgTag here?

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:1247
&gt; +    // and then when the user navigates back, it will scroll to the right position.

I would do s/and then/Then

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.h:121
&gt; +    virtual ResourceError interruptedForPolicyChangeError(const ResourceRequest&amp;) { notImplemented(); return ResourceError(&quot;&quot;, 0, &quot;&quot;, &quot;&quot;); }

Please use emptyString for &quot;&quot;.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.h:122
&gt; +    virtual ResourceError cancelledError(const ResourceRequest&amp;) { notImplemented(); return ResourceError(&quot;&quot;, 0, &quot;&quot;, &quot;&quot;); }

Ditto.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.h:123
&gt; +    virtual ResourceError blockedError(const ResourceRequest&amp;) { notImplemented(); return ResourceError(&quot;&quot;, 0, &quot;&quot;, &quot;&quot;); }

Ditto.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.h:125
&gt; +    virtual ResourceError interruptForPolicyChangeError(const ResourceRequest&amp;) { notImplemented(); return ResourceError(&quot;&quot;, 0, &quot;&quot;, &quot;&quot;); }

Ditto.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.h:126
&gt; +    virtual ResourceError cannotShowMIMETypeError(const ResourceResponse&amp;) { notImplemented(); return ResourceError(&quot;&quot;, 0, &quot;&quot;, &quot;&quot;); }

Ditto.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.h:127
&gt; +    virtual ResourceError fileDoesNotExistError(const ResourceResponse&amp;) { notImplemented(); return ResourceError(&quot;&quot;, 0, &quot;&quot;, &quot;&quot;); }

Ditto.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.h:128
&gt; +    virtual ResourceError pluginWillHandleLoadError(const ResourceResponse&amp;) { notImplemented(); return ResourceError(&quot;&quot;, 0, &quot;&quot;, &quot;&quot;); }

Ditto.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.h:154
&gt; +    virtual PassRefPtr&lt;Widget&gt; createPlugin(const IntSize&amp;, HTMLPlugInElement*, const KURL&amp;, const WTF::Vector&lt;String, 0u&gt;&amp;, const WTF::Vector&lt;String, 0u&gt;&amp;, const String&amp;, bool);

You probably do not need the WTF prefix here. Is the 0u param needed at all?

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.h:156
&gt; +    virtual PassRefPtr&lt;Widget&gt; createJavaAppletWidget(const IntSize&amp;, HTMLAppletElement*, const KURL&amp;, const WTF::Vector&lt;String, 0u&gt;&amp;, const WTF::Vector&lt;String, 0u&gt;&amp;) { notImplemented(); return 0; }

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555525</commentid>
    <comment_count>5</comment_count>
      <attachid>126818</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2012-02-13 13:37:27 -0800</bug_when>
    <thetext>Created attachment 126818
Patch

Update the patch based on Rob&apos;s comments. Local diff is here webkit/0c604f46e7254a45d3c4217e5c3233565f50208d</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555618</commentid>
    <comment_count>6</comment_count>
      <attachid>126818</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-13 14:40:23 -0800</bug_when>
    <thetext>Comment on attachment 126818
Patch

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

Looks good, still a few things to fix.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:52
&gt; +#include &quot;NotImplemented.h&quot;

Not needed, included in header.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:56
&gt; +#include &quot;RenderEmbeddedObject.h&quot;

You don&apos;t need this one. Please check all other includes as well.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:329
&gt; +        return pluginView;

No need for temp var pluginView.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:375
&gt; +        // received, even for the case of a document with no data (like about:blank)

Add a period to the end of line to make it a proper sentence.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:386
&gt; +    // (unless it already has a token, in which case the request came from the client)

Ditto.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:434
&gt; +                        true);                            /*lock the mode*/

Might as well try to align the comments.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:523
&gt; +    // Whitelist all known protocols if BrowserField2 requires unrestricted requests.

What is BrowserField2?

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:553
&gt; +        // SubstituteData in dispatchDidFailProvisionalLoad)

Add a period to the end of line to make it a proper sentence.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:887
&gt; +    // Provide the extension object first in case the client or others want to use it

Add a period.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.h:23
&gt; +#include &quot;FormState.h&quot;

Maybe you don&apos;t need FormState include.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>556383</commentid>
    <comment_count>7</comment_count>
      <attachid>126996</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2012-02-14 10:19:03 -0800</bug_when>
    <thetext>Created attachment 126996
Patch

Update the patch based on Rob&apos;s comments, filed a PR138431 for the CrossOrigin settings.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>556415</commentid>
    <comment_count>8</comment_count>
      <attachid>126996</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-14 11:03:23 -0800</bug_when>
    <thetext>Comment on attachment 126996
Patch

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

Almost there, needs a bit more cleaning up.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:72
&gt; +using namespace BlackBerry::WebKit;

This means that below you can remove BlackBerry::WebKit usage. So BlackBerry::WebKit::WebSettings becomes just WebSettings for example.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:403
&gt; +    // In Frame::createView, Frame&apos;s FrameView object is set to 0 and  recreated.

one space too much between &apos;and&apos; and &apos;recreated&apos;.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:427
&gt; +                        true);                                 /*lock the mode*/

It is a bit cleaner to do this style /* lock the mode */ everywhere here.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:468
&gt; +

Remove one empty line here.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:616
&gt; +

Remove on empty line.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.cpp:691
&gt; +

Remove empty line here.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.h:26
&gt; +#include &quot;Widget.h&quot;

This include can probably be removed. Please check whether we need DocumentLoader and Frame includes.

&gt; Source/WebKit/blackberry/WebCoreSupport/FrameLoaderClientBlackBerry.h:38
&gt; +class HTMLFormElement;

These can be removed since FrameLoaderClient does this as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>556464</commentid>
    <comment_count>9</comment_count>
      <attachid>127010</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2012-02-14 11:58:21 -0800</bug_when>
    <thetext>Created attachment 127010
Patch

Update the patch based on Rob&apos;s comments above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>556538</commentid>
    <comment_count>10</comment_count>
      <attachid>127010</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-14 13:13:40 -0800</bug_when>
    <thetext>Comment on attachment 127010
Patch

Looks good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>556586</commentid>
    <comment_count>11</comment_count>
      <attachid>127010</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-14 14:09:37 -0800</bug_when>
    <thetext>Comment on attachment 127010
Patch

Clearing flags on attachment: 127010

Committed r107734: &lt;http://trac.webkit.org/changeset/107734&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>556587</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-14 14:09:43 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>557027</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-15 01:19:24 -0800</bug_when>
    <thetext>Attachment 126996 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/update-webkit&apos;]&quot; exit_code: 9

Updating OpenSource
	M	ChangeLog
	A	LayoutTests/fast/css/style-scoped/registering-shadowroot-expected.txt
	A	LayoutTests/fast/css/style-scoped/registering-shadowroot.html
	M	LayoutTests/ChangeLog
	M	Source/WebCore/WebCore.exp.in
	M	Source/WebCore/testing/Internals.cpp
	M	Source/WebCore/testing/Internals.h
	M	Source/WebCore/testing/Internals.idl
	M	Source/WebCore/dom/ShadowRootList.h
	M	Source/WebCore/dom/ShadowRootList.cpp
	M	Source/WebCore/dom/Element.cpp
	M	Source/WebCore/dom/Node.h
	M	Source/WebCore/dom/Element.h
	M	Source/WebCore/dom/NodeRareData.h
	M	Source/WebCore/dom/Node.cpp
	M	Source/WebCore/dom/ElementRareData.h
	M	Source/WebCore/ChangeLog
	M	Source/WebCore/html/HTMLStyleElement.cpp
	M	Source/autotools/symbols.filter
	M	Source/WebKit2/ChangeLog
	M	Source/WebKit2/win/WebKit2CFLite.def
	M	Source/WebKit2/win/WebKit2.def
r107793 = 2ce77d76874b9ee77991fecb540696485733202a (refs/remotes/origin/master)
First, rewinding head to replay your work on top of it...
Applying: [Mac][Win][WK2] Switch to RFC 6455 protocol for WebSockets
Using index info to reconstruct a base tree...
&lt;stdin&gt;:1578: trailing whitespace.
        
&lt;stdin&gt;:1647: trailing whitespace.
    
&lt;stdin&gt;:1657: trailing whitespace.
    
&lt;stdin&gt;:1672: trailing whitespace.
        return 0;        
&lt;stdin&gt;:1674: trailing whitespace.
    
warning: squelched 7 whitespace errors
warning: 12 lines add whitespace errors.
Falling back to patching base and 3-way merge...
warning: too many files (created: 168755 deleted: 3), skipping inexact rename detection
Auto-merging LayoutTests/ChangeLog
CONFLICT (content): Merge conflict in LayoutTests/ChangeLog
Auto-merging LayoutTests/platform/wk2/Skipped
Auto-merging Source/WebCore/ChangeLog
CONFLICT (content): Merge conflict in Source/WebCore/ChangeLog
Auto-merging Source/WebCore/css/CSSCalculationValue.cpp
Auto-merging Source/WebCore/css/CSSCalculationValue.h
Auto-merging Source/WebCore/css/CSSParser.cpp
Auto-merging Source/WebKit/mac/ChangeLog
CONFLICT (content): Merge conflict in Source/WebKit/mac/ChangeLog
Auto-merging Source/WebKit2/ChangeLog
CONFLICT (content): Merge conflict in Source/WebKit2/ChangeLog
Auto-merging Tools/ChangeLog
CONFLICT (content): Merge conflict in Tools/ChangeLog
Failed to merge in the changes.
Patch failed at 0001 [Mac][Win][WK2] Switch to RFC 6455 protocol for WebSockets

When you have resolved this problem run &quot;git rebase --continue&quot;.
If you would prefer to skip this patch, instead run &quot;git rebase --skip&quot;.
To restore the original branch and stop rebasing run &quot;git rebase --abort&quot;.

rebase refs/remotes/origin/master: command returned error: 1

Died at Tools/Scripts/update-webkit line 164.


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126578</attachid>
            <date>2012-02-10 14:01:50 -0800</date>
            <delta_ts>2012-02-10 16:39:50 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78275-20120210170126.patch</filename>
            <type>text/plain</type>
            <size>69407</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3MTA5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDljM2E2NmRhNThjMjhhYjI5
YzQwMjQ5YzBhNTcwYTg2YTA1N2IwNTIuLjk5YjE5MjRhZDQyMTU2YzBhN2VhZGM5OTA1YmFiNzEz
MDdjYjkyMGMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTItMDItMTAgIEphY2t5IEpp
YW5nICA8emhhamlhbmdAcmltLmNvbT4KKworICAgICAgICBbQmxhY2tCZXJyeV0gVXBzdHJlYW0g
QmxhY2tCZXJyeSBXZWJDb3JlU3VwcG9ydCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkgY2xh
c3MKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc4Mjc1
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW5pdGlh
bCB1cHN0cmVhbSwgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJDb3Jl
U3VwcG9ydC9GcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkuY3BwOiBBZGRlZC4KKyAgICAgICAg
KiBibGFja2JlcnJ5L1dlYkNvcmVTdXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeS5o
OiBBZGRlZC4KKwogMjAxMi0wMi0wOCAgUm9iIEJ1aXMgIDxyYnVpc0ByaW0uY29tPgogCiAgICAg
ICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBEdW1wUmVuZGVyVHJlZUJsYWNrQmVycnkKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRl
ckNsaWVudEJsYWNrQmVycnkuY3BwIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYkNvcmVT
dXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZGE5NTM4
MjE3YzcyOTkxZDAwZjFkYjVlNzU2M2FhZTNiOGE5OGZkMgotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRlckNsaWVudEJs
YWNrQmVycnkuY3BwCkBAIC0wLDAgKzEsMTI4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl
CisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5LmgiCisKKyNpbmNsdWRlICJCYWNr
Rm9yd2FyZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJCYWNrRm9yd2FyZExpc3RJbXBsLmgiCisj
aW5jbHVkZSAiQmFja2luZ1N0b3JlQ2xpZW50LmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlX3Au
aCIKKyNpbmNsdWRlICJCYXNlNjQuaCIKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2luY2x1
ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUgIkNocm9tZUNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNs
dWRlICJDbGllbnRFeHRlbnNpb24uaCIKKyNpbmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCisjaW5j
bHVkZSAiRHVtcFJlbmRlclRyZWVDbGllbnQuaCIKKyNpbmNsdWRlICJGcmFtZU5ldHdvcmtpbmdD
b250ZXh0QmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhU
TUxIZWFkRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxJbWFnZUVsZW1lbnQuaCIKKyNpbmNsdWRl
ICJIVE1MTGlua0VsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MTWVkaWFFbGVtZW50LmgiCisjaW5j
bHVkZSAiSFRNTE1ldGFFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFBsdWdJbkVsZW1lbnQuaCIK
KyNpbmNsdWRlICJIVFRQUGFyc2Vycy5oIgorI2luY2x1ZGUgIkhpc3RvcnlJdGVtLmgiCisjaW5j
bHVkZSAiSWNvbkRhdGFiYXNlLmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJJbnB1
dEhhbmRsZXIuaCIKKyNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAiTmF0
aXZlSW1hZ2VTa2lhLmgiCisjaW5jbHVkZSAiTmV0d29ya01hbmFnZXIuaCIKKyNpbmNsdWRlICJO
b2RlTGlzdC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGFnZS5o
IgorI2luY2x1ZGUgIlBsdWdpblZpZXcuaCIKKyNpbmNsdWRlICJQcm9ncmVzc1RyYWNrZXIuaCIK
KyNpbmNsdWRlICJSZW5kZXJFbWJlZGRlZE9iamVjdC5oIgorI2luY2x1ZGUgIlNjb3BlUG9pbnRl
ci5oIgorI2luY2x1ZGUgIlNlY3VyaXR5UG9saWN5LmgiCisjaW5jbHVkZSAiU2hhcmVkQnVmZmVy
LmgiCisjaW5jbHVkZSAiVGV4dEVuY29kaW5nLmgiCisjaW5jbHVkZSAiVG91Y2hFdmVudEhhbmRs
ZXIuaCIKKyNpZiBFTkFCTEUoV0VCRE9NKQorI2luY2x1ZGUgIldlYkRPTURvY3VtZW50LmgiCisj
ZW5kaWYKKyNpbmNsdWRlICJXZWJQYWdlQ2xpZW50LmgiCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5
UGxhdGZvcm1Mb2cuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1TY3JlZW4uaD4KKyNp
bmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9BUElDYXN0Lmg+CisjaW5jbHVkZSA8U2tCaXRtYXAuaD4K
KyNpbmNsdWRlIDxuZXR3b3JrL0ZpbHRlclN0cmVhbS5oPgorI2luY2x1ZGUgPG5ldHdvcmsvTmV0
d29ya1JlcXVlc3QuaD4KKwordXNpbmcgV1RGOjpTdHJpbmc7Cit1c2luZyBuYW1lc3BhY2UgV2Vi
Q29yZTsKK3VzaW5nIG5hbWVzcGFjZSBCbGFja0JlcnJ5OjpXZWJLaXQ7CisKKy8vIFRoaXMgd2Fz
IGNvcGllZCBmcm9tIGZpbGUgIldlYktpdC9Tb3VyY2UvV2ViS2l0L21hYy9NaXNjL1dlYktpdEVy
cm9ycy5oIi4KK2VudW0geworICAgIFdlYktpdEVycm9yQ2Fubm90U2hvd01JTUVUeXBlID0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwKKyAgICBXZWJLaXRFcnJvckNhbm5vdFNob3dV
UkwgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDEsCisgICAgV2ViS2l0RXJy
b3JGcmFtZUxvYWRJbnRlcnJ1cHRlZEJ5UG9saWN5Q2hhbmdlID0gICAgICAgICAgICAgMTAyLAor
ICAgIFdlYktpdEVycm9yQ2Fubm90VXNlUmVzdHJpY3RlZFBvcnQgPSAgICAgICAgICAgICAgICAg
ICAgICAgIDEwMywKKyAgICBXZWJLaXRFcnJvckNhbm5vdEZpbmRQbHVnSW4gPSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAyMDAsCisgICAgV2ViS2l0RXJyb3JDYW5ub3RMb2FkUGx1Z0lu
ID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAxLAorICAgIFdlYktpdEVycm9ySmF2
YVVuYXZhaWxhYmxlID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMiwKKyAgICBX
ZWJLaXRFcnJvclBsdWdpbldpbGxIYW5kbGVMb2FkID0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAyMDMKK307CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworRnJhbWVMb2FkZXJDbGllbnRCbGFj
a0JlcnJ5OjpGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkoKQorICAgIDogbV9mcmFtZSgwKQor
ICAgICwgbV93ZWJQYWdlUHJpdmF0ZSgwKQorICAgICwgbV9zZW50UmVhZHlUb1JlbmRlcihmYWxz
ZSkKKyAgICAsIG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsUG9saWN5RnVuY3Rpb24oMCkKKyAgICAs
IG1fbG9hZGluZ0Vycm9yUGFnZShmYWxzZSkKKyAgICAsIG1fY2xpZW50UmVkaXJlY3RJc1BlbmRp
bmcoZmFsc2UpCisgICAgLCBtX2NoaWxkRnJhbWVDcmVhdGlvblN1cHByZXNzZWQoZmFsc2UpCisg
ICAgLCBtX3BsdWdpblZpZXcoMCkKKyAgICAsIG1faGFzU2VudFJlc3BvbnNlVG9QbHVnaW4oZmFs
c2UpCisgICAgLCBtX2NhbmNlbExvYWRPbk5leHREYXRhKGZhbHNlKQoreworICAgIG1fZGVmZXJy
ZWRKb2JzVGltZXIgPSBuZXcgVGltZXI8RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Pih0aGlz
LCAmRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkZWZlcnJlZEpvYnNUaW1lckZpcmVkKTsK
K30KKworRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojp+RnJhbWVMb2FkZXJDbGllbnRCbGFj
a0JlcnJ5KCkKK3sKKyAgICBkZWxldGUgbV9kZWZlcnJlZEpvYnNUaW1lcjsKKyAgICBtX2RlZmVy
cmVkSm9ic1RpbWVyID0gMDsKK30KKworaW50IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6
cGxheWVySWQoKSBjb25zdAoreworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlICYmIG1fd2ViUGFn
ZVByaXZhdGUtPm1fY2xpZW50KQorICAgICAgICByZXR1cm4gbV93ZWJQYWdlUHJpdmF0ZS0+bV9j
bGllbnQtPmdldEluc3RhbmNlSWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBGcmFtZUxv
YWRlckNsaWVudEJsYWNrQmVycnk6OmNvb2tpZXNFbmFibGVkKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV93ZWJQYWdlUHJpdmF0ZS0+bV93ZWJTZXR0aW5ncy0+YXJlQ29va2llc0VuYWJsZWQoKTsK
K30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkQWRkQmFj
a0ZvcndhcmRJdGVtKEhpc3RvcnlJdGVtKiBpdGVtKSBjb25zdAoreworICAgIC8vIEluZm9ybSB0
aGUgY2xpZW50IHRoYXQgdGhlIGJhY2svZm9yd2FyZCBsaXN0IGhhcyBjaGFuZ2VkLgorICAgIGlu
dmFsaWRhdGVCYWNrRm9yd2FyZExpc3QoKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJs
YWNrQmVycnk6OmRpc3BhdGNoRGlkUmVtb3ZlQmFja0ZvcndhcmRJdGVtKEhpc3RvcnlJdGVtKiBp
dGVtKSBjb25zdAoreworICAgIGludmFsaWRhdGVCYWNrRm9yd2FyZExpc3QoKTsKK30KKwordm9p
ZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkQ2hhbmdlQmFja0Zvcndh
cmRJbmRleCgpIGNvbnN0Cit7CisgICAgaW52YWxpZGF0ZUJhY2tGb3J3YXJkTGlzdCgpOworfQor
Cit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRDaGFuZ2VMb2Nh
dGlvbldpdGhpblBhZ2UoKQoreworICAgIGlmICghaXNNYWluRnJhbWUoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgV1RGOjpTdHJpbmcgdXJsID0gbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCku
c3RyaW5nKCk7CisgICAgV1RGOjpTdHJpbmcgdG9rZW4gPSBtX2ZyYW1lLT5sb2FkZXIoKS0+ZG9j
dW1lbnRMb2FkZXIoKS0+cmVxdWVzdCgpLnRva2VuKCk7CisKKyAgICBtX3dlYlBhZ2VQcml2YXRl
LT5tX2NsaWVudC0+bm90aWZ5TG9hZFRvQW5jaG9yKHVybC5jaGFyYWN0ZXJzKCksIHVybC5sZW5n
dGgoKSwgdG9rZW4uY2hhcmFjdGVycygpLCB0b2tlbi5sZW5ndGgoKSk7Cit9CisKK3ZvaWQgRnJh
bWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZFB1c2hTdGF0ZVdpdGhpblBhZ2Uo
KQoreworICAgIC8vIEZJWE1FOiBBcyBhIHdvcmthcm91bmQgd2UgYWJ1c2UgYW5jaG9yIG5hdmln
YXRpb24gdG8gYWNoaWV2ZSBoaXN0b3J5IHB1c2guIFNlZSBQUiAjMTE5Nzc5IGZvciBtb3JlIGRl
dGFpbHMuCisgICAgZGlzcGF0Y2hEaWRDaGFuZ2VMb2NhdGlvbldpdGhpblBhZ2UoKTsKK30KKwor
dm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkUmVwbGFjZVN0YXRl
V2l0aGluUGFnZSgpCit7CisgICAgLy8gRklYTUU6IEFzIGEgd29ya2Fyb3VuZCB3ZSBhYnVzZSBh
bmNob3IgbmF2aWdhdGlvbiB0byBhY2hpZXZlIGhpc3RvcnkgcmVwbGFjZS4gU2VlIFBSICMxMTk3
NzkgZm9yIG1vcmUgZGV0YWlscy4KKyAgICBkaXNwYXRjaERpZENoYW5nZUxvY2F0aW9uV2l0aGlu
UGFnZSgpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hE
aWRQb3BTdGF0ZVdpdGhpblBhZ2UoKQoreworICAgIC8vIE5vdCBuZWVkZWQuCit9CisKK3ZvaWQg
RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZENhbmNlbENsaWVudFJlZGly
ZWN0KCkKK3sKKyAgICBtX2NsaWVudFJlZGlyZWN0SXNQZW5kaW5nID0gZmFsc2U7Cit9CisKK3Zv
aWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaFdpbGxQZXJmb3JtQ2xpZW50
UmVkaXJlY3QoY29uc3QgS1VSTCYsIGRvdWJsZSwgZG91YmxlKQoreworICAgIGlmIChtX3dlYlBh
Z2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlKQorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5t
X2R1bXBSZW5kZXJUcmVlLT5kaWREaXNwYXRjaFdpbGxQZXJmb3JtQ2xpZW50UmVkaXJlY3QoKTsK
KworICAgIG1fY2xpZW50UmVkaXJlY3RJc1BlbmRpbmcgPSB0cnVlOworfQorCit2b2lkIEZyYW1l
TG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEZWNpZGVQb2xpY3lGb3JSZXNwb25zZShG
cmFtZVBvbGljeUZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCBXZWJDb3JlOjpSZXNvdXJjZVJlc3Bv
bnNlJiByZXNwb25zZSwgY29uc3QgV2ViQ29yZTo6UmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0KQor
eworICAgIC8vIEZJWE1FOiBXaGF0IHNob3VsZCB3ZSBkbyBmb3IgSFRUUCBzdGF0dXMgY29kZSAy
MDQgYW5kIDIwNSBhbmQgImFwcGxpY2F0aW9uL3ppcCI/CisgICAgUG9saWN5QWN0aW9uIHBvbGlj
eSA9IFBvbGljeUlnbm9yZTsKKworICAgIGlmIChXZWJDb3JlOjpjb250ZW50RGlzcG9zaXRpb25U
eXBlKHJlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZCgiQ29udGVudC1EaXNwb3NpdGlvbiIpKSA9PSBX
ZWJDb3JlOjpDb250ZW50RGlzcG9zaXRpb25BdHRhY2htZW50CisgICAgICAgIHx8IHJlcXVlc3Qu
Zm9yY2VEb3dubG9hZCgpKQorICAgICAgICBwb2xpY3kgPSBQb2xpY3lEb3dubG9hZDsKKyAgICBl
bHNlIGlmIChjYW5TaG93TUlNRVR5cGUocmVzcG9uc2UubWltZVR5cGUoKSkpCisgICAgICAgIHBv
bGljeSA9IFBvbGljeVVzZTsKKyAgICBlbHNlIGlmICgoUmVzb3VyY2VSZXF1ZXN0OjpUYXJnZXRJ
c01haW5GcmFtZSA9PSByZXF1ZXN0LnRhcmdldFR5cGUoKSkKKyAgICAgICAgICAgICAmJiBtX3dl
YlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+ZG93bmxvYWRBbGxvd2VkKHJlcXVlc3QudXJsKCkuc3Ry
aW5nKCkudXRmOCgpLmRhdGEoKSkpCisgICAgICAgIHBvbGljeSA9IFBvbGljeURvd25sb2FkOwor
CisgICAgKG1fZnJhbWUtPmxvYWRlcigpLT5wb2xpY3lDaGVja2VyKCktPipmdW5jdGlvbikocG9s
aWN5KTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGVj
aWRlUG9saWN5Rm9yTmF2aWdhdGlvbkFjdGlvbihGcmFtZVBvbGljeUZ1bmN0aW9uIGZ1bmN0aW9u
LCBjb25zdCBOYXZpZ2F0aW9uQWN0aW9uJiBhY3Rpb24sIGNvbnN0IFJlc291cmNlUmVxdWVzdCYg
cmVxdWVzdCwgUGFzc1JlZlB0cjxGb3JtU3RhdGU+KQoreworICAgIFBvbGljeUFjdGlvbiBkZWNp
c2lvbiA9IFBvbGljeVVzZTsKKworICAgIGNvbnN0IEtVUkwmIHVybCA9IHJlcXVlc3QudXJsKCk7
CisKKyAgICAvLyBGcmFnbWVudCBzY3JvbGxzIG9uIHRoZSBzYW1lIHBhZ2Ugc2hvdWxkIGFsd2F5
cyBiZSBoYW5kbGVkIGludGVybmFsbHkuCisgICAgLy8gKE9ubHkgY291bnQgYXMgYSBmcmFnbWVu
dCBzY3JvbGwgaWYgd2UgYXJlIHNjcm9sbGluZyB0byBhICNmcmFnbWVudCB1cmwsIG5vdCBiYWNr
IHRvIHRoZSB0b3AsIGFuZCByZWxvYWRpbmcKKyAgICAvLyB0aGUgc2FtZSB1cmwgaXMgbm90IGEg
ZnJhZ21lbnQgc2Nyb2xsIGV2ZW4gaWYgaXQgaGFzIGEgI2ZyYWdtZW50LikKKyAgICBjb25zdCBL
VVJMJiBjdXJyZW50VXJsID0gbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCk7CisgICAgYm9vbCBp
c0ZyYWdtZW50U2Nyb2xsID0gdXJsLmhhc0ZyYWdtZW50SWRlbnRpZmllcigpICYmIHVybCAhPSBj
dXJyZW50VXJsICYmIGVxdWFsSWdub3JpbmdGcmFnbWVudElkZW50aWZpZXIoY3VycmVudFVybCwg
dXJsKTsKKyAgICBpZiAoZGVjaXNpb24gPT0gUG9saWN5VXNlKQorICAgICAgICBkZWNpc2lvbiA9
IGRlY2lkZVBvbGljeUZvckV4dGVybmFsTG9hZChyZXF1ZXN0LCBpc0ZyYWdtZW50U2Nyb2xsKTsK
KworICAgIC8vIExldCB0aGUgY2xpZW50IGhhdmUgYSBjaGFuY2UgdG8gc2F5IHdoZXRoZXIgdGhp
cyBuYXZpZ2F0aW9uIHNob3VsZCB0YWtlCisgICAgLy8gYmUgaWdub3JlZCBvciBub3QuCisKKyAg
ICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3QgcGxhdGZvcm1SZXF1ZXN0Owor
ICAgIHJlcXVlc3QuaW5pdGlhbGl6ZVBsYXRmb3JtUmVxdWVzdChwbGF0Zm9ybVJlcXVlc3QsIGZh
bHNlIC8qaXNJbml0aWFsKi8pOworICAgIGlmIChpc01haW5GcmFtZSgpICYmICFtX3dlYlBhZ2VQ
cml2YXRlLT5tX2NsaWVudC0+YWNjZXB0TmF2aWdhdGlvblJlcXVlc3QoCisgICAgICAgIHBsYXRm
b3JtUmVxdWVzdCwgQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5hdmlnYXRpb25UeXBlKGFjdGlvbi50
eXBlKCkpKSkgeworICAgICAgICBpZiAoYWN0aW9uLnR5cGUoKSA9PSBOYXZpZ2F0aW9uVHlwZUZv
cm1TdWJtaXR0ZWQKKyAgICAgICAgICAgIHx8IGFjdGlvbi50eXBlKCkgPT0gTmF2aWdhdGlvblR5
cGVGb3JtUmVzdWJtaXR0ZWQpCisgICAgICAgICAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+cmVzZXRN
dWx0aXBsZUZvcm1TdWJtaXNzaW9uUHJvdGVjdGlvbigpOworCisgICAgICAgIGlmIChhY3Rpb24u
dHlwZSgpID09IE5hdmlnYXRpb25UeXBlTGlua0NsaWNrZWQgJiYgdXJsLmhhc0ZyYWdtZW50SWRl
bnRpZmllcigpKSB7CisgICAgICAgICAgICBSZXNvdXJjZVJlcXVlc3QgZW1wdHlSZXF1ZXN0Owor
ICAgICAgICAgICAgbV9mcmFtZS0+bG9hZGVyKCktPmFjdGl2ZURvY3VtZW50TG9hZGVyKCktPnNl
dExhc3RDaGVja2VkUmVxdWVzdChlbXB0eVJlcXVlc3QpOworICAgICAgICB9CisgICAgICAgIGRl
Y2lzaW9uID0gUG9saWN5SWdub3JlOworICAgIH0KKworICAgIC8vIElmIHdlIGFib3J0IGhlcmUs
IGRpc3BhdGNoRGlkQ2FuY2VsQ2xpZW50UmVkaXJlY3Qgd2lsbCBub3QgYmUgY2FsbGVkLgorICAg
IC8vIFNvIGNhbGwgaXQgYnkgaGFuZC4KKyAgICBpZiAoZGVjaXNpb24gPT0gUG9saWN5SWdub3Jl
KQorICAgICAgICBkaXNwYXRjaERpZENhbmNlbENsaWVudFJlZGlyZWN0KCk7CisKKyAgICAobV9m
cmFtZS0+bG9hZGVyKCktPnBvbGljeUNoZWNrZXIoKS0+KmZ1bmN0aW9uKShkZWNpc2lvbik7CisK
KyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZSkKKyAgICAgICAgbV93
ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZS0+ZGlkRGVjaWRlUG9saWN5Rm9yTmF2aWdh
dGlvbkFjdGlvbihhY3Rpb24sIHJlcXVlc3QpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50
QmxhY2tCZXJyeTo6ZGVsYXlQb2xpY3lDaGVja1VudGlsRnJhZ21lbnRFeGlzdHMoY29uc3QgV1RG
OjpTdHJpbmcmIGZyYWdtZW50LCBGcmFtZVBvbGljeUZ1bmN0aW9uIGZ1bmN0aW9uKQoreworICAg
IEFTU0VSVChpc01haW5GcmFtZSgpKTsKKworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5sb2Fk
U3RhdGUoKSA8IFdlYlBhZ2VQcml2YXRlOjpGaW5pc2hlZCAmJiAhbV9mcmFtZS0+ZG9jdW1lbnQo
KS0+ZmluZEFuY2hvcihmcmFnbWVudCkpIHsKKyAgICAgICAgLy8gVGVsbCB0aGUgY2xpZW50IHdl
IG5lZWQgbW9yZSBkYXRhLCBpbiBjYXNlIHRoZSBmcmFnbWVudCBleGlzdHMgYnV0IGlzIGJlaW5n
IGhlbGQgYmFjay4KKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5lZWRNb3Jl
RGF0YSgpOworICAgICAgICBtX3BlbmRpbmdGcmFnbWVudFNjcm9sbFBvbGljeUZ1bmN0aW9uID0g
ZnVuY3Rpb247CisgICAgICAgIG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsID0gZnJhZ21lbnQ7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAobV9mcmFtZS0+bG9hZGVyKCktPnBvbGljeUNo
ZWNrZXIoKS0+KmZ1bmN0aW9uKShQb2xpY3lVc2UpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xp
ZW50QmxhY2tCZXJyeTo6Y2FuY2VsUG9saWN5Q2hlY2soKQoreworICAgIG1fcGVuZGluZ0ZyYWdt
ZW50U2Nyb2xsUG9saWN5RnVuY3Rpb24gPSAwOworICAgIG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xs
ID0gV1RGOjpTdHJpbmcoKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6
OmRvUGVuZGluZ0ZyYWdtZW50U2Nyb2xsKCkKK3sKKyAgICBpZiAobV9wZW5kaW5nRnJhZ21lbnRT
Y3JvbGwuaXNOdWxsKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIE1ha2Ugc3VyZSB0byBj
bGVhciB0aGUgcGVuZGluZyBtZW1iZXJzIGZpcnN0IHRvIGF2b2lkIHJlY3Vyc2lvbi4KKyAgICBX
VEY6OlN0cmluZyBmcmFnbWVudCA9IG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsOworICAgIG1fcGVu
ZGluZ0ZyYWdtZW50U2Nyb2xsID0gV1RGOjpTdHJpbmcoKTsKKworICAgIEZyYW1lUG9saWN5RnVu
Y3Rpb24gZnVuY3Rpb24gPSBtX3BlbmRpbmdGcmFnbWVudFNjcm9sbFBvbGljeUZ1bmN0aW9uOwor
ICAgIG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsUG9saWN5RnVuY3Rpb24gPSAwOworCisgICAgZGVs
YXlQb2xpY3lDaGVja1VudGlsRnJhZ21lbnRFeGlzdHMoZnJhZ21lbnQsIGZ1bmN0aW9uKTsKK30K
Kwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGVjaWRlUG9saWN5
Rm9yTmV3V2luZG93QWN0aW9uKEZyYW1lUG9saWN5RnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IE5h
dmlnYXRpb25BY3Rpb24mLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmIHJlcXVlc3QsIFBhc3NSZWZQ
dHI8Rm9ybVN0YXRlPiwgY29uc3QgU3RyaW5nJiBmcmFtZU5hbWUpCit7CisgICAgaWYgKHJlcXVl
c3QuaXNSZXF1ZXN0ZWRCeVBsdWdpbigpICYmIFNjcmlwdENvbnRyb2xsZXI6OnByb2Nlc3NpbmdV
c2VyR2VzdHVyZSgpICYmICFtX3dlYlBhZ2VQcml2YXRlLT5tX3BsdWdpbk1heU9wZW5OZXdUYWIp
CisgICAgICAgIChtX2ZyYW1lLT5sb2FkZXIoKS0+cG9saWN5Q2hlY2tlcigpLT4qZnVuY3Rpb24p
KFBvbGljeUlnbm9yZSk7CisKKyAgICAvLyBBIG5ldyB3aW5kb3cgY2FuIG5ldmVyIGJlIGEgZnJh
Z21lbnQgc2Nyb2xsLgorICAgIFBvbGljeUFjdGlvbiBkZWNpc2lvbiA9IGRlY2lkZVBvbGljeUZv
ckV4dGVybmFsTG9hZChyZXF1ZXN0LCBmYWxzZSk7CisgICAgKG1fZnJhbWUtPmxvYWRlcigpLT5w
b2xpY3lDaGVja2VyKCktPipmdW5jdGlvbikoZGVjaXNpb24pOworfQorCit2b2lkIEZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y29tbWl0dGVkTG9hZChEb2N1bWVudExvYWRlciogbG9hZGVy
LCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKQoreworICAgIC8vIFRoZSBzdHJ1Y3R1cmUg
b2YgdGhpcyBjb2RlIG1heSBzZWVtLi4uYSBiaXQgb2RkLiBJdCdzIHN0cnVjdHVyZWQgd2l0aCB0
d28gY2hlY2tzIG9uIHRoZSBzdGF0ZQorICAgIC8vIG9mIG1fcGx1Z2luVmlldyBiZWNhdXNlIGl0
J3MgYWN0dWFsbHkgcmVjZWl2ZWREYXRhIHRoYXQgbWF5IGNhdXNlIHRoZSByZXF1ZXN0IHRvIHJl
LWRpcmVjdCBkYXRhCisgICAgLy8gdG8gYSBQbHVnaW5WaWV3LiBUaGlzIGlzIGJlY2F1c2UgcmVj
ZWl2ZWREYXRhIG1heSBkZWNpZGUgdG8gY3JlYXRlIGEgUGx1Z2luRG9jdW1lbnQgY29udGFpbmlu
ZworICAgIC8vIGEgUGx1Z2luVmlldy4gVGhlIFBsdWdpblZpZXcgd2lsbCByZXF1ZXN0IHRoYXQg
dGhlIG1haW4gcmVzb3VyY2UgZm9yIHRoZSBmcmFtZSBiZSByZWRpcmVjdGVkCisgICAgLy8gdG8g
dGhlIFBsdWdpblZpZXcuIFNvIGFmdGVyIHJlY2VpdmVkRGF0YSBoYXMgYmVlbiBjYWxsZWQsIHRo
aXMgY29kZSBuZWVkcyB0byBjaGVjayB3aGV0aGVyCisgICAgLy8gcmUtZGlyZWN0aW9uIHRvIGEg
UGx1Z2luVmlldyBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHBhc3MgdGhlIHNhbWUgZGF0YSBvbiB0
byB0aGUgUGx1Z2luVmlldy4KKyAgICAvLyBUaGVyZWFmdGVyLCBhbGwgZGF0YSB3aWxsIGJlIHJl
LWRpcmVjdGVkIHRvIHRoZSBQbHVnaW5WaWV3OyBpLmUuLCBubyBhZGRpdGlvbmFsIGRhdGEgd2ls
bCBnbworICAgIC8vIHRvIHJlY2VpdmVkRGF0YS4KKworICAgIGlmICghbV9wbHVnaW5WaWV3KSB7
CisgICAgICAgIGNvbnN0IFdURjo6U3RyaW5nJiB0ZXh0RW5jb2RpbmcgPSBsb2FkZXItPnJlc3Bv
bnNlKCkudGV4dEVuY29kaW5nTmFtZSgpOworICAgICAgICByZWNlaXZlZERhdGEoZGF0YSwgbGVu
Z3RoLCB0ZXh0RW5jb2RpbmcpOworICAgIH0KKworICAgIGlmIChtX3BsdWdpblZpZXcpIHsKKyAg
ICAgICAgaWYgKCFtX2hhc1NlbnRSZXNwb25zZVRvUGx1Z2luKSB7CisgICAgICAgICAgICBtX3Bs
dWdpblZpZXctPmRpZFJlY2VpdmVSZXNwb25zZShsb2FkZXItPnJlc3BvbnNlKCkpOworICAgICAg
ICAgICAgbV9oYXNTZW50UmVzcG9uc2VUb1BsdWdpbiA9IHRydWU7CisgICAgICAgIH0KKworICAg
ICAgICBpZiAoIW1fcGx1Z2luVmlldykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBt
X3BsdWdpblZpZXctPmRpZFJlY2VpdmVEYXRhKGRhdGEsIGxlbmd0aCk7CisgICAgfQorfQorCitQ
YXNzUmVmUHRyPFdpZGdldD4gRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpjcmVhdGVQbHVn
aW4oY29uc3QgSW50U2l6ZSYgcGx1Z2luU2l6ZSwKKyAgICBIVE1MUGx1Z0luRWxlbWVudCogZWxl
bWVudCwgY29uc3QgS1VSTCYgdXJsLCBjb25zdCBWZWN0b3I8V1RGOjpTdHJpbmc+JiBwYXJhbU5h
bWVzLAorICAgIGNvbnN0IFZlY3RvcjxXVEY6OlN0cmluZz4mIHBhcmFtVmFsdWVzLCBjb25zdCBX
VEY6OlN0cmluZyYgbWltZVR5cGVJbiwgYm9vbCBsb2FkTWFudWFsbHkpCit7CisgICAgV1RGOjpT
dHJpbmcgbWltZVR5cGUobWltZVR5cGVJbik7CisgICAgaWYgKG1pbWVUeXBlLmlzRW1wdHkoKSkg
eworICAgICAgICBtaW1lVHlwZSA9IE1JTUVUeXBlUmVnaXN0cnk6OmdldE1JTUVUeXBlRm9yUGF0
aCh1cmwucGF0aCgpKTsKKyAgICAgICAgbWltZVR5cGUgPSBCbGFja0JlcnJ5OjpXZWJLaXQ6Oldl
YlNldHRpbmdzOjpnZXROb3JtYWxpemVkTUlNRVR5cGUobWltZVR5cGUpOworICAgICAgICBpZiAo
bWltZVR5cGUgIT0gImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIikKKyAgICAgICAgICAg
IG1pbWVUeXBlID0gbWltZVR5cGVJbjsKKyAgICB9CisKKyAgICBpZiAobWltZVR5cGUgPT0gImFw
cGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiB8fCBtaW1lVHlwZSA9PSAiYXBwbGljYXRpb24v
am5leHQtc2NyaXB0YWJsZS1wbHVnaW4iKSB7CisgICAgICAgIFJlZlB0cjxQbHVnaW5WaWV3PiBw
bHVnaW5WaWV3ID0gUGx1Z2luVmlldzo6Y3JlYXRlKG1fZnJhbWUsIHBsdWdpblNpemUsIGVsZW1l
bnQsIHVybCwgcGFyYW1OYW1lcywgcGFyYW1WYWx1ZXMsIG1pbWVUeXBlLCBsb2FkTWFudWFsbHkp
OworICAgICAgICByZXR1cm4gcGx1Z2luVmlldzsKKyAgICB9CisgICAgLy8gSWYgaXQncyBub3Qg
dGhlIHBsdWdpbiB0eXBlIHdlIHN1cHBvcnQsIHRyeSBsb2FkIGRpcmVjdGx5IGZyb20gYnJvd3Nl
ci4KKyAgICBpZiAobV9mcmFtZS0+bG9hZGVyKCkgJiYgbV9mcmFtZS0+bG9hZGVyKCktPnN1YmZy
YW1lTG9hZGVyKCkgJiYgIXVybC5pc051bGwoKSkKKyAgICAgICAgbV9mcmFtZS0+bG9hZGVyKCkt
PnN1YmZyYW1lTG9hZGVyKCktPnJlcXVlc3RGcmFtZShlbGVtZW50LCB1cmwsIFdURjo6U3RyaW5n
KCkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0Jl
cnJ5OjpyZWRpcmVjdERhdGFUb1BsdWdpbihXaWRnZXQqIHBsdWdpbldpZGdldCkKK3sKKyAgICBB
U1NFUlQoIW1fcGx1Z2luVmlldyk7CisgICAgbV9wbHVnaW5WaWV3ID0gc3RhdGljX2Nhc3Q8UGx1
Z2luVmlldyo+KHBsdWdpbldpZGdldCk7CisgICAgbV9oYXNTZW50UmVzcG9uc2VUb1BsdWdpbiA9
IGZhbHNlOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6cmVjZWl2ZWRE
YXRhKGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgsIGNvbnN0IFdURjo6U3RyaW5nJiB0ZXh0
RW5jb2RpbmcpCit7CisgICAgaWYgKCFtX2ZyYW1lKQorICAgICAgICByZXR1cm47CisKKyAgICBp
ZiAobV9jYW5jZWxMb2FkT25OZXh0RGF0YSkgeworICAgICAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+
YWN0aXZlRG9jdW1lbnRMb2FkZXIoKS0+c3RvcExvYWRpbmcoKTsKKyAgICAgICAgbV9mcmFtZS0+
bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCktPndyaXRlcigpLT5lbmQoKTsKKyAgICAgICAgbV9j
YW5jZWxMb2FkT25OZXh0RGF0YSA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgLy8gU2V0IHRoZSBlbmNvZGluZy4gVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgb25jZSwg
YnV0IGl0J3MgaGFybWxlc3MgdG8gZG8gaXQgYWdhaW4gbGF0ZXIuCisgICAgV1RGOjpTdHJpbmcg
ZW5jb2RpbmcgPSBtX2ZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKS0+b3ZlcnJpZGVF
bmNvZGluZygpOworICAgIGJvb2wgdXNlckNob3NlbiA9ICFlbmNvZGluZy5pc051bGwoKTsKKyAg
ICBpZiAoZW5jb2RpbmcuaXNOdWxsKCkpCisgICAgICAgIGVuY29kaW5nID0gdGV4dEVuY29kaW5n
OworICAgIG1fZnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigpLT53cml0ZXIoKS0+c2V0
RW5jb2RpbmcoZW5jb2RpbmcsIHVzZXJDaG9zZW4pOworICAgIG1fZnJhbWUtPmxvYWRlcigpLT5k
b2N1bWVudExvYWRlcigpLT53cml0ZXIoKS0+YWRkRGF0YShkYXRhLCBsZW5ndGgpOworfQorCit2
b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZmluaXNoZWRMb2FkaW5nKERvY3VtZW50
TG9hZGVyKiBsb2FkZXIpCit7CisgICAgaWYgKG1fcGx1Z2luVmlldykgeworICAgICAgICBtX3Bs
dWdpblZpZXctPmRpZEZpbmlzaExvYWRpbmcoKTsKKyAgICAgICAgbV9wbHVnaW5WaWV3ID0gMDsK
KyAgICAgICAgbV9oYXNTZW50UmVzcG9uc2VUb1BsdWdpbiA9IGZhbHNlOworICAgIH0gZWxzZSB7
CisgICAgICAgIC8vIFRlbGxpbmcgdGhlIGZyYW1lIHdlIHJlY2VpdmVkIHNvbWUgZGF0YSBhbmQg
cGFzc2luZyAwIGFzIHRoZSBkYXRhIGlzIG91cgorICAgICAgICAvLyB3YXkgdG8gZ2V0IHdvcmsg
ZG9uZSB0aGF0IGlzIG5vcm1hbGx5IGRvbmUgd2hlbiB0aGUgZmlyc3QgYml0IG9mIGRhdGEgaXMK
KyAgICAgICAgLy8gcmVjZWl2ZWQsIGV2ZW4gZm9yIHRoZSBjYXNlIG9mIGEgZG9jdW1lbnQgd2l0
aCBubyBkYXRhIChsaWtlIGFib3V0OmJsYW5rKQorICAgICAgICBjb21taXR0ZWRMb2FkKGxvYWRl
ciwgMCwgMCk7CisKKyAgICAgICAgaWYgKCFtX2ZyYW1lLT5kb2N1bWVudCgpKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgIH0KK30KKworV1RGOjpQYXNzUmVmUHRyPERvY3VtZW50TG9hZGVyPiBG
cmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmNyZWF0ZURvY3VtZW50TG9hZGVyKGNvbnN0IFJl
c291cmNlUmVxdWVzdCYgcmVxdWVzdCwgY29uc3QgU3Vic3RpdHV0ZURhdGEmIHN1YnN0aXR1dGVE
YXRhKQoreworICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSByZXF1ZXN0IHdpdGggdGhlIHRva2Vu
IGZyb20gdGhlIG9yaWdpbmFsIHJlcXVlc3QgZm9yIHRoaXMgZnJhbWUKKyAgICAvLyAodW5sZXNz
IGl0IGFscmVhZHkgaGFzIGEgdG9rZW4sIGluIHdoaWNoIGNhc2UgdGhlIHJlcXVlc3QgY2FtZSBm
cm9tIHRoZSBjbGllbnQpCisgICAgUmVzb3VyY2VSZXF1ZXN0IG5ld1JlcXVlc3QocmVxdWVzdCk7
CisgICAgaWYgKG1fZnJhbWUgJiYgbV9mcmFtZS0+bG9hZGVyKCkgJiYgbV9mcmFtZS0+bG9hZGVy
KCktPmRvY3VtZW50TG9hZGVyKCkpIHsKKyAgICAgICAgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiBv
cmlnaW5hbFJlcXVlc3QgPSBtX2ZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKS0+b3Jp
Z2luYWxSZXF1ZXN0KCk7CisgICAgICAgIGlmIChyZXF1ZXN0LnRva2VuKCkuaXNOdWxsKCkgJiYg
IW9yaWdpbmFsUmVxdWVzdC50b2tlbigpLmlzTnVsbCgpKQorICAgICAgICAgICAgbmV3UmVxdWVz
dC5zZXRUb2tlbihvcmlnaW5hbFJlcXVlc3QudG9rZW4oKSk7CisgICAgfQorCisgICAgLy8gRklY
TUU6IFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHNoYXJlZC4KKyAgICBSZWZQdHI8RG9jdW1lbnRM
b2FkZXI+IGxvYWRlciA9IERvY3VtZW50TG9hZGVyOjpjcmVhdGUobmV3UmVxdWVzdCwgc3Vic3Rp
dHV0ZURhdGEpOworICAgIGlmIChzdWJzdGl0dXRlRGF0YS5pc1ZhbGlkKCkpCisgICAgICAgIGxv
YWRlci0+c2V0RGVmZXJNYWluUmVzb3VyY2VEYXRhTG9hZChmYWxzZSk7CisgICAgcmV0dXJuIGxv
YWRlci5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpm
cmFtZUxvYWRlckRlc3Ryb3llZCgpCit7CisgICAgZGVsZXRlIHRoaXM7Cit9CisKK3ZvaWQgRnJh
bWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojp0cmFuc2l0aW9uVG9Db21taXR0ZWRGb3JOZXdQYWdl
KCkKK3sKKyAgICBtX2NhbmNlbExvYWRPbk5leHREYXRhID0gZmFsc2U7CisKKyAgICAvLyBJbiBG
cmFtZTo6Y3JlYXRlVmlldywgRnJhbWUncyBGcmFtZVZpZXcgb2JqZWN0IGlzIHNldCB0byAwIGFu
ZCAgcmVjcmVhdGVkLgorICAgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBhdG9taWMsIGFuZCBh
biBhdHRlbXB0IHRvIGJsaXQgY29udGVudHMgbWlnaHQgaGFwcGVuCisgICAgLy8gaW4gdGhlIGJh
Y2tpbmcgc3RvcmUgZnJvbSBhbm90aGVyIHRocmVhZCAoc2VlIEJhY2tpbmdTdG9yZVByaXZhdGU6
OmJsaXRDb250ZW50cyBtZXRob2QpLAorICAgIC8vIHNvIHdlIHN1c3BlbmQgYW5kIHJlc3VtZSBz
Y3JlZW4gdXBkYXRlIHRvIG1ha2Ugc3VyZSB3ZSBkbyBub3QgZ2V0IGEgaW52YWxpZCBGcmFtZVZp
ZXcKKyAgICAvLyBzdGF0ZS4KKyAgICBCYWNraW5nU3RvcmVDbGllbnQqIGJhY2tpbmdTdG9yZUNs
aWVudEZvckZyYW1lID0gbV93ZWJQYWdlUHJpdmF0ZS0+YmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJh
bWUobV9mcmFtZSk7CisgICAgaWYgKGJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKQorICAgICAg
ICBiYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZS0+YmFja2luZ1N0b3JlKCktPmQtPnN1c3BlbmRT
Y3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCk7CisKKyAgICAvLyBXZSBhcmUgbmF2aWdhdGlu
ZyBhd2F5IGZyb20gdGhpcyBkb2N1bWVudCwgc28gY2xlYW4gdXAgYW55IGZvb3RwcmludCB3ZSBt
aWdodCBoYXZlLgorICAgIGlmIChtX2ZyYW1lLT5kb2N1bWVudCgpKQorICAgICAgICBtX3dlYlBh
Z2VQcml2YXRlLT5jbGVhckRvY3VtZW50RGF0YShtX2ZyYW1lLT5kb2N1bWVudCgpKTsKKworICAg
IENvbG9yIGJhY2tncm91bmRDb2xvcihtX3dlYlBhZ2VQcml2YXRlLT5tX3dlYlNldHRpbmdzLT5i
YWNrZ3JvdW5kQ29sb3IoKSk7CisKKyAgICBtX2ZyYW1lLT5jcmVhdGVWaWV3KG1fd2ViUGFnZVBy
aXZhdGUtPnZpZXdwb3J0U2l6ZSgpLCAgICAgLyp2aWV3cG9ydCovCisgICAgICAgICAgICAgICAg
ICAgICAgICBiYWNrZ3JvdW5kQ29sb3IsICAgICAgICAgICAgICAgICAgLypiYWNrZ3JvdW5kIGNv
bG9yKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvci5oYXNBbHBoYSgp
LCAgICAgICAvKmlzIHRyYW5zcGFyZW50Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fd2Vi
UGFnZVByaXZhdGUtPmFjdHVhbFZpc2libGVTaXplKCksLypmaXhlZCByZXBvcnRlZCBzaXplKi8K
KyAgICAgICAgICAgICAgICAgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPmZpeGVkTGF5b3V0U2l6
ZSgpLCAgLypmaXhlZCBsYXlvdXQgc2l6ZSovCisgICAgICAgICAgICAgICAgICAgICAgICBtX3dl
YlBhZ2VQcml2YXRlLT51c2VGaXhlZExheW91dCgpLCAgIC8qdXNlIGZpeGVkIGxheW91dCAqLwor
ICAgICAgICAgICAgICAgICAgICAgICAgU2Nyb2xsYmFyQWx3YXlzT2ZmLCAgICAgICAgICAgICAg
IC8qaG9yIG1vZGUqLworICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8qbG9jayB0aGUgbW9kZSovCisgICAgICAgICAgICAgICAgICAgICAg
ICBTY3JvbGxiYXJBbHdheXNPZmYsICAgICAgICAgICAgICAgLyp2ZXIgbW9kZSovCisgICAgICAg
ICAgICAgICAgICAgICAgICB0cnVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsb2Nr
IHRoZSBtb2RlKi8KKworICAgIGlmIChiYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZSkKKyAgICAg
ICAgYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUtPmJhY2tpbmdTdG9yZSgpLT5kLT5yZXN1bWVT
Y3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKEJhY2tpbmdTdG9yZTo6Tm9uZSk7CisgICAgbV9m
cmFtZS0+dmlldygpLT51cGRhdGVDYW5IYXZlU2Nyb2xsYmFycygpOworCisgICAgaWYgKGlzTWFp
bkZyYW1lKCkpIHsKKyAgICAgICAgLy8gU2luY2UgdGhlIG1haW5mcmFtZSBoYXMgYSB0aWxlZCBi
YWNraW5nc3RvcmUgcmVxdWVzdCB0byByZWNlaXZlIGFsbCB1cGRhdGUKKyAgICAgICAgLy8gcmVj
dHMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCB3aGljaCBqdXN0IHNlbmRzIHVwZGF0ZSByZWN0cyBm
b3IgY3VycmVudGx5CisgICAgICAgIC8vIHZpc2libGUgdmlld3BvcnQuCisgICAgICAgIG1fZnJh
bWUtPnZpZXcoKS0+c2V0UGFpbnRzRW50aXJlQ29udGVudHModHJ1ZSk7CisgICAgfQorfQorCitX
VEY6OlN0cmluZyBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OnVzZXJBZ2VudChjb25zdCBL
VVJMJikKK3sKKyAgICByZXR1cm4gbV93ZWJQYWdlUHJpdmF0ZS0+bV93ZWJTZXR0aW5ncy0+dXNl
ckFnZW50U3RyaW5nKCk7Cit9CisKK2Jvb2wgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpj
YW5IYW5kbGVSZXF1ZXN0KGNvbnN0IFJlc291cmNlUmVxdWVzdCYpIGNvbnN0Cit7CisgICAgLy8g
RklYTUU6IFN0dWIuCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRnJhbWVMb2FkZXJDbGll
bnRCbGFja0JlcnJ5OjpjYW5TaG93TUlNRVR5cGUoY29uc3QgV1RGOjpTdHJpbmcmIG1pbWVUeXBl
SW4pIGNvbnN0Cit7CisgICAgLy8gR2V0IG5vcm1hbGl6ZWQgdHlwZS4KKyAgICBXVEY6OlN0cmlu
ZyBtaW1lVHlwZSA9IEJsYWNrQmVycnk6OldlYktpdDo6V2ViU2V0dGluZ3M6OmdldE5vcm1hbGl6
ZWRNSU1FVHlwZShtaW1lVHlwZUluKTsKKworICAgIC8vIEZJWE1FOiBTZWVtcyBubyBvdGhlciBw
b3J0IGNoZWNrcyBlbXB0eSBNSU1FIHR5cGUgaW4gdGhpcyBmdW5jdGlvbi4gU2hvdWxkIHdlIGRv
IHRoYXQ/CisgICAgcmV0dXJuIE1JTUVUeXBlUmVnaXN0cnk6OmlzU3VwcG9ydGVkSW1hZ2VNSU1F
VHlwZShtaW1lVHlwZSkgfHwgTUlNRVR5cGVSZWdpc3RyeTo6aXNTdXBwb3J0ZWROb25JbWFnZU1J
TUVUeXBlKG1pbWVUeXBlKQorICAgICAgICB8fCBNSU1FVHlwZVJlZ2lzdHJ5Ojppc1N1cHBvcnRl
ZE1lZGlhTUlNRVR5cGUobWltZVR5cGUpIHx8IEJsYWNrQmVycnk6OldlYktpdDo6V2ViU2V0dGlu
Z3M6OmlzU3VwcG9ydGVkT2JqZWN0TUlNRVR5cGUobWltZVR5cGUpCisgICAgICAgIHx8IChtaW1l
VHlwZSA9PSAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTsKK30KKworYm9vbCBGcmFt
ZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmNhblNob3dNSU1FVHlwZUFzSFRNTChjb25zdCBXVEY6
OlN0cmluZyYpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IFN0dWIuCisgICAgcmV0dXJuIHRydWU7
Cit9CisKKworYm9vbCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmlzTWFpbkZyYW1lKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gbV9mcmFtZSA9PSBtX3dlYlBhZ2VQcml2YXRlLT5tX21haW5G
cmFtZTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlk
U3RhcnRQcm92aXNpb25hbExvYWQoKQoreworICAgIGlmIChpc01haW5GcmFtZSgpKQorICAgICAg
ICBtX3dlYlBhZ2VQcml2YXRlLT5zZXRMb2FkU3RhdGUoV2ViUGFnZVByaXZhdGU6OlByb3Zpc2lv
bmFsKTsKKworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlKQorICAg
ICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlLT5kaWRTdGFydFByb3Zpc2lv
bmFsTG9hZEZvckZyYW1lKG1fZnJhbWUpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50Qmxh
Y2tCZXJyeTo6ZGlzcGF0Y2hEaWRSZWNlaXZlUmVzcG9uc2UoV2ViQ29yZTo6RG9jdW1lbnRMb2Fk
ZXIqLCB1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIsIGNvbnN0IFdlYkNvcmU6OlJlc291cmNlUmVz
cG9uc2UmIHJlc3BvbnNlKQoreworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5k
ZXJUcmVlKQorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlLT5kaWRS
ZWNlaXZlUmVzcG9uc2VGb3JGcmFtZShtX2ZyYW1lLCByZXNwb25zZSk7Cit9CisKK3ZvaWQgRnJh
bWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZFJlY2VpdmVUaXRsZShjb25zdCBT
dHJpbmdXaXRoRGlyZWN0aW9uJiB0aXRsZSkKK3sKKyAgICBpZiAoaXNNYWluRnJhbWUoKSkKKyAg
ICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPnNldFBhZ2VUaXRsZSh0aXRsZS5zdHJp
bmcoKS5jaGFyYWN0ZXJzKCksIHRpdGxlLnN0cmluZygpLmxlbmd0aCgpKTsKKworICAgIGlmICht
X3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlKQorICAgICAgICBtX3dlYlBhZ2VQcml2
YXRlLT5tX2R1bXBSZW5kZXJUcmVlLT5kaWRSZWNlaXZlVGl0bGVGb3JGcmFtZSh0aXRsZS5zdHJp
bmcoKSwgbV9mcmFtZSk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpz
ZXRUaXRsZShjb25zdCBTdHJpbmdXaXRoRGlyZWN0aW9uJiAvKnRpdGxlKi8sIGNvbnN0IEtVUkwm
IC8qdXJsKi8pCit7CisgICAgLy8gVXNlZCBieSBBcHBsZSBXZWJLaXQgdG8gdXBkYXRlIHRoZSB0
aXRsZSBvZiBhbiBleGlzdGluZyBoaXN0b3J5IGl0ZW0uCisgICAgLy8gUXRXZWJLaXQgZG9lc24n
dCBhY2NvbW9kYXRlIHRoaXMgb24gaGlzdG9yeSBpdGVtcy4gSWYgaXQgZXZlciBkb2VzLAorICAg
IC8vIGl0IHNob3VsZCBiZSBwcml2YXRlQnJvd3NpbmctYXdhcmUuIEZvciBub3csIHdlIGFyZSBq
dXN0IHBhc3NpbmcKKyAgICAvLyBnbG9iYWxoaXN0b3J5IGxheW91dCB0ZXN0cy4KKyAgICAvLyBG
SVhNRTogVXNlIGRpcmVjdGlvbiBvZiB0aXRsZS4KKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQor
Cit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRDb21taXRMb2Fk
KCkKK3sKKyAgICAvLyBGSVhNRTogRG8gd2UgbmVlZCB0byBmaW5kIGEgcmVwbGFjZW1lbnQgZm9y
IG1fZnJhbWUtPmRvY3VtZW50KCktPnNldEV4dHJhTGF5b3V0RGVsYXkoMjUwKTs/CisKKyAgICBT
ZWN1cml0eU9yaWdpbiogc2VjdXJpdHlPcmlnaW4gPSBtX2ZyYW1lLT5kb2N1bWVudCgpLT5zZWN1
cml0eU9yaWdpbigpOworICAgIEJsYWNrQmVycnk6OldlYktpdDo6V2ViU2V0dGluZ3MqIHdlYlNl
dHRpbmdzID0gbV93ZWJQYWdlUHJpdmF0ZS0+bV93ZWJTZXR0aW5nczsKKworICAgIC8vIFdoaXRl
bGlzdCBhbGwga25vd24gcHJvdG9jb2xzIGlmIEJyb3dzZXJGaWVsZDIgcmVxdWlyZXMgdW5yZXN0
cmljdGVkIHJlcXVlc3RzLgorICAgIGlmICh3ZWJTZXR0aW5ncy0+YWxsb3dDcm9zc1NpdGVSZXF1
ZXN0cygpICYmICFzZWN1cml0eU9yaWdpbi0+cHJvdG9jb2woKS5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgU2VjdXJpdHlQb2xpY3k6OmFkZE9yaWdpbkFjY2Vzc1doaXRlbGlzdEVudHJ5KCpzZWN1cml0
eU9yaWdpbiwgU3RyaW5nKCJhYm91dCIpLCAiIiwgdHJ1ZSk7CisgICAgICAgIFNlY3VyaXR5UG9s
aWN5OjphZGRPcmlnaW5BY2Nlc3NXaGl0ZWxpc3RFbnRyeSgqc2VjdXJpdHlPcmlnaW4sIFN0cmlu
ZygiZGF0YSIpLCBTdHJpbmcoIiIpLCB0cnVlKTsKKyAgICAgICAgU2VjdXJpdHlQb2xpY3k6OmFk
ZE9yaWdpbkFjY2Vzc1doaXRlbGlzdEVudHJ5KCpzZWN1cml0eU9yaWdpbiwgU3RyaW5nKCJmaWxl
IiksIFN0cmluZygiIiksIHRydWUpOworICAgICAgICBTZWN1cml0eVBvbGljeTo6YWRkT3JpZ2lu
QWNjZXNzV2hpdGVsaXN0RW50cnkoKnNlY3VyaXR5T3JpZ2luLCBTdHJpbmcoImh0dHAiKSwgU3Ry
aW5nKCIiKSwgdHJ1ZSk7CisgICAgICAgIFNlY3VyaXR5UG9saWN5OjphZGRPcmlnaW5BY2Nlc3NX
aGl0ZWxpc3RFbnRyeSgqc2VjdXJpdHlPcmlnaW4sIFN0cmluZygiaHR0cHMiKSwgU3RyaW5nKCIi
KSwgdHJ1ZSk7CisgICAgICAgIFNlY3VyaXR5UG9saWN5OjphZGRPcmlnaW5BY2Nlc3NXaGl0ZWxp
c3RFbnRyeSgqc2VjdXJpdHlPcmlnaW4sIFN0cmluZygiamF2YXNjcmlwdCIpLCBTdHJpbmcoIiIp
LCB0cnVlKTsKKyAgICAgICAgU2VjdXJpdHlQb2xpY3k6OmFkZE9yaWdpbkFjY2Vzc1doaXRlbGlz
dEVudHJ5KCpzZWN1cml0eU9yaWdpbiwgU3RyaW5nKCJsb2NhbCIpLCBTdHJpbmcoIiIpLCB0cnVl
KTsKKyAgICAgICAgU2VjdXJpdHlQb2xpY3k6OmFkZE9yaWdpbkFjY2Vzc1doaXRlbGlzdEVudHJ5
KCpzZWN1cml0eU9yaWdpbiwgU3RyaW5nKCJtYWlsdG8iKSwgU3RyaW5nKCIiKSwgdHJ1ZSk7Cisg
ICAgICAgIFNlY3VyaXR5UG9saWN5OjphZGRPcmlnaW5BY2Nlc3NXaGl0ZWxpc3RFbnRyeSgqc2Vj
dXJpdHlPcmlnaW4sIFN0cmluZygicGF0dGVybiIpLCBTdHJpbmcoIiIpLCB0cnVlKTsKKyAgICAg
ICAgU2VjdXJpdHlQb2xpY3k6OmFkZE9yaWdpbkFjY2Vzc1doaXRlbGlzdEVudHJ5KCpzZWN1cml0
eU9yaWdpbiwgU3RyaW5nKCJydGNwIiksIFN0cmluZygiIiksIHRydWUpOworICAgICAgICBTZWN1
cml0eVBvbGljeTo6YWRkT3JpZ2luQWNjZXNzV2hpdGVsaXN0RW50cnkoKnNlY3VyaXR5T3JpZ2lu
LCBTdHJpbmcoInJ0cCIpLCBTdHJpbmcoIiIpLCB0cnVlKTsKKyAgICAgICAgU2VjdXJpdHlQb2xp
Y3k6OmFkZE9yaWdpbkFjY2Vzc1doaXRlbGlzdEVudHJ5KCpzZWN1cml0eU9yaWdpbiwgU3RyaW5n
KCJydHNwIiksIFN0cmluZygiIiksIHRydWUpOworICAgICAgICBTZWN1cml0eVBvbGljeTo6YWRk
T3JpZ2luQWNjZXNzV2hpdGVsaXN0RW50cnkoKnNlY3VyaXR5T3JpZ2luLCBTdHJpbmcoInNtcyIp
LCBTdHJpbmcoIiIpLCB0cnVlKTsKKyAgICAgICAgU2VjdXJpdHlQb2xpY3k6OmFkZE9yaWdpbkFj
Y2Vzc1doaXRlbGlzdEVudHJ5KCpzZWN1cml0eU9yaWdpbiwgU3RyaW5nKCJ0ZWwiKSwgU3RyaW5n
KCIiKSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gV2UgYWxzbyB3YW50IHRvIGJlIGFibGUgdG8gaGFu
ZGxlIHVua25vd24gcHJvdG9jb2xzIGluIHRoZSBjbGllbnQuCisgICAgICAgIHNlY3VyaXR5T3Jp
Z2luLT5ncmFudFVuaXZlcnNhbEFjY2VzcygpOworICAgIH0KKworICAgIGlmIChpc01haW5GcmFt
ZSgpKSB7CisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPnNldExvYWRTdGF0ZShXZWJQYWdlUHJp
dmF0ZTo6Q29tbWl0dGVkKTsKKworICAgICAgICBXVEY6OlN0cmluZyBvcmlnaW5hbFVybCA9IG1f
ZnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigpLT5vcmlnaW5hbFJlcXVlc3QoKS51cmwo
KS5zdHJpbmcoKTsKKyAgICAgICAgV1RGOjpTdHJpbmcgdXJsID0gbV9mcmFtZS0+bG9hZGVyKCkt
PmRvY3VtZW50TG9hZGVyKCktPnJlcXVlc3QoKS51cmwoKS5zdHJpbmcoKTsKKyAgICAgICAgV1RG
OjpTdHJpbmcgdG9rZW4gPSBtX2ZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKS0+cmVx
dWVzdCgpLnRva2VuKCk7CisKKyAgICAgICAgLy8gTm90aWZ5IHRoZSBjbGllbnQgdGhhdCB0aGUg
bG9hZCBzdWNjZWVkZWQgb3IgZmFpbGVkIChpZiBpdCBmYWlsZWQsIHRoaXMKKyAgICAgICAgLy8g
aXMgYWN0dWFsbHkgY29tbWl0dGluZyB0aGUgZXJyb3IgcGFnZSwgd2hpY2ggd2FzIHNldCB0aHJv
dWdoCisgICAgICAgIC8vIFN1YnN0aXR1dGVEYXRhIGluIGRpc3BhdGNoRGlkRmFpbFByb3Zpc2lv
bmFsTG9hZCkKKyAgICAgICAgaWYgKG1fbG9hZGluZ0Vycm9yUGFnZSkgeworICAgICAgICAgICAg
bV9sb2FkaW5nRXJyb3JQYWdlID0gZmFsc2U7CisgICAgICAgICAgICBtX3dlYlBhZ2VQcml2YXRl
LT5tX2NsaWVudC0+bm90aWZ5TG9hZEZhaWxlZEJlZm9yZUNvbW1pdCgKKyAgICAgICAgICAgICAg
ICBvcmlnaW5hbFVybC5jaGFyYWN0ZXJzKCksIG9yaWdpbmFsVXJsLmxlbmd0aCgpLAorICAgICAg
ICAgICAgICAgICAgICB1cmwuY2hhcmFjdGVycygpLCB1cmwubGVuZ3RoKCksIHRva2VuLmNoYXJh
Y3RlcnMoKSwgdG9rZW4ubGVuZ3RoKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
bV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlmeUxvYWRDb21taXR0ZWQoCisgICAgICAg
ICAgICAgICAgb3JpZ2luYWxVcmwuY2hhcmFjdGVycygpLCBvcmlnaW5hbFVybC5sZW5ndGgoKSwK
KyAgICAgICAgICAgICAgICAgICAgdXJsLmNoYXJhY3RlcnMoKSwgdXJsLmxlbmd0aCgpLCB0b2tl
bi5jaGFyYWN0ZXJzKCksIHRva2VuLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlKQorICAgICAgICBtX3dlYlBh
Z2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlLT5kaWRDb21taXRMb2FkRm9yRnJhbWUobV9mcmFt
ZSk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZEhh
bmRsZU9ubG9hZEV2ZW50cygpCit7CisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5v
dGlmeURvY3VtZW50T25Mb2FkKCk7CisgICAgaWYgKG1fd2ViUGFnZVByaXZhdGUtPm1fZHVtcFJl
bmRlclRyZWUpCisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUtPmRp
ZEhhbmRsZU9ubG9hZEV2ZW50c0ZvckZyYW1lKG1fZnJhbWUpOworfQorCit2b2lkIEZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRGaW5pc2hMb2FkKCkKK3sKKyAgICBkaWRG
aW5pc2hPckZhaWxMb2FkaW5nKFJlc291cmNlRXJyb3IoKSk7CisKKyAgICBpZiAobV93ZWJQYWdl
UHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9k
dW1wUmVuZGVyVHJlZS0+ZGlkRmluaXNoTG9hZEZvckZyYW1lKG1fZnJhbWUpOworCisgICAgaWYg
KCFpc01haW5GcmFtZSgpIHx8IG1fd2ViUGFnZVByaXZhdGUtPm1fd2ViU2V0dGluZ3MtPmlzRW1h
aWxNb2RlKCkKKyAgICAgICAgfHwgIW1fZnJhbWUtPmRvY3VtZW50KCkgfHwgIW1fZnJhbWUtPmRv
Y3VtZW50KCktPmhlYWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgSFRNTEhlYWRFbGVtZW50
KiBoZWFkRWxlbWVudCA9IG1fZnJhbWUtPmRvY3VtZW50KCktPmhlYWQoKTsKKyAgICAvLyBGSVhN
RTogSGFuZGxlIE5PU0NSSVBUIHNwZWNpYWwgY2FzZT8KKworICAgIC8vIFByb2Nlc3MgZG9jdW1l
bnQgbWV0YWRhdGEuCisgICAgUmVmUHRyPE5vZGVMaXN0PiBub2RlTGlzdCA9IGhlYWRFbGVtZW50
LT5nZXRFbGVtZW50c0J5VGFnTmFtZSgibWV0YSIpOworICAgIHVuc2lnbmVkIGludCBzaXplID0g
bm9kZUxpc3QtPmxlbmd0aCgpOworICAgIFNjb3BlQXJyYXk8V2ViU3RyaW5nPiBoZWFkZXJzOwor
CisgICAgLy8gVGhpcyBtYXkgYWxsb2NhdGUgbW9yZSBzcGFjZSB0aGFuIG5lZWRlZCBzaW5jZSBu
b3QgYWxsIG1ldGEgZWxlbWVudHMgd2lsbCBiZSBodHRwLWVxdWl2LgorICAgIGhlYWRlcnMucmVz
ZXQobmV3IFdlYlN0cmluZ1syICogc2l6ZV0pOworICAgIHVuc2lnbmVkIGhlYWRlcnNMZW5ndGgg
PSAwOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAg
ICBIVE1MTWV0YUVsZW1lbnQqIG1ldGFFbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTE1ldGFFbGVt
ZW50Kj4obm9kZUxpc3QtPml0ZW0oaSkpOworICAgICAgICBpZiAoV1RGOjplcXVhbElnbm9yaW5n
Q2FzZShtZXRhRWxlbWVudC0+bmFtZSgpLCAiYXBwbGUtbW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIp
CisgICAgICAgICAgICAmJiBXVEY6OmVxdWFsSWdub3JpbmdDYXNlKG1ldGFFbGVtZW50LT5jb250
ZW50KCkuc3RyaXBXaGl0ZVNwYWNlKCksICJ5ZXMiKSkKKyAgICAgICAgICAgIG1fd2ViUGFnZVBy
aXZhdGUtPm1fY2xpZW50LT5zZXRXZWJBcHBDYXBhYmxlKCk7CisgICAgICAgIGVsc2UgeworICAg
ICAgICAgICAgV1RGOjpTdHJpbmcgaHR0cEVxdWl2ID0gbWV0YUVsZW1lbnQtPmh0dHBFcXVpdigp
LnN0cmlwV2hpdGVTcGFjZSgpOworICAgICAgICAgICAgV1RGOjpTdHJpbmcgY29udGVudCA9IG1l
dGFFbGVtZW50LT5jb250ZW50KCkuc3RyaXBXaGl0ZVNwYWNlKCk7CisKKyAgICAgICAgICAgIGlm
ICghaHR0cEVxdWl2LmlzTnVsbCgpICYmICFjb250ZW50LmlzTnVsbCgpKSB7CisgICAgICAgICAg
ICAgICAgaGVhZGVyc1toZWFkZXJzTGVuZ3RoKytdID0gaHR0cEVxdWl2OworICAgICAgICAgICAg
ICAgIGhlYWRlcnNbaGVhZGVyc0xlbmd0aCsrXSA9IGNvbnRlbnQ7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaGVhZGVyc0xlbmd0aCA+IDApCisgICAgICAgIG1f
d2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5zZXRNZXRhSGVhZGVycyhoZWFkZXJzLCBoZWFkZXJz
TGVuZ3RoKTsKKworICAgIG5vZGVMaXN0ID0gaGVhZEVsZW1lbnQtPmdldEVsZW1lbnRzQnlUYWdO
YW1lKCJsaW5rIik7CisgICAgc2l6ZSA9IG5vZGVMaXN0LT5sZW5ndGgoKTsKKworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgSFRNTExpbmtFbGVtZW50
KiBsaW5rRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVudCo+KG5vZGVMaXN0LT5p
dGVtKGkpKTsKKyAgICAgICAgV1RGOjpTdHJpbmcgaHJlZiA9IGxpbmtFbGVtZW50LT5ocmVmKCku
c3RyaW5nKCk7CisgICAgICAgIGlmICghaHJlZi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIFdU
Rjo6U3RyaW5nIHRpdGxlID0gbGlua0VsZW1lbnQtPnRpdGxlKCk7CisKKyAgICAgICAgICAgIGlm
IChXVEY6OmVxdWFsSWdub3JpbmdDYXNlKGxpbmtFbGVtZW50LT5yZWwoKSwgImFwcGxlLXRvdWNo
LWljb24iKSkKKyAgICAgICAgICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+c2V0
TGFyZ2VJY29uKGhyZWYubGF0aW4xKCkuZGF0YSgpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKFdU
Rjo6ZXF1YWxJZ25vcmluZ0Nhc2UobGlua0VsZW1lbnQtPnJlbCgpLCAic2VhcmNoIikpIHsKKyAg
ICAgICAgICAgICAgICBpZiAoV1RGOjplcXVhbElnbm9yaW5nQ2FzZShsaW5rRWxlbWVudC0+dHlw
ZSgpLCAiYXBwbGljYXRpb24vb3BlbnNlYXJjaGRlc2NyaXB0aW9uK3htbCIpKQorICAgICAgICAg
ICAgICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+c2V0U2VhcmNoUHJvdmlkZXJE
ZXRhaWxzKHRpdGxlLnV0ZjgoKS5kYXRhKCksIGhyZWYudXRmOCgpLmRhdGEoKSk7CisgICAgICAg
ICAgICB9IGVsc2UgaWYgKFdURjo6ZXF1YWxJZ25vcmluZ0Nhc2UobGlua0VsZW1lbnQtPnJlbCgp
LCAiYWx0ZXJuYXRlIikKKyAgICAgICAgICAgICAgICAmJiAoV1RGOjplcXVhbElnbm9yaW5nQ2Fz
ZShsaW5rRWxlbWVudC0+dHlwZSgpLCAiYXBwbGljYXRpb24vcnNzK3htbCIpCisgICAgICAgICAg
ICAgICAgfHwgV1RGOjplcXVhbElnbm9yaW5nQ2FzZShsaW5rRWxlbWVudC0+dHlwZSgpLCAiYXBw
bGljYXRpb24vYXRvbSt4bWwiKSkpCisgICAgICAgICAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+
bV9jbGllbnQtPnNldEFsdGVybmF0ZUZlZWREZXRhaWxzKHRpdGxlLnV0ZjgoKS5kYXRhKCksIGhy
ZWYudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRnJhbWVMb2Fk
ZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZEZpbmlzaERvY3VtZW50TG9hZCgpCit7Cisg
ICAgaWYgKG1fd2ViUGFnZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUpCisgICAgICAgIG1fd2Vi
UGFnZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUtPmRpZEZpbmlzaERvY3VtZW50TG9hZEZvckZy
YW1lKG1fZnJhbWUpOworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKKwordm9pZCBGcmFtZUxv
YWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkRmFpbExvYWQoY29uc3QgUmVzb3VyY2VF
cnJvciYgZXJyb3IpCit7CisgICAgZGlkRmluaXNoT3JGYWlsTG9hZGluZyhlcnJvcik7CisgICAg
aWYgKG1fd2ViUGFnZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUpCisgICAgICAgIG1fd2ViUGFn
ZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUtPmRpZEZhaWxMb2FkRm9yRnJhbWUobV9mcmFtZSk7
Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaWRGaW5pc2hPckZhaWxM
b2FkaW5nKGNvbnN0IFJlc291cmNlRXJyb3ImIGVycm9yKQoreworICAgIC8vIEZJWE1FOiBEbyB3
ZSBuZWVkIHRvIGZpbmQgYSByZXBsYWNlbWVudCBmb3IgbV9mcmFtZS0+ZG9jdW1lbnQoKS0+c2V0
RXh0cmFMYXlvdXREZWxheSgwKTs/CisKKyAgICAvLyBJZiB3ZSBoYXZlIGZpbmlzaGVkIGxvYWRp
bmcgYSBwYWdlIHRocm91Z2ggaGlzdG9yeSBuYXZpZ2F0aW9uLCBhbnkKKyAgICAvLyBhdHRlbXB0
IHRvIGdvIGJhY2sgdG8gdGhhdCBwYWdlIHRocm91Z2ggYW4gYXV0b21hdGljIHJlZGlyZWN0IHNo
b3VsZCBiZQorICAgIC8vIGRlbmllZCB0byBhdm9pZCByZWRpcmVjdCBsb29wcy4gU28gc2F2ZSB0
aGUgaGlzdG9yeSBuYXZpZ2F0aW9uIHVybHMgdG8KKyAgICAvLyBjaGVjayBsYXRlci4gKElmIHRo
aXMgd2FzIG5vdCBhIGhpc3RvcnkgbmF2aWdhdGlvbiwKKyAgICAvLyBtX2hpc3RvcnlOYXZpZ2F0
aW9uU291cmNlVVJMcyB3aWxsIGJlIGVtcHR5LCBhbmQgd2Ugc2hvdWxkIHNhdmUgdGhhdAorICAg
IC8vIHRvby4pCisgICAgbV9yZWRpcmVjdFVSTHNUb1NraXBEdWVUb0hpc3RvcnlOYXZpZ2F0aW9u
LnN3YXAobV9oaXN0b3J5TmF2aWdhdGlvblNvdXJjZVVSTHMpOworCisgICAgLy8gSGlzdG9yeSBu
YXZpZ2F0aW9uIGlzIGZpbmlzaGVkIHNvIGNsZWFyIHRoZSBoaXN0b3J5IG5hdmlnYXRpb24gdXJs
LgorICAgIG1faGlzdG9yeU5hdmlnYXRpb25Tb3VyY2VVUkxzLmNsZWFyKCk7CisKKyAgICBpZiAo
aXNNYWluRnJhbWUoKSkgeworICAgICAgICBtX2xvYWRFcnJvciA9IGVycm9yOworICAgICAgICBt
X3dlYlBhZ2VQcml2YXRlLT5zZXRMb2FkU3RhdGUoZXJyb3IuaXNOdWxsKCkgPyBXZWJQYWdlUHJp
dmF0ZTo6RmluaXNoZWQgOiBXZWJQYWdlUHJpdmF0ZTo6RmFpbGVkKTsKKyAgICB9Cit9CisKK3Zv
aWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZEZhaWxQcm92aXNpb25h
bExvYWQoY29uc3QgUmVzb3VyY2VFcnJvciYgZXJyb3IpCit7CisgICAgaWYgKGlzTWFpbkZyYW1l
KCkpIHsKKyAgICAgICAgbV9sb2FkRXJyb3IgPSBlcnJvcjsKKyAgICAgICAgbV93ZWJQYWdlUHJp
dmF0ZS0+c2V0TG9hZFN0YXRlKFdlYlBhZ2VQcml2YXRlOjpGYWlsZWQpOworCisgICAgICAgIGlm
IChlcnJvci5kb21haW4oKSA9PSBSZXNvdXJjZUVycm9yOjpwbGF0Zm9ybUVycm9yRG9tYWluCisg
ICAgICAgICAgICAgICAgJiYgKGVycm9yLmVycm9yQ29kZSgpID09IEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpGaWx0ZXJTdHJlYW06OlN0YXR1c0Vycm9yQWxyZWFkeUhhbmRsZWQpKSB7CisgICAgICAg
ICAgICAvLyBFcnJvciBoYXMgYWxyZWFkeSBiZWVuIGRpc3BsYXllZCBieSBjbGllbnQuCisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyb3IuZG9tYWluKCku
aXNFbXB0eSgpICYmICFlcnJvci5lcnJvckNvZGUoKSAmJiBlcnJvci5mYWlsaW5nVVJMKCkuaXNF
bXB0eSgpICYmIGVycm9yLmxvY2FsaXplZERlc2NyaXB0aW9uKCkuaXNFbXB0eSgpKSB7CisgICAg
ICAgICAgICAvLyBEb24ndCB0cnkgdG8gZGlzcGxheSBlbXB0eSBlcnJvcnMgcmV0dXJuZWQgZnJv
bSB0aGUgdW5pbXBsZW1lbnRlZCBlcnJvciBmdW5jdGlvbnMgaW4gRnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5IC0gdGhlcmUncyBub3RoaW5nIHRvIGRpc3BsYXkgYW55d2F5LgorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1fd2ViUGFnZVByaXZhdGUt
Pm1fZHVtcFJlbmRlclRyZWUpCisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fZHVtcFJlbmRl
clRyZWUtPmRpZEZhaWxQcm92aXNpb25hbExvYWRGb3JGcmFtZShtX2ZyYW1lKTsKKworICAgIGlm
ICghaXNNYWluRnJhbWUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgV1RGOjpTdHJpbmcgZXJy
b3JQYWdlID0gbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPmdldEVycm9yUGFnZShlcnJvci5l
cnJvckNvZGUoKQorICAgICAgICAgICAgLCBlcnJvci5sb2NhbGl6ZWREZXNjcmlwdGlvbigpLmlz
RW1wdHkoKSA/ICIiIDogZXJyb3IubG9jYWxpemVkRGVzY3JpcHRpb24oKS51dGY4KCkuZGF0YSgp
CisgICAgICAgICAgICAsIGVycm9yLmZhaWxpbmdVUkwoKS5pc0VtcHR5KCkgPyAiIiA6IGVycm9y
LmZhaWxpbmdVUkwoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSdyZSBz
dGlsbCBpbiB0aGUgcHJvdmlzaW9uYWxMb2FkIHN0YXRlIC0gZ2V0RXJyb3JQYWdlIHJ1bnMgYQor
ICAgIC8vIG5lc3RlZCBldmVudCBsb29wIHdoaWxlIGl0J3Mgd2FpdGluZyBmb3IgY2xpZW50IHJl
c291cmNlcyB0byBsb2FkIHNvCisgICAgLy8gdGhlcmUncyBhIHNtYWxsIHdpbmRvdyBmb3IgdGhl
IHVzZXIgdG8gaGl0IHN0b3AuCisgICAgaWYgKG1fZnJhbWUtPmxvYWRlcigpLT5wcm92aXNpb25h
bERvY3VtZW50TG9hZGVyKCkpIHsKKyAgICAgICAgU3Vic3RpdHV0ZURhdGEgZXJyb3JEYXRhKHV0
ZjhCdWZmZXIoZXJyb3JQYWdlKSwgInRleHQvaHRtbCIsICJ1dGYtOCIsIEtVUkwoS1VSTCgpLCBl
cnJvci5mYWlsaW5nVVJMKCkpKTsKKworICAgICAgICBSZXNvdXJjZVJlcXVlc3Qgb3JpZ2luYWxS
ZXF1ZXN0ID0gbV9mcmFtZS0+bG9hZGVyKCktPnByb3Zpc2lvbmFsRG9jdW1lbnRMb2FkZXIoKS0+
b3JpZ2luYWxSZXF1ZXN0KCk7CisKKyAgICAgICAgLy8gTG9hZGluZyB1c2luZyBTdWJzdGl0dXRl
RGF0YSB3aWxsIHJlcGxhY2UgdGhlIG9yaWdpbmFsIHJlcXVlc3Qgd2l0aCBvdXIKKyAgICAgICAg
Ly8gZXJyb3IgZGF0YS4gVGhpcyBtdXN0IGJlIGRvbmUgd2l0aGluIGRpc3BhdGNoRGlkRmFpbFBy
b3Zpc2lvbmFsTG9hZCwKKyAgICAgICAgLy8gYW5kIGRvIE5PVCBjYWxsIHN0b3BBbGxMb2FkZXJz
IGZpcnN0LCBiZWNhdXNlIHRoZSBsb2FkZXIgY2hlY2tzIHRoZQorICAgICAgICAvLyBwcm92aXNp
b25hbERvY3VtZW50TG9hZGVyIHRvIGRlY2lkZSB0aGUgbG9hZCB0eXBlOyBpZiBjYWxsZWQgYW55
IG90aGVyCisgICAgICAgIC8vIHdheSwgdGhlIGVycm9yIHBhZ2UgaXMgYWRkZWQgdG8gdGhlIGVu
ZCBvZiB0aGUgaGlzdG9yeSBpbnN0ZWFkIG9mCisgICAgICAgIC8vIHJlcGxhY2luZyB0aGUgZmFp
bGVkIGxvYWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoaXMgY29tZXMgZnJvbSBhIGJh
Y2svZm9yd2FyZCBuYXZpZ2F0aW9uLCB3ZSBuZWVkIHRvIHNhdmUgdGhlIGN1cnJlbnQgdmlld3N0
YXRlCisgICAgICAgIC8vIHRvIG9yaWdpbmFsIGhpc3RvcnlpdGVtLCBhbmQgcHJldmVudCB0aGUg
cmVzdG9yZSBvZiB2aWV3IHN0YXRlIHRvIHRoZSBlcnJvciBwYWdlLgorCisgICAgICAgIGlmIChX
ZWJDb3JlOjppc0JhY2tGb3J3YXJkTG9hZFR5cGUobV9mcmFtZS0+bG9hZGVyKCktPmxvYWRUeXBl
KCkpKSB7CisgICAgICAgICAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+aGlzdG9yeSgpLT5zYXZlU2Ny
b2xsUG9zaXRpb25BbmRWaWV3U3RhdGVUb0l0ZW0obV9mcmFtZS0+bG9hZGVyKCktPmhpc3Rvcnko
KS0+Y3VycmVudEl0ZW0oKSk7CisgICAgICAgICAgICBBU1NFUlQobV9mcmFtZS0+bG9hZGVyKCkt
Pmhpc3RvcnkoKS0+cHJvdmlzaW9uYWxJdGVtKCkpOworICAgICAgICAgICAgbV9mcmFtZS0+bG9h
ZGVyKCktPmhpc3RvcnkoKS0+cHJvdmlzaW9uYWxJdGVtKCktPnZpZXdTdGF0ZSgpLnNob3VsZFNh
dmVWaWV3U3RhdGUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtX2xvYWRpbmdFcnJvclBh
Z2UgPSB0cnVlOworICAgICAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+bG9hZChvcmlnaW5hbFJlcXVl
c3QsIGVycm9yRGF0YSwgZmFsc2UpOworICAgIH0KK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVu
dEJsYWNrQmVycnk6OmRpc3BhdGNoV2lsbFN1Ym1pdEZvcm0oRnJhbWVQb2xpY3lGdW5jdGlvbiBm
dW5jdGlvbiwgUGFzc1JlZlB0cjxGb3JtU3RhdGU+KQoreworICAgIC8vIEZJWE1FOiBTdHViLgor
ICAgIChtX2ZyYW1lLT5sb2FkZXIoKS0+cG9saWN5Q2hlY2tlcigpLT4qZnVuY3Rpb24pKFBvbGlj
eVVzZSk7Cit9CisKK1dURjo6UGFzc1JlZlB0cjxGcmFtZT4gRnJhbWVMb2FkZXJDbGllbnRCbGFj
a0JlcnJ5OjpjcmVhdGVGcmFtZShjb25zdCBLVVJMJiB1cmwsIGNvbnN0IFdURjo6U3RyaW5nJiBu
YW1lCisgICAgLCBIVE1MRnJhbWVPd25lckVsZW1lbnQqIG93bmVyRWxlbWVudCwgY29uc3QgV1RG
OjpTdHJpbmcmIHJlZmVycmVyLCBib29sIGFsbG93c1Njcm9sbGluZywgaW50IG1hcmdpbldpZHRo
LCBpbnQgbWFyZ2luSGVpZ2h0KQoreworICAgIGlmICghbV93ZWJQYWdlUHJpdmF0ZSkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBpZiAobV9jaGlsZEZyYW1lQ3JlYXRpb25TdXBwcmVzc2VkKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeSogZnJh
bWVMb2FkZXJDbGllbnQgPSBuZXcgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5KCk7CisgICAg
UmVmUHRyPEZyYW1lPiBjaGlsZEZyYW1lID0gRnJhbWU6OmNyZWF0ZShtX2ZyYW1lLT5wYWdlKCks
IG93bmVyRWxlbWVudCwgZnJhbWVMb2FkZXJDbGllbnQpOworICAgIGZyYW1lTG9hZGVyQ2xpZW50
LT5zZXRGcmFtZShjaGlsZEZyYW1lLmdldCgpLCBtX3dlYlBhZ2VQcml2YXRlKTsKKworICAgIC8v
IEluaXRpYWxpemUgRnJhbWVWaWV3LgorICAgIFJlZlB0cjxGcmFtZVZpZXc+IGZyYW1lVmlldyA9
IEZyYW1lVmlldzo6Y3JlYXRlKGNoaWxkRnJhbWUuZ2V0KCkpOworICAgIGNoaWxkRnJhbWUtPnNl
dFZpZXcoZnJhbWVWaWV3LmdldCgpKTsKKyAgICBpZiAoIWFsbG93c1Njcm9sbGluZykKKyAgICAg
ICAgZnJhbWVWaWV3LT5zZXRTY3JvbGxiYXJNb2RlcyhTY3JvbGxiYXJBbHdheXNPZmYsIFNjcm9s
bGJhckFsd2F5c09mZik7CisgICAgaWYgKG1hcmdpbldpZHRoICE9IC0xKQorICAgICAgICBmcmFt
ZVZpZXctPnNldE1hcmdpbldpZHRoKG1hcmdpbldpZHRoKTsKKyAgICBpZiAobWFyZ2luSGVpZ2h0
ICE9IC0xKQorICAgICAgICBmcmFtZVZpZXctPnNldE1hcmdpbkhlaWdodChtYXJnaW5IZWlnaHQp
OworCisgICAgY2hpbGRGcmFtZS0+dHJlZSgpLT5zZXROYW1lKG5hbWUpOworICAgIG1fZnJhbWUt
PnRyZWUoKS0+YXBwZW5kQ2hpbGQoY2hpbGRGcmFtZSk7CisgICAgY2hpbGRGcmFtZS0+aW5pdCgp
OworCisgICAgaWYgKCFjaGlsZEZyYW1lLT50cmVlKCktPnBhcmVudCgpKQorICAgICAgICByZXR1
cm4gMDsKKworICAgIEJhY2tpbmdTdG9yZUNsaWVudDo6Y3JlYXRlKGNoaWxkRnJhbWUuZ2V0KCks
IG1fZnJhbWUsIG1fd2ViUGFnZVByaXZhdGUtPm1fd2ViUGFnZSk7CisKKyAgICBtX2ZyYW1lLT5s
b2FkZXIoKS0+bG9hZFVSTEludG9DaGlsZEZyYW1lKHVybCwgcmVmZXJyZXIsIGNoaWxkRnJhbWUu
Z2V0KCkpOworCisgICAgaWYgKCFjaGlsZEZyYW1lLT50cmVlKCktPnBhcmVudCgpKQorICAgICAg
ICByZXR1cm4gMDsKKworICAgIHJldHVybiBjaGlsZEZyYW1lLnJlbGVhc2UoKTsKK30KKwordm9p
ZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpZFRyYW5zZmVyQ2hpbGRGcmFtZVRvTmV3
RG9jdW1lbnQoUGFnZSogLypvbGRQYWdlKi8pCit7CisgICAgUGFnZSogbmV3UGFnZSA9IG1fZnJh
bWUtPnBhZ2UoKTsKKyAgICBtX3dlYlBhZ2VQcml2YXRlID0gc3RhdGljX2Nhc3Q8Q2hyb21lQ2xp
ZW50QmxhY2tCZXJyeSo+KG5ld1BhZ2UtPmNocm9tZSgpLT5jbGllbnQoKSktPndlYlBhZ2VQcml2
YXRlKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojp0cmFuc2Zlckxv
YWRpbmdSZXNvdXJjZUZyb21QYWdlKFJlc291cmNlTG9hZGVyKiwgY29uc3QgUmVzb3VyY2VSZXF1
ZXN0JiwgUGFnZSopCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworT2JqZWN0Q29udGVu
dFR5cGUgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpvYmplY3RDb250ZW50VHlwZShjb25z
dCBLVVJMJiB1cmwsIGNvbnN0IFdURjo6U3RyaW5nJiBtaW1lVHlwZUluLCBib29sIHNob3VsZFBy
ZWZlclBsdWdJbnNGb3JJbWFnZXMpCit7CisgICAgV1RGOjpTdHJpbmcgbWltZVR5cGUgPSBtaW1l
VHlwZUluOworICAgIGlmIChtaW1lVHlwZS5pc0VtcHR5KCkpCisgICAgICAgIG1pbWVUeXBlID0g
TUlNRVR5cGVSZWdpc3RyeTo6Z2V0TUlNRVR5cGVGb3JQYXRoKHVybC5wYXRoKCkpOworCisgICAg
Ly8gR2V0IG1hcHBlZCB0eXBlLgorICAgIG1pbWVUeXBlID0gQmxhY2tCZXJyeTo6V2ViS2l0OjpX
ZWJTZXR0aW5nczo6Z2V0Tm9ybWFsaXplZE1JTUVUeXBlKG1pbWVUeXBlKTsKKworICAgIE9iamVj
dENvbnRlbnRUeXBlIGRlZmF1bHRUeXBlID0gRnJhbWVMb2FkZXI6OmRlZmF1bHRPYmplY3RDb250
ZW50VHlwZSh1cmwsIG1pbWVUeXBlLCBzaG91bGRQcmVmZXJQbHVnSW5zRm9ySW1hZ2VzKTsKKyAg
ICBpZiAoZGVmYXVsdFR5cGUgIT0gT2JqZWN0Q29udGVudE5vbmUpCisgICAgICAgIHJldHVybiBk
ZWZhdWx0VHlwZTsKKworICAgIGlmIChCbGFja0JlcnJ5OjpXZWJLaXQ6OldlYlNldHRpbmdzOjpp
c1N1cHBvcnRlZE9iamVjdE1JTUVUeXBlKG1pbWVUeXBlKSkKKyAgICAgICAgcmV0dXJuIFdlYkNv
cmU6Ok9iamVjdENvbnRlbnRPdGhlclBsdWdpbjsKKworICAgIHJldHVybiBPYmplY3RDb250ZW50
Tm9uZTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoV2ls
bENsb3NlKCkKK3sKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2lucHV0SGFuZGxlci0+ZnJhbWVV
bmxvYWRlZChtX2ZyYW1lKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6
OnNldE1haW5Eb2N1bWVudEVycm9yKERvY3VtZW50TG9hZGVyKiwgY29uc3QgUmVzb3VyY2VFcnJv
ciYgZXJyb3IpCit7CisgICAgaWYgKG1fcGx1Z2luVmlldykgeworICAgICAgICBtX3BsdWdpblZp
ZXctPmRpZEZhaWwoZXJyb3IpOworICAgICAgICBtX3BsdWdpblZpZXcgPSAwOworICAgICAgICBt
X2hhc1NlbnRSZXNwb25zZVRvUGx1Z2luID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIEZyYW1l
TG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6cG9zdFByb2dyZXNzU3RhcnRlZE5vdGlmaWNhdGlvbigp
Cit7CisgICAgaWYgKCFpc01haW5GcmFtZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBO
ZXcgbG9hZCBzdGFydGVkLCBzbyBjbGVhciB0aGUgZXJyb3IuCisgICAgbV9sb2FkRXJyb3IgPSBS
ZXNvdXJjZUVycm9yKCk7CisgICAgbV9zZW50UmVhZHlUb1JlbmRlciA9IGZhbHNlOworICAgIG1f
d2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5ub3RpZnlMb2FkU3RhcnRlZCgpOworfQorCit2b2lk
IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6cG9zdFByb2dyZXNzRXN0aW1hdGVDaGFuZ2Vk
Tm90aWZpY2F0aW9uKCkKK3sKKyAgICBpZiAoIWlzTWFpbkZyYW1lKCkgfHwgIW1fZnJhbWUtPnBh
Z2UoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQt
Pm5vdGlmeUxvYWRQcm9ncmVzcyhtX2ZyYW1lLT5wYWdlKCktPnByb2dyZXNzKCktPmVzdGltYXRl
ZFByb2dyZXNzKCkgKiAxMDApOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJy
eTo6ZGlzcGF0Y2hEaWRGaXJzdFZpc3VhbGx5Tm9uRW1wdHlMYXlvdXQoKQoreworICAgIGlmICgh
aXNNYWluRnJhbWUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiZGlzcGF0Y2hEaWRG
aXJzdFZpc3VhbGx5Tm9uRW1wdHlMYXlvdXQiKTsKKworICAgIHJlYWR5VG9SZW5kZXIodHJ1ZSk7
CisKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkbid0IGJlIGdldHRpbmcgaGVyZSBpZiB3ZSBhcmUg
bm90IGluIHRoZSBDb21taXR0ZWQgc3RhdGUgYnV0IHdlIGFyZQorICAgIC8vIHNvIHdlIGNhbiBu
b3QgYXNzZXJ0IG9uIHRoYXQgcmlnaHQgbm93LiBCdXQgd2Ugb25seSB3YW50IHRvIGRvIHRoaXMg
b24gbG9hZC4KKyAgICAvLyBSSU0gQnVnICM1NTUKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+
bG9hZFN0YXRlKCkgPT0gV2ViUGFnZVByaXZhdGU6OkNvbW1pdHRlZCkgeworICAgICAgICBtX3dl
YlBhZ2VQcml2YXRlLT56b29tVG9Jbml0aWFsU2NhbGVPbkxvYWQoKTsgLy8gU2V0IHRoZSBwcm9w
ZXIgem9vbSBsZXZlbCBmaXJzdC4KKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9iYWNraW5n
U3RvcmUtPmQtPmNsZWFyVmlzaWJsZVpvb20oKTsgLy8gQ2xlYXIgdGhlIHZpc2libGUgem9vbSBz
aW5jZSB3ZSdyZSBleHBsaWNpdGx5IHJlbmRlcmluZytibGl0dGluZyBiZWxvdy4KKyAgICAgICAg
bV93ZWJQYWdlUHJpdmF0ZS0+bV9iYWNraW5nU3RvcmUtPmQtPnJlbmRlclZpc2libGVDb250ZW50
cygpOworICAgIH0KKworICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5ub3RpZnlGaXJz
dFZpc3VhbGx5Tm9uRW1wdHlMYXlvdXQoKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJs
YWNrQmVycnk6OnBvc3RQcm9ncmVzc0ZpbmlzaGVkTm90aWZpY2F0aW9uKCkKK3sKKyAgICBpZiAo
IWlzTWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEVtcHR5IHBhZ2VzIHdp
bGwgbmV2ZXIgaGF2ZSBjYWxsZWQKKyAgICAvLyBkaXNwYXRjaERpZEZpcnN0VmlzdWFsbHlOb25F
bXB0eUxheW91dCwgc2luY2UgdGhleSdyZSB2aXN1YWxseSBlbXB0eSwgc28KKyAgICAvLyB3ZSBt
YXkgbmVlZCB0byBjYWxsIHJlYWR5VG9SZW5kZXIgbm93LgorICAgIHJlYWR5VG9SZW5kZXIoZmFs
c2UpOworCisgICAgLy8gRklYTUU6IFNlbmQgdXAgYSByZWFsIHN0YXR1cyBjb2RlLgorICAgIG1f
d2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5ub3RpZnlMb2FkRmluaXNoZWQobV9sb2FkRXJyb3Iu
aXNOdWxsKCkgPyAwIDogLTEpOworCisgICAgLy8gTm90aWZ5IHBsdWdpbnMgdGhhdCBhcmUgd2Fp
dGluZyBmb3IgdGhlIHBhZ2UgdG8gZnVsbHkgbG9hZCBiZWZvcmUgc3RhcnRpbmcgdGhhdAorICAg
IC8vIHRoZSBsb2FkIGhhcyBjb21wbGV0ZWQuCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bm90aWZ5
UGFnZU9uTG9hZCgpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlz
cGF0Y2hEaWRDbGVhcldpbmRvd09iamVjdEluV29ybGQoRE9NV3JhcHBlcldvcmxkKiB3b3JsZCkK
K3sKKyAgICBpZiAod29ybGQgIT0gbWFpblRocmVhZE5vcm1hbFdvcmxkKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIC8vIFByb3ZpZGUgdGhlIGV4dGVuc2lvbiBvYmplY3QgZmlyc3QgaW4gY2Fz
ZSB0aGUgY2xpZW50IG9yIG90aGVycyB3YW50IHRvIHVzZSBpdAorICAgIC8vIEZJWE1FOiBDb25k
aXRpb25hbGx5IGF0dGFjaCBleHRlbnNpb24gb2JqZWN0IGJhc2VkIG9uIHNvbWUgZmxhZyBvciB3
aGV0aGVyIG9yIG5vdCB3ZQorICAgIC8vIGFyZSBicm93c2VyIG9yIHNvbWV0aGluZyBlbHNlLgor
ICAgIGF0dGFjaEV4dGVuc2lvbk9iamVjdFRvRnJhbWUobV9mcmFtZSwgbV93ZWJQYWdlUHJpdmF0
ZS0+bV9jbGllbnQpOworCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlmeVdp
bmRvd09iamVjdENsZWFyZWQoKTsKKworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBS
ZW5kZXJUcmVlKSB7CisgICAgICAgIEpTR2xvYmFsQ29udGV4dFJlZiBjb250ZXh0ID0gdG9HbG9i
YWxSZWYobV9mcmFtZS0+c2NyaXB0KCktPmdsb2JhbE9iamVjdChtYWluVGhyZWFkTm9ybWFsV29y
bGQoKSktPmdsb2JhbEV4ZWMoKSk7CisgICAgICAgIEpTT2JqZWN0UmVmIHdpbmRvd09iamVjdCA9
IHRvUmVmKG1fZnJhbWUtPnNjcmlwdCgpLT5nbG9iYWxPYmplY3QobWFpblRocmVhZE5vcm1hbFdv
cmxkKCkpKTsKKyAgICAgICAgQVNTRVJUKHdpbmRvd09iamVjdCk7CisgICAgICAgIG1fd2ViUGFn
ZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUtPmRpZENsZWFyV2luZG93T2JqZWN0SW5Xb3JsZCh3
b3JsZCwgY29udGV4dCwgd2luZG93T2JqZWN0KTsKKyAgICB9Cit9CisKK2Jvb2wgRnJhbWVMb2Fk
ZXJDbGllbnRCbGFja0JlcnJ5OjpzaG91bGRHb1RvSGlzdG9yeUl0ZW0oSGlzdG9yeUl0ZW0qKSBj
b25zdAoreworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEZyYW1lTG9hZGVyQ2xpZW50Qmxh
Y2tCZXJyeTo6c2hvdWxkU3RvcExvYWRpbmdGb3JIaXN0b3J5SXRlbShIaXN0b3J5SXRlbSopIGNv
bnN0Cit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFj
a0JlcnJ5OjppbnZhbGlkYXRlQmFja0ZvcndhcmRMaXN0KCkgY29uc3QKK3sKKyAgICBub3RpZnlC
YWNrRm9yd2FyZExpc3RDaGFuZ2VkKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFj
a0JlcnJ5Ojpub3RpZnlCYWNrRm9yd2FyZExpc3RDaGFuZ2VkKCkgY29uc3QKK3sKKyAgICBCYWNr
Rm9yd2FyZExpc3RJbXBsKiBiYWNrRm9yd2FyZExpc3QgPSBzdGF0aWNfY2FzdDxXZWJDb3JlOjpC
YWNrRm9yd2FyZExpc3RJbXBsKj4obV93ZWJQYWdlUHJpdmF0ZS0+bV9wYWdlLT5iYWNrRm9yd2Fy
ZCgpLT5jbGllbnQoKSk7CisgICAgQVNTRVJUKGJhY2tGb3J3YXJkTGlzdCk7CisKKyAgICB1bnNp
Z25lZCBsaXN0U2l6ZSA9IGJhY2tGb3J3YXJkTGlzdC0+ZW50cmllcygpLnNpemUoKTsKKyAgICB1
bnNpZ25lZCBjdXJyZW50SW5kZXggPSBiYWNrRm9yd2FyZExpc3QtPmJhY2tMaXN0Q291bnQoKTsK
KyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+cmVzZXRCYWNrRm9yd2FyZExpc3QobGlz
dFNpemUsIGN1cnJlbnRJbmRleCk7Cit9CisKK0ZyYW1lKiBGcmFtZUxvYWRlckNsaWVudEJsYWNr
QmVycnk6OmRpc3BhdGNoQ3JlYXRlUGFnZShjb25zdCBOYXZpZ2F0aW9uQWN0aW9uJiBuYXZpZ2F0
aW9uKQoreworICAgIEJsYWNrQmVycnk6OldlYktpdDo6V2ViUGFnZSogd2ViUGFnZSA9IG1fd2Vi
UGFnZVByaXZhdGUtPm1fY2xpZW50LT5jcmVhdGVXaW5kb3coMCwgMCwgLTEsIC0xLCBCbGFja0Jl
cnJ5OjpXZWJLaXQ6OldlYlBhZ2VDbGllbnQ6OkZsYWdXaW5kb3dEZWZhdWx0LCBuYXZpZ2F0aW9u
LnVybCgpLnN0cmluZygpLCBXZWJTdHJpbmcoKSk7CisgICAgaWYgKCF3ZWJQYWdlKQorICAgICAg
ICByZXR1cm4gMDsKKworICAgIHJldHVybiB3ZWJQYWdlLT5kLT5tX3BhZ2UtPm1haW5GcmFtZSgp
OworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGV0YWNoZWRGcm9tUGFy
ZW50MigpCit7CisgICAgQmFja2luZ1N0b3JlQ2xpZW50KiBiYWNraW5nU3RvcmVDbGllbnRGb3JG
cmFtZSA9IG1fd2ViUGFnZVByaXZhdGUtPmJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKG1fZnJh
bWUpOworICAgIGlmIChiYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZSkgeworICAgICAgICBkZWxl
dGUgYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWU7CisgICAgICAgIGJhY2tpbmdTdG9yZUNsaWVu
dEZvckZyYW1lID0gMDsKKyAgICB9CisKKyAgICBpZiAobV9mcmFtZS0+ZG9jdW1lbnQoKSkKKyAg
ICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+Y2xlYXJEb2N1bWVudERhdGEobV9mcmFtZS0+ZG9jdW1l
bnQoKSk7CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2lucHV0SGFuZGxlci0+ZnJhbWVVbmxv
YWRlZChtX2ZyYW1lKTsKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+bm90aWZ5RnJh
bWVEZXRhY2hlZChtX2ZyYW1lKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVy
cnk6OmRpc3BhdGNoV2lsbFNlbmRSZXF1ZXN0KERvY3VtZW50TG9hZGVyKiBkb2NMb2FkZXIsIGxv
bmcgdW5zaWduZWQgaW50LCBSZXNvdXJjZVJlcXVlc3QmIHJlcXVlc3QsIGNvbnN0IFJlc291cmNl
UmVzcG9uc2UmKQoreworICAgIC8vIElmIHRoZSByZXF1ZXN0IGlzIGJlaW5nIGxvYWRlZCBieSB0
aGUgcHJvdmlzaW9uYWwgZG9jdW1lbnQgbG9hZGVyLCB0aGVuCisgICAgLy8gaXQgaXMgYSBuZXcg
dG9wIGxldmVsIHJlcXVlc3Qgd2hpY2ggaGFzIG5vdCBiZWVuIGNvbW1pdGVkLgorICAgIGJvb2wg
aXNNYWluUmVzb3VyY2VMb2FkID0gZG9jTG9hZGVyICYmIGRvY0xvYWRlciA9PSBkb2NMb2FkZXIt
PmZyYW1lTG9hZGVyKCktPnByb3Zpc2lvbmFsRG9jdW1lbnRMb2FkZXIoKTsKKworICAgIC8vIEFu
eSBwcm9jZXNzaW5nIHdoaWNoIGlzIGRvbmUgZm9yIGFsbCBsb2FkcyAoYm90aCBtYWluIGFuZCBz
dWJyZXNvdXJjZSkgc2hvdWxkIGdvIGhlcmUuCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5l
dHdvcmtSZXF1ZXN0IHBsYXRmb3JtUmVxdWVzdDsKKyAgICByZXF1ZXN0LmluaXRpYWxpemVQbGF0
Zm9ybVJlcXVlc3QocGxhdGZvcm1SZXF1ZXN0LCBmYWxzZSAvKmlzSW5pdGlhbCovKTsKKyAgICBt
X3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+cG9wdWxhdGVDdXN0b21IZWFkZXJzKHBsYXRmb3Jt
UmVxdWVzdCk7CisgICAgY29uc3QgQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0
OjpIZWFkZXJMaXN0JiBoZWFkZXJMaXN0cyA9IHBsYXRmb3JtUmVxdWVzdC5nZXRIZWFkZXJMaXN0
UmVmKCk7CisgICAgZm9yIChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6Okhl
YWRlckxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaGVhZGVyTGlzdHMuYmVnaW4oKTsgaXQgIT0g
aGVhZGVyTGlzdHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaGVhZGVyU3Ry
aW5nID0gaXQtPmZpcnN0OworICAgICAgICBzdGQ6OnN0cmluZyBoZWFkZXJWYWx1ZVN0cmluZyA9
IGl0LT5zZWNvbmQ7CisgICAgICAgIHJlcXVlc3Quc2V0SFRUUEhlYWRlckZpZWxkKFdURjo6U3Ry
aW5nKGhlYWRlclN0cmluZy5jX3N0cigpKSwgV1RGOjpTdHJpbmcoaGVhZGVyVmFsdWVTdHJpbmcu
Y19zdHIoKSkpOworICAgIH0KKyAgICBpZiAoY29va2llc0VuYWJsZWQoKSkgeworICAgICAgICBT
dHJpbmcgY29va2llUGFpcnMgPSBjb29raWVNYW5hZ2VyKCkuZ2V0Q29va2llKHJlcXVlc3QudXJs
KCksIFdpdGhIdHRwT25seUNvb2tpZXMpOworICAgICAgICBpZiAoIWNvb2tpZVBhaXJzLmlzRW1w
dHkoKSkgeworICAgICAgICAgICAgLy8gV2Ugb25seSBtb2RpZnkgdGhlIFdlYkNvcmUgcmVxdWVz
dCB0byBtYWtlIHRoZSBjb29raWVzIHZpc2libGUgaW4gaW5zcGVjdG9yLgorICAgICAgICAgICAg
cmVxdWVzdC5zZXRIVFRQSGVhZGVyRmllbGQoV1RGOjpTdHJpbmcoIkNvb2tpZSIpLCBjb29raWVQ
YWlycyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFpc01haW5SZXNvdXJjZUxvYWQpIHsK
KyAgICAgICAgLy8gRG8gbm90aGluZyBmb3Igbm93LgorICAgICAgICAvLyBBbnkgcHJvY2Vzc2lu
ZyB3aGljaCBpcyBkb25lIG9ubHkgZm9yIHN1YnJlc291cmNlcyBzaG91bGQgZ28gaGVyZS4KKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEFsbCBwcm9jZXNzaW5nIGJleW9uZCB0aGlz
IHBvaW50IGlzIGRvbmUgb25seSBmb3IgbWFpbiByZXNvdXJjZSBsb2Fkcy4KKworICAgIGlmICht
X2NsaWVudFJlZGlyZWN0SXNQZW5kaW5nICYmIGlzTWFpbkZyYW1lKCkpIHsKKyAgICAgICAgV1RG
OjpTdHJpbmcgb3JpZ2luYWxVcmwgPSBtX2ZyYW1lLT5kb2N1bWVudCgpLT51cmwoKS5zdHJpbmco
KTsKKyAgICAgICAgV1RGOjpTdHJpbmcgZmluYWxVcmwgPSByZXF1ZXN0LnVybCgpLnN0cmluZygp
OworCisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5ub3RpZnlDbGllbnRSZWRp
cmVjdChvcmlnaW5hbFVybC5jaGFyYWN0ZXJzKCksIG9yaWdpbmFsVXJsLmxlbmd0aCgpLAorICAg
ICAgICAgICAgZmluYWxVcmwuY2hhcmFjdGVycygpLCBmaW5hbFVybC5sZW5ndGgoKSk7CisgICAg
fQorCisgICAgLy8gRklYTUU6IFVwZGF0ZSB0aGUgcmVxdWVzdCB0eXBlLiBTZWUgUFIgIzExOTc5
Mi4KKyAgICBpZiAoZG9jTG9hZGVyLT5mcmFtZUxvYWRlcigpLT5pc0xvYWRpbmdNYWluRnJhbWUo
KSkKKyAgICAgICAgcmVxdWVzdC5zZXRUYXJnZXRUeXBlKFJlc291cmNlUmVxdWVzdDo6VGFyZ2V0
SXNNYWluRnJhbWUpOworICAgIGVsc2UKKyAgICAgICAgcmVxdWVzdC5zZXRUYXJnZXRUeXBlKFJl
c291cmNlUmVxdWVzdDo6VGFyZ2V0SXNTdWJmcmFtZSk7CisKKyAgICBGcmFtZUxvYWRlciogbG9h
ZGVyID0gbV9mcmFtZS0+bG9hZGVyKCk7CisgICAgQVNTRVJUKGxvYWRlcik7CisgICAgaWYgKFdl
YkNvcmU6OmlzQmFja0ZvcndhcmRMb2FkVHlwZShsb2FkZXItPmxvYWRUeXBlKCkpKSB7CisgICAg
ICAgIC8vIERvIG5vdCB1c2UgdGhlIHBhc3NlZCBEb2N1bWVudExvYWRlciBiZWNhdXNlIGl0IGlz
IHRoZSBsb2FkZXIgdGhhdAorICAgICAgICAvLyB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuZXcgcmVx
dWVzdCAodGhlIERFU1RJTkFUSU9OIG9mIHRoZSBoaXN0b3J5CisgICAgICAgIC8vIG5hdmlnYXRp
b24gLSB3ZSB3YW50IHRvIHVzZSB0aGUgY3VycmVudCBEb2N1bWVudExvYWRlciB0byByZWNvcmQg
dGhlCisgICAgICAgIC8vIFNPVVJDRSkuCisgICAgICAgIERvY3VtZW50TG9hZGVyKiBkb2NMb2Fk
ZXIgPSBtX2ZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKTsKKyAgICAgICAgQVNTRVJU
KGRvY0xvYWRlcik7CisgICAgICAgIG1faGlzdG9yeU5hdmlnYXRpb25Tb3VyY2VVUkxzLmFkZChk
b2NMb2FkZXItPnVybCgpKTsKKyAgICAgICAgbV9oaXN0b3J5TmF2aWdhdGlvblNvdXJjZVVSTHMu
YWRkKGRvY0xvYWRlci0+b3JpZ2luYWxVUkwoKSk7CisgICAgfQorfQorCit2b2lkIEZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeTo6bG9hZEljb25FeHRlcm5hbGx5KGNvbnN0IFdURjo6U3RyaW5n
JiBvcmlnaW5hbFBhZ2VVcmwsIGNvbnN0IFdURjo6U3RyaW5nJiBmaW5hbFBhZ2VVcmwsIGNvbnN0
IFdURjo6U3RyaW5nJiBpY29uVXJsKQoreworICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50
LT5zZXRJY29uRm9yVXJsKG9yaWdpbmFsUGFnZVVybC51dGY4KCkuZGF0YSgpLCBmaW5hbFBhZ2VV
cmwudXRmOCgpLmRhdGEoKSwgaWNvblVybC51dGY4KCkuZGF0YSgpKTsKK30KKwordm9pZCBGcmFt
ZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OnNhdmVWaWV3U3RhdGVUb0l0ZW0oSGlzdG9yeUl0ZW0q
IGl0ZW0pCit7CisgICAgaWYgKCFpc01haW5GcmFtZSgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBBU1NFUlQoaXRlbSk7CisgICAgSGlzdG9yeUl0ZW1WaWV3U3RhdGUmIHZpZXdTdGF0ZSA9IGl0
ZW0tPnZpZXdTdGF0ZSgpOworICAgIGlmICh2aWV3U3RhdGUuc2hvdWxkU2F2ZVZpZXdTdGF0ZSkg
eworICAgICAgICB2aWV3U3RhdGUub3JpZW50YXRpb24gPSBtX3dlYlBhZ2VQcml2YXRlLT5tYWlu
RnJhbWUoKS0+b3JpZW50YXRpb24oKTsKKyAgICAgICAgdmlld1N0YXRlLmlzWm9vbVRvRml0U2Nh
bGUgPSBtX3dlYlBhZ2VQcml2YXRlLT5jdXJyZW50U2NhbGUoKSA9PSBtX3dlYlBhZ2VQcml2YXRl
LT56b29tVG9GaXRTY2FsZSgpOworICAgICAgICB2aWV3U3RhdGUuc2NhbGUgPSBtX3dlYlBhZ2VQ
cml2YXRlLT5jdXJyZW50U2NhbGUoKTsKKyAgICAgICAgdmlld1N0YXRlLnNob3VsZFJlZmxvd0Js
b2NrID0gbV93ZWJQYWdlUHJpdmF0ZS0+bV9zaG91bGRSZWZsb3dCbG9jazsKKyAgICB9Cit9CisK
K3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpyZXN0b3JlVmlld1N0YXRlKCkKK3sK
KyAgICBpZiAoIWlzTWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEhpc3RvcnlJ
dGVtKiBjdXJyZW50SXRlbSA9IG1fZnJhbWUtPmxvYWRlcigpLT5oaXN0b3J5KCktPmN1cnJlbnRJ
dGVtKCk7CisgICAgQVNTRVJUKGN1cnJlbnRJdGVtKTsKKworICAgIGlmICghY3VycmVudEl0ZW0p
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlYlBhZ2VQcml2YXRlIGlzIG1lc3NpbmcgdXAg
RnJhbWVWaWV3Ojp3YXNTY3JvbGxlZEJ5VXNlcigpIGJ5IHNlbmRpbmcKKyAgICAvLyBzY3JvbGwg
ZXZlbnRzIHRoYXQgbG9vayBsaWtlIHRoZXkgd2VyZSB1c2VyIGdlbmVyYXRlZCBhbGwgdGhlIHRp
bWUuCisgICAgLy8KKyAgICAvLyBFdmVuIGlmIHRoZSB1c2VyIGRpZCBub3Qgc2Nyb2xsLCBGcmFt
ZVZpZXcgaXMgZ29ubmEgdGhpbmsgdGhleSBkaWQuCisgICAgLy8gU28gd2UgdXNlIG91ciBvd24g
Ym9va2tlZXBpbmcgY29kZSB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2Ugd2VyZQorICAgIC8v
IGFjdHVhbGx5IHNjcm9sbGVkIGJ5IHRoZSB1c2VyIGR1cmluZyBsb2FkLgorICAgIC8vCisgICAg
Ly8gSWYgdGhlIHVzZXIgZGlkIHNjcm9sbCB0aG91Z2gsIGFsbCBhcmUgZ29pbmcgdG8gYmUgaW4g
YWdyZWVtZW50IGFib3V0CisgICAgLy8gdGhhdCwgYW5kIHRoZSB3b3JzdCB0aGluZyB0aGF0IGNv
dWxkIGhhcHBlbiBpcyB0aGF0CisgICAgLy8gSGlzdG9yeUNvbnRyb2xsZXI6OnJlc3RvcmVTY3Jv
bGxQb3NpdGlvbkFuZFZpZXdTdGF0ZSBjYWxscworICAgIC8vIHNldFNjcm9sbFBvc2l0aW9uIHdp
dGggdGhlIHRoZSBzYW1lIHBvaW50LCB3aGljaCBpcyBhIE5PT1AuCisgICAgSW50U2l6ZSBjb250
ZW50c1NpemUgPSBjdXJyZW50SXRlbS0+Y29udGVudHNTaXplKCk7CisgICAgSW50UG9pbnQgc2Ny
b2xsUG9zaXRpb24gPSBjdXJyZW50SXRlbS0+c2Nyb2xsUG9pbnQoKTsKKyAgICBpZiAobV93ZWJQ
YWdlUHJpdmF0ZS0+bV91c2VyUGVyZm9ybWVkTWFudWFsU2Nyb2xsKQorICAgICAgICBzY3JvbGxQ
b3NpdGlvbiA9IG1fd2ViUGFnZVByaXZhdGUtPnNjcm9sbFBvc2l0aW9uKCk7CisKKyAgICAvLyBX
ZSBuZWVkIHRvIHJlc2V0IHRoaXMgdmFyaWFibGUgYWZ0ZXIgdGhlIHZpZXcgc3RhdGUgaGFzIGJl
ZW4gcmVzdG9yZWQuCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9kaWRSZXN0b3JlRnJvbVBhZ2VD
YWNoZSA9IGZhbHNlOworICAgIEhpc3RvcnlJdGVtVmlld1N0YXRlJiB2aWV3U3RhdGUgPSBjdXJy
ZW50SXRlbS0+dmlld1N0YXRlKCk7CisKKyAgICAvLyBBbHNvLCB0cnkgdG8ga2VlcCB0aGUgdXNl
cnMgem9vbSBpZiBhbnkuCisgICAgZG91YmxlIHNjYWxlID0gdmlld1N0YXRlLnNjYWxlOworICAg
IGJvb2wgc2hvdWxkUmVmbG93QmxvY2sgPSB2aWV3U3RhdGUuc2hvdWxkUmVmbG93QmxvY2s7Cisg
ICAgaWYgKG1fd2ViUGFnZVByaXZhdGUtPm1fdXNlclBlcmZvcm1lZE1hbnVhbFpvb20pIHsKKyAg
ICAgICAgc2NhbGUgPSBtX3dlYlBhZ2VQcml2YXRlLT5jdXJyZW50U2NhbGUoKTsKKyAgICAgICAg
c2hvdWxkUmVmbG93QmxvY2sgPSBtX3dlYlBhZ2VQcml2YXRlLT5tX3Nob3VsZFJlZmxvd0Jsb2Nr
OworICAgIH0KKworICAgIGJvb2wgc2Nyb2xsQ2hhbmdlZCA9IHNjcm9sbFBvc2l0aW9uICE9IG1f
d2ViUGFnZVByaXZhdGUtPnNjcm9sbFBvc2l0aW9uKCk7CisgICAgYm9vbCBzY2FsZUNoYW5nZWQg
PSBzY2FsZSAhPSBtX3dlYlBhZ2VQcml2YXRlLT5jdXJyZW50U2NhbGUoKTsKKyAgICBib29sIHJl
Zmxvd0NoYW5nZWQgPSBzaG91bGRSZWZsb3dCbG9jayAhPSBtX3dlYlBhZ2VQcml2YXRlLT5tX3No
b3VsZFJlZmxvd0Jsb2NrOworICAgIGJvb2wgb3JpZW50YXRpb25DaGFuZ2VkID0gdmlld1N0YXRl
Lm9yaWVudGF0aW9uICUgMTgwICE9IG1fd2ViUGFnZVByaXZhdGUtPm1haW5GcmFtZSgpLT5vcmll
bnRhdGlvbigpICUgMTgwOworCisgICAgaWYgKCFzY3JvbGxDaGFuZ2VkICYmICFzY2FsZUNoYW5n
ZWQgJiYgIXJlZmxvd0NoYW5nZWQgJiYgIW9yaWVudGF0aW9uQ2hhbmdlZCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgLy8gV2hlbiByb3RhdGUgaGFwcGVucywgb25seSB6b29tIHdoZW4gcHJldmlv
dXMgcGFnZSB3YXMgem9vbVRvRml0U2NhbGUsIG90aGVyd2lzZSBrZWVwIG9sZCBzY2FsZS4KKyAg
ICBpZiAob3JpZW50YXRpb25DaGFuZ2VkICYmIHZpZXdTdGF0ZS5pc1pvb21Ub0ZpdFNjYWxlKQor
ICAgICAgICBzY2FsZSA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6U2NyZWVuOjp3
aWR0aCgpICogc2NhbGUgLyBzdGF0aWNfY2FzdDxkb3VibGU+KEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpHcmFwaGljczo6U2NyZWVuOjpoZWlnaHQoKSk7CisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9i
YWNraW5nU3RvcmUtPmQtPnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCk7IC8v
IGRvbid0IGZsYXNoIGNoZWNrZXJib2FyZCBmb3IgdGhlIHNldFNjcm9sbFBvc2l0aW9uIGNhbGwK
KyAgICBtX2ZyYW1lLT52aWV3KCktPnNldENvbnRlbnRzU2l6ZUZyb21IaXN0b3J5KGNvbnRlbnRz
U2l6ZSk7CisKKyAgICAvLyBIZXJlIHdlIG5lZWQgdG8gc2V0IHNjcm9sbCBwb3NpdGlvbiB3aGF0
IHdlIGFza2VkIGZvci4KKyAgICAvLyBTbyB3ZSB1c2UgU2Nyb2xsVmlldzo6c2V0Q2FuT3ZlcnNj
cm9sbCh0cnVlKS4KKyAgICBib29sIG9sZENhbk92ZXJzY3JvbGwgPSBtX2ZyYW1lLT52aWV3KCkt
PmNhbk92ZXJTY3JvbGwoKTsKKyAgICBtX2ZyYW1lLT52aWV3KCktPnNldENhbk92ZXJzY3JvbGwo
dHJ1ZSk7CisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+c2V0U2Nyb2xsUG9zaXRpb24oc2Nyb2xsUG9z
aXRpb24pOworICAgIG1fZnJhbWUtPnZpZXcoKS0+c2V0Q2FuT3ZlcnNjcm9sbChvbGRDYW5PdmVy
c2Nyb2xsKTsKKworICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fc2hvdWxkUmVmbG93QmxvY2sgPSB2
aWV3U3RhdGUuc2hvdWxkUmVmbG93QmxvY2s7CisKKyAgICAvLyBXaWxsIHJlc3RvcmUgdXBkYXRl
cyB0byBiYWNraW5nc3RvcmUgZ3VhcmFudGVlZCEKKyAgICBpZiAoIW1fd2ViUGFnZVByaXZhdGUt
Pnpvb21BYm91dFBvaW50KHNjYWxlLCBtX2ZyYW1lLT52aWV3KCktPnNjcm9sbFBvc2l0aW9uKCks
IHRydWUgLyogZW5mb3JjZVNjYWxlQ2xhbXBpbmcgKi8sIHRydWUgLypmb3JjZVJlbmRlcmluZyov
LCB0cnVlIC8qaXNSZXN0b3Jpbmdab29tTGV2ZWwqLykpIHsKKyAgICAgICAgLy8gSWYgd2UncmUg
YWxyZWFkeSBhdCB0aGF0IHNjYWxlLCB0aGVuIHdlIHNob3VsZCBzdGlsbCBmb3JjZSByZW5kZXJp
bmcgc2luY2UKKyAgICAgICAgLy8gb3VyIHNjcm9sbCBwb3NpdGlvbiBjaGFuZ2VkLgorICAgICAg
ICBtX3dlYlBhZ2VQcml2YXRlLT5tX2JhY2tpbmdTdG9yZS0+ZC0+cmVuZGVyVmlzaWJsZUNvbnRl
bnRzKCk7CisKKyAgICAgICAgLy8gV2UgbmVlZCB0byBub3RpZnkgdGhlIGNsaWVudCBvZiB0aGUg
c2Nyb2xsIHBvc2l0aW9uIGFuZCBjb250ZW50IHNpemUgY2hhbmdlKHMpIGFib3ZlIGV2ZW4gaWYg
d2UgZGlkbid0IHNjYWxlLgorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5ub3RpZnlUcmFuc2Zv
cm1lZENvbnRlbnRzU2l6ZUNoYW5nZWQoKTsKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bm90
aWZ5VHJhbnNmb3JtZWRTY3JvbGxDaGFuZ2VkKCk7CisgICAgfQorfQorCitQb2xpY3lBY3Rpb24g
RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkZWNpZGVQb2xpY3lGb3JFeHRlcm5hbExvYWQo
Y29uc3QgUmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0LCBib29sIGlzRnJhZ21lbnRTY3JvbGwpCit7
CisgICAgY29uc3QgS1VSTCYgdXJsID0gcmVxdWVzdC51cmwoKTsKKyAgICBXVEY6OlN0cmluZyBw
YXR0ZXJuID0gbV93ZWJQYWdlUHJpdmF0ZS0+ZmluZFBhdHRlcm5TdHJpbmdGb3JVcmwodXJsKTsK
KyAgICBpZiAoIXBhdHRlcm4uaXNFbXB0eSgpKSB7CisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUt
Pm1fY2xpZW50LT5oYW5kbGVTdHJpbmdQYXR0ZXJuKHBhdHRlcm4uY2hhcmFjdGVycygpLCBwYXR0
ZXJuLmxlbmd0aCgpKTsKKyAgICAgICAgcmV0dXJuIFBvbGljeUlnbm9yZTsKKyAgICB9CisKKyAg
ICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV93ZWJTZXR0aW5ncy0+YXJlTGlua3NIYW5kbGVkRXh0
ZXJuYWxseSgpCisgICAgICAgICAgICAmJiBpc01haW5GcmFtZSgpCisgICAgICAgICAgICAmJiAh
cmVxdWVzdC5tdXN0SGFuZGxlSW50ZXJuYWxseSgpCisgICAgICAgICAgICAmJiAhaXNGcmFnbWVu
dFNjcm9sbCkgeworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Qg
cGxhdGZvcm1SZXF1ZXN0OworICAgICAgICByZXF1ZXN0LmluaXRpYWxpemVQbGF0Zm9ybVJlcXVl
c3QocGxhdGZvcm1SZXF1ZXN0KTsKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQt
PmhhbmRsZUV4dGVybmFsTGluayhwbGF0Zm9ybVJlcXVlc3QsIHJlcXVlc3QuYW5jaG9yVGV4dCgp
LmNoYXJhY3RlcnMoKSwgcmVxdWVzdC5hbmNob3JUZXh0KCkubGVuZ3RoKCksIG1fY2xpZW50UmVk
aXJlY3RJc1BlbmRpbmcpOworICAgICAgICByZXR1cm4gUG9saWN5SWdub3JlOworICAgIH0KKwor
ICAgIHJldHVybiBQb2xpY3lVc2U7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0Jl
cnJ5Ojp3aWxsRGVmZXJMb2FkaW5nKCkKK3sKKyAgICBtX2RlZmVycmVkSm9ic1RpbWVyLT5zdG9w
KCk7CisKKyAgICBpZiAoIWlzTWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1f
d2ViUGFnZVByaXZhdGUtPndpbGxEZWZlckxvYWRpbmcoKTsKK30KKwordm9pZCBGcmFtZUxvYWRl
ckNsaWVudEJsYWNrQmVycnk6OmRpZFJlc3VtZUxvYWRpbmcoKQoreworICAgIGlmICghbV9kZWZl
cnJlZE1hbnVhbFNjcmlwdC5pc051bGwoKSkKKyAgICAgICAgbV9kZWZlcnJlZEpvYnNUaW1lci0+
c3RhcnRPbmVTaG90KDApOworCisgICAgaWYgKCFpc01haW5GcmFtZSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5kaWRSZXN1bWVMb2FkaW5nKCk7Cit9CisKK3Zv
aWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpzZXREZWZlcnJlZE1hbnVhbFNjcmlwdChj
b25zdCBLVVJMJiBzY3JpcHQpCit7CisgICAgQVNTRVJUKCFtX2RlZmVycmVkSm9ic1RpbWVyLT5p
c0FjdGl2ZSgpKTsKKyAgICBtX2RlZmVycmVkTWFudWFsU2NyaXB0ID0gc2NyaXB0OworfQorCit2
b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGVmZXJyZWRKb2JzVGltZXJGaXJlZChU
aW1lcjxGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk+KikKK3sKKyAgICBBU1NFUlQoIW1fZnJh
bWUtPnBhZ2UoKS0+ZGVmZXJzTG9hZGluZygpKTsKKworICAgIGlmICghbV9kZWZlcnJlZE1hbnVh
bFNjcmlwdC5pc051bGwoKSkgeworICAgICAgICAvLyBFeGVjdXRpbmcgdGhlIHNjcmlwdCB3aWxs
IHNldCBkZWZlcnJlZCBsb2FkaW5nLCB3aGljaCBjb3VsZCB0cmlnZ2VyIHRoaXMgdGltZXIgYWdh
aW4gaWYgYSBzY3JpcHQgaXMgc2V0LiBTbyBjbGVhciB0aGUgc2NyaXB0IGZpcnN0LgorICAgICAg
ICBLVVJMIHNjcmlwdCA9IG1fZGVmZXJyZWRNYW51YWxTY3JpcHQ7CisgICAgICAgIG1fZGVmZXJy
ZWRNYW51YWxTY3JpcHQgPSBLVVJMKCk7CisKKyAgICAgICAgbV9mcmFtZS0+c2NyaXB0KCktPmV4
ZWN1dGVJZkphdmFTY3JpcHRVUkwoc2NyaXB0KTsKKyAgICB9CisKKyAgICBBU1NFUlQoIW1fZnJh
bWUtPnBhZ2UoKS0+ZGVmZXJzTG9hZGluZygpKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVu
dEJsYWNrQmVycnk6OnJlYWR5VG9SZW5kZXIoYm9vbCBwYWdlSXNWaXN1YWxseU5vbkVtcHR5KQor
eworICAgIC8vIE9ubHkgc2VuZCB0aGUgbm90aWZpY2F0aW9uIG9uY2UuCisgICAgaWYgKCFtX3Nl
bnRSZWFkeVRvUmVuZGVyKSB7CisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5u
b3RpZnlMb2FkUmVhZHlUb1JlbmRlcihwYWdlSXNWaXN1YWxseU5vbkVtcHR5KTsKKyAgICAgICAg
bV9zZW50UmVhZHlUb1JlbmRlciA9IHRydWU7CisgICAgfQorfQorCitQYXNzUmVmUHRyPEZyYW1l
TmV0d29ya2luZ0NvbnRleHQ+IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y3JlYXRlTmV0
d29ya2luZ0NvbnRleHQoKQoreworICAgIHJldHVybiBGcmFtZU5ldHdvcmtpbmdDb250ZXh0Qmxh
Y2tCZXJyeTo6Y3JlYXRlKG1fZnJhbWUpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50Qmxh
Y2tCZXJyeTo6YXV0aGVudGljYXRpb25DaGFsbGVuZ2UoY29uc3QgU3RyaW5nJiByZWFsbSwgU3Ry
aW5nJiB1c2VybmFtZSwgU3RyaW5nJiBwYXNzd29yZCkKK3sKKyAgICBXZWJTdHJpbmcgd2ViUGFn
ZVVzZXJuYW1lOworICAgIFdlYlN0cmluZyB3ZWJQYWdlUGFzc3dvcmQ7CisKKyAgICBtX3dlYlBh
Z2VQcml2YXRlLT5tX2NsaWVudC0+YXV0aGVudGljYXRpb25DaGFsbGVuZ2UocmVhbG0uY2hhcmFj
dGVycygpLCByZWFsbS5sZW5ndGgoKSwgd2ViUGFnZVVzZXJuYW1lLCB3ZWJQYWdlUGFzc3dvcmQp
OworCisgICAgdXNlcm5hbWUgPSB3ZWJQYWdlVXNlcm5hbWU7CisgICAgcGFzc3dvcmQgPSB3ZWJQ
YWdlUGFzc3dvcmQ7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpzdGFy
dERvd25sb2FkKGNvbnN0IFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCwgY29uc3QgU3RyaW5nJiAv
KnN1Z2dlc3RlZE5hbWUqLykKK3sKKyAgICAvLyBGSVhNRTogdXNlIHRoZSBzdWdnZXN0ZWROYW1l
PworICAgIG1fd2ViUGFnZVByaXZhdGUtPmxvYWQocmVxdWVzdC51cmwoKS5zdHJpbmcoKS51dGY4
KCkuZGF0YSgpLCAwLCAiR0VUIiwgQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0
OjpVc2VQcm90b2NvbENhY2hlUG9saWN5LCAwLCAwLCAwLCAwLCBmYWxzZSwgZmFsc2UsIHRydWUs
ICIiKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRvd25sb2FkKFJl
c291cmNlSGFuZGxlKiBoYW5kbGUsIGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIGNvbnN0IFJlc291
cmNlUmVxdWVzdCYsIGNvbnN0IFJlc291cmNlUmVzcG9uc2UmIHIpCit7CisgICAgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkZpbHRlclN0cmVhbSogc3RyZWFtID0gTmV0d29ya01hbmFnZXI6Omluc3Rh
bmNlKCktPnN0cmVhbUZvckhhbmRsZShoYW5kbGUpOworICAgIEFTU0VSVChzdHJlYW0pOworCisg
ICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPmRvd25sb2FkUmVxdWVzdGVkKHN0cmVhbSwg
ci5zdWdnZXN0ZWRGaWxlbmFtZSgpKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNr
QmVycnk6OmRpc3BhdGNoRGlkUmVjZWl2ZUljb24oKQoreworICAgIFdURjo6U3RyaW5nIHVybCA9
IG1fZnJhbWUtPmRvY3VtZW50KCktPnVybCgpLnN0cmluZygpOworICAgIEltYWdlKiBpbWcgPSBX
ZWJDb3JlOjppY29uRGF0YWJhc2UoKS5zeW5jaHJvbm91c0ljb25Gb3JQYWdlVVJMKHVybCwgSW50
U2l6ZSgxMCwgMTApKTsKKyAgICBXVEY6OlN0cmluZyBpY29uVXJsID0gV2ViQ29yZTo6aWNvbkRh
dGFiYXNlKCkuc3luY2hyb25vdXNJY29uVVJMRm9yUGFnZVVSTCh1cmwpOworICAgIGlmIChpbWcg
JiYgaW1nLT5kYXRhKCkpIHsKKyAgICAgICAgTmF0aXZlSW1hZ2VTa2lhKiBiaXRtYXA9IGltZy0+
bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKKyAgICAgICAgaWYgKCFiaXRtYXApCisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIGJpdG1hcC0+bG9ja1BpeGVscygpOworICAgICAgICBt
X3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+c2V0RmF2aWNvbihpbWctPndpZHRoKCksIGltZy0+
aGVpZ2h0KCksICh1bnNpZ25lZCBjaGFyKiliaXRtYXAtPmdldFBpeGVscygpLCBpY29uVXJsLnV0
ZjgoKS5kYXRhKCkpOworICAgICAgICBiaXRtYXAtPnVubG9ja1BpeGVscygpOworICAgIH0KK30K
KworYm9vbCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmNhbkNhY2hlUGFnZSgpIGNvbnN0
Cit7CisgICAgLy8gV2Ugd29uJ3QgY2FjaGUgcGFnZXMgY29udGFpbmluZyB2aWRlbyBvciBhdWRp
by4KKyAgICBBU1NFUlQobV9mcmFtZS0+ZG9jdW1lbnQoKSk7CisgICAgUmVmUHRyPE5vZGVMaXN0
PiBub2RlTGlzdCA9IG1fZnJhbWUtPmRvY3VtZW50KCktPmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2
aWRlbyIpOworICAgIGlmIChub2RlTGlzdC5nZXQoKS0+bGVuZ3RoKCkgPiAwKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgbm9kZUxpc3QgPSBtX2ZyYW1lLT5kb2N1bWVudCgpLT5nZXRFbGVt
ZW50c0J5VGFnTmFtZSgiYXVkaW8iKTsKKyAgICBpZiAobm9kZUxpc3QuZ2V0KCktPmxlbmd0aCgp
ID4gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVGhlIG11bHRpcGFydCBvZiAi
bXVsdGlwYXJ0L3gtbWl4ZWQtcmVwbGFjZSIgb25seSBzdXBwb3J0cyBpbWFnZSwgY29ycmVjdD8K
KyAgICAvLyB3ZSBtYXkgaGF2ZSBhIGJldHRlciBwbGFjZSB0byBoYW5kbGUgdGhpcyBjYXNlPwor
ICAgIG5vZGVMaXN0ID0gbV9mcmFtZS0+ZG9jdW1lbnQoKS0+Z2V0RWxlbWVudHNCeVRhZ05hbWUo
ImltZyIpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBub2RlTGlzdC5nZXQoKS0+bGVu
Z3RoKCk7ICsraSkgeworICAgICAgICBIVE1MSW1hZ2VFbGVtZW50KiBub2RlID0gc3RhdGljX2Nh
c3Q8SFRNTEltYWdlRWxlbWVudCo+KG5vZGVMaXN0LmdldCgpLT5pdGVtKGkpKTsKKyAgICAgICAg
Q2FjaGVkSW1hZ2UqIGNhY2hlZGltYWdlID0gbm9kZSA/IG5vZGUtPmNhY2hlZEltYWdlKCkgOiAw
OworICAgICAgICBpZiAoY2FjaGVkaW1hZ2UgJiYgY2FjaGVkaW1hZ2UtPnJlc3BvbnNlKCkuaXNN
dWx0aXBhcnRQYXlsb2FkKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAg
IHJldHVybiB0cnVlOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6cHJv
dmlzaW9uYWxMb2FkU3RhcnRlZCgpCit7CisgICAgLy8gV2Ugd291bGQgbGlrZSB0byBoaWRlIHRo
ZSB2aXJ0dWFsIGtleWJvYXJkIGJlZm9yZSBpdCBuYXZpZ2F0ZXMgdG8gYW5vdGhlciBwYWdlCisg
ICAgLy8gc28gdGhhdCB0aGUgc2Nyb2xsIG9mZnNldCB3aXRob3V0IGtleWJvYXJkIHNob3duIHdp
bGwgYmUgc2F2ZWQgaW4gdGhlIGhpc3RvcnkgaXRlbS4KKyAgICAvLyBhbmQgdGhlbiB3aGVuIHRo
ZSB1c2VyIG5hdmlnYXRlcyBiYWNrLCBpdCB3aWxsIHNjcm9sbCB0byB0aGUgcmlnaHQgcG9zaXRp
b24uCisgICAgaWYgKGlzTWFpbkZyYW1lKCkpCisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPnNo
b3dWaXJ0dWFsS2V5Ym9hcmQoZmFsc2UpOworfQorCisvLyBXZSBkb24ndCBuZWVkIHRvIHByb3Zp
ZGUgdGhlIGVycm9yIG1lc3NhZ2Ugc3RyaW5nLCB0aGF0IHdpbGwgYmUgaGFuZGxlZCBpbiBCcm93
c2VyRXJyb3JQYWdlIGFjY29yZGluZyB0byB0aGUgZXJyb3IgY29kZS4KK1Jlc291cmNlRXJyb3Ig
RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpjYW5ub3RTaG93VVJMRXJyb3IoY29uc3QgUmVz
b3VyY2VSZXF1ZXN0JiByZXF1ZXN0KQoreworICAgIC8vIEZJWE1FOiBXaHkgYXJlIHdlIG5vdCBw
YXNzaW5nIHRoZSBkb21haW4gdG8gdGhlIFJlc291cmNlRXJyb3I/IFNlZSBQUiAjMTE5Nzg5Lgor
ICAgIHJldHVybiBSZXNvdXJjZUVycm9yKFN0cmluZygpLCBXZWJLaXRFcnJvckNhbm5vdFNob3dV
UkwsIHJlcXVlc3QudXJsKCkuc3RyaW5nKCksIFN0cmluZygpKTsKK30KKwordm9pZCBGcmFtZUxv
YWRlckNsaWVudEJsYWNrQmVycnk6OmRpZFJlc3RvcmVGcm9tUGFnZUNhY2hlKCkKK3sKKyAgICBt
X3dlYlBhZ2VQcml2YXRlLT5tX2RpZFJlc3RvcmVGcm9tUGFnZUNhY2hlID0gdHJ1ZTsKK30KKwor
dm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoV2lsbFVwZGF0ZUFwcGxp
Y2F0aW9uQ2FjaGUoY29uc3QgUmVzb3VyY2VSZXF1ZXN0JikKK3sKKyAgICBBU1NFUlQoaXNNYWlu
RnJhbWUoKSk7CisgICAgaWYgKCFpc01haW5GcmFtZSgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+bm90aWZ5V2lsbFVwZGF0ZUFwcGxpY2F0aW9u
Q2FjaGUoKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNo
RGlkTG9hZEZyb21BcHBsaWNhdGlvbkNhY2hlKGNvbnN0IFJlc291cmNlUmVxdWVzdCYpCit7Cisg
ICAgQVNTRVJUKGlzTWFpbkZyYW1lKCkpOworICAgIGlmICghaXNNYWluRnJhbWUoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlmeURpZExv
YWRGcm9tQXBwbGljYXRpb25DYWNoZSgpOworfQorCit9IC8vIFdlYkNvcmUKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRlckNsaWVu
dEJsYWNrQmVycnkuaCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJDb3JlU3VwcG9ydC9G
cmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5jZWE5ODkyZDExYTFiODgw
YzM2MTllMjFiMTZiNDBmOWM3ZTAyYWMxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktp
dC9ibGFja2JlcnJ5L1dlYkNvcmVTdXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeS5o
CkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDEx
LCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAy
MTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5
X2gKKyNkZWZpbmUgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5X2gKKworI2luY2x1ZGUgIkRv
Y3VtZW50TG9hZGVyLmgiCisjaW5jbHVkZSAiRm9ybVN0YXRlLmgiCisjaW5jbHVkZSAiRnJhbWUu
aCIKKyNpbmNsdWRlICJGcmFtZUxvYWRlckNsaWVudC5oIgorI2luY2x1ZGUgIkhUTUxGb3JtRWxl
bWVudC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiV2lkZ2V0Lmgi
CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworY2xhc3MgV2Vi
UGFnZVByaXZhdGU7CitjbGFzcyBXZWJQbHVnaW5DbGllbnQ7Cit9Cit9CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworY2xhc3MgRnJhbWVOZXR3b3JraW5nQ29udGV4dDsKK2NsYXNzIEdlb2xvY2F0
aW9uOworCitjbGFzcyBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkgOiBwdWJsaWMgRnJhbWVM
b2FkZXJDbGllbnQgeworcHVibGljOgorICAgIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeSgp
OworICAgIH5GcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkoKTsKKworICAgIHZvaWQgc2V0RnJh
bWUoRnJhbWUqIGZyYW1lLCBCbGFja0JlcnJ5OjpXZWJLaXQ6OldlYlBhZ2VQcml2YXRlKiB3ZWJQ
YWdlUHJpdmF0ZSkgeyBtX2ZyYW1lID0gZnJhbWU7IG1fd2ViUGFnZVByaXZhdGUgPSB3ZWJQYWdl
UHJpdmF0ZTsgfQorCisgICAgaW50IHBsYXllcklkKCkgY29uc3Q7CisgICAgYm9vbCBjb29raWVz
RW5hYmxlZCgpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIGZyYW1lTG9hZGVyRGVzdHJveWVk
KCk7CisgICAgdmlydHVhbCBib29sIGhhc1dlYlZpZXcoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9
CisgICAgdmlydHVhbCB2b2lkIG1ha2VSZXByZXNlbnRhdGlvbihEb2N1bWVudExvYWRlciopIHsg
bm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBmb3JjZUxheW91dCgpIHsgbm90
SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBmb3JjZUxheW91dEZvck5vbkhUTUwo
KSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29waWVzT25TY3Jv
bGwoKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoZWRGcm9t
UGFyZW50MigpOworICAgIHZpcnR1YWwgdm9pZCBkZXRhY2hlZEZyb21QYXJlbnQzKCkgeyBub3RJ
bXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGFzc2lnbklkZW50aWZpZXJUb0luaXRp
YWxSZXF1ZXN0KGxvbmcgdW5zaWduZWQgaW50LCBEb2N1bWVudExvYWRlciosIGNvbnN0IFJlc291
cmNlUmVxdWVzdCYpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBkaXNw
YXRjaFdpbGxTZW5kUmVxdWVzdChEb2N1bWVudExvYWRlciosIGxvbmcgdW5zaWduZWQgaW50LCBS
ZXNvdXJjZVJlcXVlc3QmLCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJik7CisgICAgdmlydHVhbCBi
b29sIHNob3VsZFVzZUNyZWRlbnRpYWxTdG9yYWdlKERvY3VtZW50TG9hZGVyKiwgbG9uZyB1bnNp
Z25lZCBpbnQpIHsgbm90SW1wbGVtZW50ZWQoKTsgcmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVh
bCB2b2lkIGRpc3BhdGNoRGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKERvY3VtZW50
TG9hZGVyKiwgbG9uZyB1bnNpZ25lZCBpbnQsIGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdl
JikgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkQ2Fu
Y2VsQXV0aGVudGljYXRpb25DaGFsbGVuZ2UoRG9jdW1lbnRMb2FkZXIqLCBsb25nIHVuc2lnbmVk
IGludCwgY29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmKSB7IG5vdEltcGxlbWVudGVkKCk7
IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRSZWNlaXZlUmVzcG9uc2UoRG9jdW1lbnRM
b2FkZXIqLCBsb25nIHVuc2lnbmVkIGludCwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYpOworICAg
IHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZFJlY2VpdmVDb250ZW50TGVuZ3RoKERvY3VtZW50TG9h
ZGVyKiwgbG9uZyB1bnNpZ25lZCBpbnQsIGludCkgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAg
dmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkRmluaXNoTG9hZGluZyhEb2N1bWVudExvYWRlciosIGxv
bmcgdW5zaWduZWQgaW50KSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQg
ZGlzcGF0Y2hEaWRGYWlsTG9hZGluZyhEb2N1bWVudExvYWRlciosIGxvbmcgdW5zaWduZWQgaW50
LCBjb25zdCBSZXNvdXJjZUVycm9yJikgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVh
bCBib29sIGRpc3BhdGNoRGlkTG9hZFJlc291cmNlRnJvbU1lbW9yeUNhY2hlKERvY3VtZW50TG9h
ZGVyKiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYsIGlu
dCkgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIHZvaWQg
ZGlzcGF0Y2hEaWRIYW5kbGVPbmxvYWRFdmVudHMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0
Y2hEaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbExvYWQoKSB7IG5vdEltcGxl
bWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRDYW5jZWxDbGllbnRSZWRp
cmVjdCgpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaFdpbGxQZXJmb3JtQ2xpZW50UmVkaXJl
Y3QoY29uc3QgS1VSTCYsIGRvdWJsZSwgZG91YmxlKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0
Y2hEaWRDaGFuZ2VMb2NhdGlvbldpdGhpblBhZ2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0
Y2hEaWRQdXNoU3RhdGVXaXRoaW5QYWdlKCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlk
UmVwbGFjZVN0YXRlV2l0aGluUGFnZSgpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZFBv
cFN0YXRlV2l0aGluUGFnZSgpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaFdpbGxDbG9zZSgp
OworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZFJlY2VpdmVJY29uKCk7CisgICAgdmlydHVh
bCB2b2lkIGRpc3BhdGNoRGlkU3RhcnRQcm92aXNpb25hbExvYWQoKTsKKyAgICB2aXJ0dWFsIHZv
aWQgZGlzcGF0Y2hEaWRSZWNlaXZlVGl0bGUoY29uc3QgU3RyaW5nV2l0aERpcmVjdGlvbiYpOwor
ICAgIHZpcnR1YWwgdm9pZCBzZXRUaXRsZShjb25zdCBTdHJpbmdXaXRoRGlyZWN0aW9uJiB0aXRs
ZSwgY29uc3QgS1VSTCYpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZENvbW1pdExvYWQo
KTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRGYWlsUHJvdmlzaW9uYWxMb2FkKGNvbnN0
IFJlc291cmNlRXJyb3ImKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRGYWlsTG9hZChj
b25zdCBSZXNvdXJjZUVycm9yJik7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkRmluaXNo
RG9jdW1lbnRMb2FkKCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkRmluaXNoTG9hZCgp
OworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZEZpcnN0TGF5b3V0KCkgeyBub3RJbXBsZW1l
bnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkRmlyc3RWaXN1YWxseU5vbkVt
cHR5TGF5b3V0KCk7CisgICAgdmlydHVhbCBGcmFtZSogZGlzcGF0Y2hDcmVhdGVQYWdlKGNvbnN0
IE5hdmlnYXRpb25BY3Rpb24mKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hTaG93KCkgeyBu
b3RJbXBsZW1lbnRlZCgpOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEZWNpZGVQb2xp
Y3lGb3JSZXNwb25zZShGcmFtZVBvbGljeUZ1bmN0aW9uLCBjb25zdCBXZWJDb3JlOjpSZXNvdXJj
ZVJlc3BvbnNlJiwgY29uc3QgV2ViQ29yZTo6UmVzb3VyY2VSZXF1ZXN0Jik7CisgICAgdmlydHVh
bCB2b2lkIGRpc3BhdGNoRGVjaWRlUG9saWN5Rm9yTmV3V2luZG93QWN0aW9uKEZyYW1lUG9saWN5
RnVuY3Rpb24sIGNvbnN0IE5hdmlnYXRpb25BY3Rpb24mLCBjb25zdCBSZXNvdXJjZVJlcXVlc3Qm
LCBQYXNzUmVmUHRyPEZvcm1TdGF0ZT4sIGNvbnN0IFN0cmluZyYgZnJhbWVOYW1lKTsKKyAgICB2
aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEZWNpZGVQb2xpY3lGb3JOYXZpZ2F0aW9uQWN0aW9uKEZyYW1l
UG9saWN5RnVuY3Rpb24sIGNvbnN0IE5hdmlnYXRpb25BY3Rpb24mLCBjb25zdCBSZXNvdXJjZVJl
cXVlc3QmLCBQYXNzUmVmUHRyPEZvcm1TdGF0ZT4pOworICAgIHZpcnR1YWwgdm9pZCBjYW5jZWxQ
b2xpY3lDaGVjaygpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaFVuYWJsZVRvSW1wbGVtZW50
UG9saWN5KGNvbnN0IFJlc291cmNlRXJyb3ImKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2
aXJ0dWFsIHZvaWQgZGlzcGF0Y2hXaWxsU3VibWl0Rm9ybShGcmFtZVBvbGljeUZ1bmN0aW9uLCBQ
YXNzUmVmUHRyPEZvcm1TdGF0ZT4pOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZExvYWRN
YWluUmVzb3VyY2UoRG9jdW1lbnRMb2FkZXIqKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2
aXJ0dWFsIHZvaWQgcmV2ZXJ0VG9Qcm92aXNpb25hbFN0YXRlKERvY3VtZW50TG9hZGVyKikgeyBu
b3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIHNldE1haW5Eb2N1bWVudEVycm9y
KERvY3VtZW50TG9hZGVyKiwgY29uc3QgUmVzb3VyY2VFcnJvciYpOworICAgIHZpcnR1YWwgdm9p
ZCBwb3N0UHJvZ3Jlc3NTdGFydGVkTm90aWZpY2F0aW9uKCk7CisgICAgdmlydHVhbCB2b2lkIHBv
c3RQcm9ncmVzc0VzdGltYXRlQ2hhbmdlZE5vdGlmaWNhdGlvbigpOworICAgIHZpcnR1YWwgdm9p
ZCBwb3N0UHJvZ3Jlc3NGaW5pc2hlZE5vdGlmaWNhdGlvbigpOworICAgIHZpcnR1YWwgdm9pZCBz
ZXRNYWluRnJhbWVEb2N1bWVudFJlYWR5KGJvb2wpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAg
IHZpcnR1YWwgdm9pZCBzdGFydERvd25sb2FkKGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIGNvbnN0
IFN0cmluZyYgc3VnZ2VzdGVkTmFtZSA9IFN0cmluZygpKTsKKyAgICB2aXJ0dWFsIHZvaWQgd2ls
bENoYW5nZVRpdGxlKERvY3VtZW50TG9hZGVyKikgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAg
dmlydHVhbCB2b2lkIGRpZENoYW5nZVRpdGxlKERvY3VtZW50TG9hZGVyKikgeyBub3RJbXBsZW1l
bnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdHRlZExvYWQoRG9jdW1lbnRMb2FkZXIq
LCBjb25zdCBjaGFyKiwgaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgZmluaXNoZWRMb2FkaW5nKERv
Y3VtZW50TG9hZGVyKik7CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZUdsb2JhbEhpc3RvcnkoKSB7
IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlR2xvYmFsSGlzdG9y
eVJlZGlyZWN0TGlua3MoKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIGJvb2wg
c2hvdWxkR29Ub0hpc3RvcnlJdGVtKEhpc3RvcnlJdGVtKikgY29uc3Q7CisgICAgdmlydHVhbCBi
b29sIHNob3VsZFN0b3BMb2FkaW5nRm9ySGlzdG9yeUl0ZW0oSGlzdG9yeUl0ZW0qKSBjb25zdDsK
KyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRBZGRCYWNrRm9yd2FyZEl0ZW0oSGlzdG9yeUl0
ZW0qKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRSZW1vdmVCYWNrRm9yd2Fy
ZEl0ZW0oSGlzdG9yeUl0ZW0qKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRD
aGFuZ2VCYWNrRm9yd2FyZEluZGV4KCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNo
V2lsbFVwZGF0ZUFwcGxpY2F0aW9uQ2FjaGUoY29uc3QgUmVzb3VyY2VSZXF1ZXN0Jik7CisgICAg
dmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkTG9hZEZyb21BcHBsaWNhdGlvbkNhY2hlKGNvbnN0IFJl
c291cmNlUmVxdWVzdCYpOworICAgIHZpcnR1YWwgdm9pZCBkaWREaXNwbGF5SW5zZWN1cmVDb250
ZW50KCkgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGRpZFJ1bkluc2Vj
dXJlQ29udGVudChTZWN1cml0eU9yaWdpbiosIGNvbnN0IEtVUkwmKSB7IG5vdEltcGxlbWVudGVk
KCk7IH0KKyAgICB2aXJ0dWFsIFJlc291cmNlRXJyb3IgaW50ZXJydXB0ZWRGb3JQb2xpY3lDaGFu
Z2VFcnJvcihjb25zdCBSZXNvdXJjZVJlcXVlc3QmKSB7IG5vdEltcGxlbWVudGVkKCk7IHJldHVy
biBSZXNvdXJjZUVycm9yKCIiLCAwLCAiIiwgIiIpOyB9CisgICAgdmlydHVhbCBSZXNvdXJjZUVy
cm9yIGNhbmNlbGxlZEVycm9yKGNvbnN0IFJlc291cmNlUmVxdWVzdCYpIHsgbm90SW1wbGVtZW50
ZWQoKTsgcmV0dXJuIFJlc291cmNlRXJyb3IoIiIsIDAsICIiLCAiIik7IH0KKyAgICB2aXJ0dWFs
IFJlc291cmNlRXJyb3IgYmxvY2tlZEVycm9yKGNvbnN0IFJlc291cmNlUmVxdWVzdCYpIHsgbm90
SW1wbGVtZW50ZWQoKTsgcmV0dXJuIFJlc291cmNlRXJyb3IoIiIsIDAsICIiLCAiIik7IH0KKyAg
ICB2aXJ0dWFsIFJlc291cmNlRXJyb3IgY2Fubm90U2hvd1VSTEVycm9yKGNvbnN0IFJlc291cmNl
UmVxdWVzdCYpOworICAgIHZpcnR1YWwgUmVzb3VyY2VFcnJvciBpbnRlcnJ1cHRGb3JQb2xpY3lD
aGFuZ2VFcnJvcihjb25zdCBSZXNvdXJjZVJlcXVlc3QmKSB7IG5vdEltcGxlbWVudGVkKCk7IHJl
dHVybiBSZXNvdXJjZUVycm9yKCIiLCAwLCAiIiwgIiIpOyB9CisgICAgdmlydHVhbCBSZXNvdXJj
ZUVycm9yIGNhbm5vdFNob3dNSU1FVHlwZUVycm9yKGNvbnN0IFJlc291cmNlUmVzcG9uc2UmKSB7
IG5vdEltcGxlbWVudGVkKCk7IHJldHVybiBSZXNvdXJjZUVycm9yKCIiLCAwLCAiIiwgIiIpOyB9
CisgICAgdmlydHVhbCBSZXNvdXJjZUVycm9yIGZpbGVEb2VzTm90RXhpc3RFcnJvcihjb25zdCBS
ZXNvdXJjZVJlc3BvbnNlJikgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gUmVzb3VyY2VFcnJv
cigiIiwgMCwgIiIsICIiKTsgfQorICAgIHZpcnR1YWwgUmVzb3VyY2VFcnJvciBwbHVnaW5XaWxs
SGFuZGxlTG9hZEVycm9yKGNvbnN0IFJlc291cmNlUmVzcG9uc2UmKSB7IG5vdEltcGxlbWVudGVk
KCk7IHJldHVybiBSZXNvdXJjZUVycm9yKCIiLCAwLCAiIiwgIiIpOyB9CisgICAgdmlydHVhbCBi
b29sIHNob3VsZEZhbGxCYWNrKGNvbnN0IFJlc291cmNlRXJyb3ImKSB7IG5vdEltcGxlbWVudGVk
KCk7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBjYW5IYW5kbGVSZXF1ZXN0KGNv
bnN0IFJlc291cmNlUmVxdWVzdCYpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBjYW5TaG93TUlN
RVR5cGUoY29uc3QgU3RyaW5nJikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGNhblNob3dNSU1F
VHlwZUFzSFRNTChjb25zdCBTdHJpbmcmKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcmVwcmVz
ZW50YXRpb25FeGlzdHNGb3JVUkxTY2hlbWUoY29uc3QgU3RyaW5nJikgY29uc3QgeyBub3RJbXBs
ZW1lbnRlZCgpOyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIFN0cmluZyBnZW5lcmF0ZWRN
SU1FVHlwZUZvclVSTFNjaGVtZShjb25zdCBTdHJpbmcmKSBjb25zdCB7IG5vdEltcGxlbWVudGVk
KCk7IHJldHVybiBTdHJpbmcoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBmcmFtZUxvYWRDb21wbGV0
ZWQoKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2F2ZVZpZXdTdGF0
ZVRvSXRlbShIaXN0b3J5SXRlbSopOworICAgIHZpcnR1YWwgdm9pZCByZXN0b3JlVmlld1N0YXRl
KCk7CisgICAgdmlydHVhbCB2b2lkIHByb3Zpc2lvbmFsTG9hZFN0YXJ0ZWQoKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZGlkRmluaXNoTG9hZCgpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1
YWwgdm9pZCBwcmVwYXJlRm9yRGF0YVNvdXJjZVJlcGxhY2VtZW50KCkgeyBub3RJbXBsZW1lbnRl
ZCgpOyB9CisgICAgdmlydHVhbCBXVEY6OlBhc3NSZWZQdHI8RG9jdW1lbnRMb2FkZXI+IGNyZWF0
ZURvY3VtZW50TG9hZGVyKGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIGNvbnN0IFN1YnN0aXR1dGVE
YXRhJik7CisgICAgdmlydHVhbCB2b2lkIHNldFRpdGxlKGNvbnN0IFN0cmluZyYsIGNvbnN0IEtV
UkwmKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIFN0cmluZyB1c2VyQWdlbnQo
Y29uc3QgS1VSTCYpOworICAgIHZpcnR1YWwgdm9pZCBzYXZlUGxhdGZvcm1EYXRhVG9DYWNoZWRG
cmFtZShDYWNoZWRGcmFtZSopIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9p
ZCB0cmFuc2l0aW9uVG9Db21taXR0ZWRGcm9tQ2FjaGVkRnJhbWUoQ2FjaGVkRnJhbWUqKSB7IG5v
dEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgdHJhbnNpdGlvblRvQ29tbWl0dGVk
Rm9yTmV3UGFnZSgpOworICAgIHZpcnR1YWwgYm9vbCBjYW5DYWNoZVBhZ2UoKSBjb25zdDsKKyAg
ICB2aXJ0dWFsIHZvaWQgZGlkU2F2ZVRvUGFnZUNhY2hlKCkgeyB9CisgICAgdmlydHVhbCB2b2lk
IGRpZFJlc3RvcmVGcm9tUGFnZUNhY2hlKCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlk
QmVjb21lRnJhbWVzZXQoYm9vbCkgeyB9CisgICAgdmlydHVhbCB2b2lkIGRvd25sb2FkKFJlc291
cmNlSGFuZGxlKiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0
JiwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYpOworICAgIHZpcnR1YWwgV1RGOjpQYXNzUmVmUHRy
PEZyYW1lPiBjcmVhdGVGcmFtZShjb25zdCBLVVJMJiwgY29uc3QgU3RyaW5nJiwgSFRNTEZyYW1l
T3duZXJFbGVtZW50KiwgY29uc3QgU3RyaW5nJiwgYm9vbCwgaW50LCBpbnQpOworICAgIHZpcnR1
YWwgdm9pZCBkaWRUcmFuc2ZlckNoaWxkRnJhbWVUb05ld0RvY3VtZW50KFdlYkNvcmU6OlBhZ2Uq
KTsKKyAgICB2aXJ0dWFsIFdURjo6UGFzc1JlZlB0cjxXaWRnZXQ+IGNyZWF0ZVBsdWdpbihjb25z
dCBJbnRTaXplJiwgSFRNTFBsdWdJbkVsZW1lbnQqLCBjb25zdCBLVVJMJiwgY29uc3QgV1RGOjpW
ZWN0b3I8U3RyaW5nLCAwdT4mLCBjb25zdCBXVEY6OlZlY3RvcjxTdHJpbmcsIDB1PiYsIGNvbnN0
IFN0cmluZyYsIGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCByZWRpcmVjdERhdGFUb1BsdWdpbihX
aWRnZXQqKTsKKyAgICB2aXJ0dWFsIFdURjo6UGFzc1JlZlB0cjxXaWRnZXQ+IGNyZWF0ZUphdmFB
cHBsZXRXaWRnZXQoY29uc3QgSW50U2l6ZSYsIEhUTUxBcHBsZXRFbGVtZW50KiwgY29uc3QgS1VS
TCYsIGNvbnN0IFdURjo6VmVjdG9yPFN0cmluZywgMHU+JiwgY29uc3QgV1RGOjpWZWN0b3I8U3Ry
aW5nLCAwdT4mKSB7IG5vdEltcGxlbWVudGVkKCk7IHJldHVybiAwOyB9CisKKyAgICB2aXJ0dWFs
IE9iamVjdENvbnRlbnRUeXBlIG9iamVjdENvbnRlbnRUeXBlKGNvbnN0IEtVUkwmLCBjb25zdCBT
dHJpbmcmIG1pbWVUeXBlLCBib29sIHNob3VsZFByZWZlclBsdWdJbnNGb3JJbWFnZXMpOworICAg
IHZpcnR1YWwgU3RyaW5nIG92ZXJyaWRlTWVkaWFUeXBlKCkgY29uc3QgeyBub3RJbXBsZW1lbnRl
ZCgpOyByZXR1cm4gU3RyaW5nKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRDbGVh
cldpbmRvd09iamVjdEluV29ybGQoRE9NV3JhcHBlcldvcmxkKik7CisgICAgdmlydHVhbCB2b2lk
IGRvY3VtZW50RWxlbWVudEF2YWlsYWJsZSgpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZp
cnR1YWwgdm9pZCBkaWRQZXJmb3JtRmlyc3ROYXZpZ2F0aW9uKCkgY29uc3QgeyBub3RJbXBsZW1l
bnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyRm9ySWNvbk5vdGlmaWNhdGlvbihi
b29sKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKworICAgIHZpcnR1YWwgYm9vbCBzaG91bGRMb2Fk
SWNvbkV4dGVybmFsbHkoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgdm9pZCBsb2Fk
SWNvbkV4dGVybmFsbHkoY29uc3QgU3RyaW5nJiBvcmlnaW5hbFBhZ2VVcmwsIGNvbnN0IFN0cmlu
ZyYgZmluYWxQYWdlVXJsLCBjb25zdCBTdHJpbmcmIGljb25VcmwpOworCisgICAgdmlydHVhbCB2
b2lkIGRpZERldGVjdFhTUyhjb25zdCBLVVJMJiwgYm9vbCkgeyB9CisgICAgdmlydHVhbCB2b2lk
IHRyYW5zZmVyTG9hZGluZ1Jlc291cmNlRnJvbVBhZ2UoUmVzb3VyY2VMb2FkZXIqLCBjb25zdCBS
ZXNvdXJjZVJlcXVlc3QmLCBQYWdlKik7CisgICAgdmlydHVhbCB2b2lkIGRpZFRyYW5zZmVyQ2hp
bGRGcmFtZVRvTmV3RG9jdW1lbnQoKSB7IG5vdEltcGxlbWVudGVkKCk7IH07CisgICAgdmlydHVh
bCB2b2lkIGRpc3BhdGNoRGlkQ2hhbmdlSWNvbnMoSWNvblR5cGUpIHsgbm90SW1wbGVtZW50ZWQo
KTsgfTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hXaWxsU2VuZFN1Ym1pdEV2ZW50KEhUTUxG
b3JtRWxlbWVudCopIHsgbm90SW1wbGVtZW50ZWQoKTsgfTsKKworICAgIHZpcnR1YWwgdm9pZCB3
aWxsRGVmZXJMb2FkaW5nKCk7CisgICAgdmlydHVhbCB2b2lkIGRpZFJlc3VtZUxvYWRpbmcoKTsK
KyAgICB2aXJ0dWFsIHZvaWQgYXV0aGVudGljYXRpb25DaGFsbGVuZ2UoY29uc3QgU3RyaW5nJiBy
ZWFsbSwgU3RyaW5nJiB1c2VybmFtZSwgU3RyaW5nJiBwYXNzd29yZCk7CisKKyAgICB2aXJ0dWFs
IFBhc3NSZWZQdHI8RnJhbWVOZXR3b3JraW5nQ29udGV4dD4gY3JlYXRlTmV0d29ya2luZ0NvbnRl
eHQoKTsKKworICAgICAvLyBTY2hlZHVsZSBhIHNjcmlwdCB0aGF0IHdhcyBsb2FkZWQgbWFudWFs
bHkgYnkgdGhlIHVzZXIgKGVnLiBhCisgICAgIC8vIGJvb2ttYXJrbGV0KSB3aGlsZSBwYWdlIGxv
YWRpbmcgd2FzIGRlZmVycmVkLgorICAgIHZvaWQgc2V0RGVmZXJyZWRNYW51YWxTY3JpcHQoY29u
c3QgS1VSTCYpOworCisgICAgdm9pZCByZWFkeVRvUmVuZGVyKGJvb2wgcGFnZUlzVmlzdWFsbHlO
b25FbXB0eSk7CisKKyAgICB2b2lkIGRvUGVuZGluZ0ZyYWdtZW50U2Nyb2xsKCk7CisKKyAgICAv
LyBVc2VkIHRvIHN0b3AgbWVkaWEgZmlsZXMgZnJvbSBsb2FkaW5nIGJlY2F1c2Ugd2UgZG9uJ3Qg
bmVlZCB0byBoYXZlIHRoZSBlbnRpcmUgZmlsZSBsb2FkZWQgYnkgV2ViS2l0LgorICAgIHZvaWQg
c2V0Q2FuY2VsTG9hZE9uTmV4dERhdGEoKSB7IG1fY2FuY2VsTG9hZE9uTmV4dERhdGEgPSB0cnVl
OyB9CisgICAgYm9vbCBzaG91bGRDYW5jZWxMb2FkT25OZXh0RGF0YSgpIGNvbnN0IHsgcmV0dXJu
IG1fY2FuY2VsTG9hZE9uTmV4dERhdGE7IH0KKworICAgIHZvaWQgc3VwcHJlc3NDaGlsZEZyYW1l
Q3JlYXRpb24oKSB7IG1fY2hpbGRGcmFtZUNyZWF0aW9uU3VwcHJlc3NlZCA9IHRydWU7IH0KKwor
cHJpdmF0ZToKKyAgICB2b2lkIHJlY2VpdmVkRGF0YShjb25zdCBjaGFyKiwgaW50LCBjb25zdCBT
dHJpbmcmKTsKKyAgICB2b2lkIGRpZEZpbmlzaE9yRmFpbExvYWRpbmcoY29uc3QgUmVzb3VyY2VF
cnJvciYpOworICAgIGJvb2wgaXNNYWluRnJhbWUoKSBjb25zdDsKKworICAgIHZvaWQgaW52YWxp
ZGF0ZUJhY2tGb3J3YXJkTGlzdCgpIGNvbnN0OworICAgIHZvaWQgbm90aWZ5QmFja0ZvcndhcmRM
aXN0Q2hhbmdlZCgpIGNvbnN0OworCisgICAgUG9saWN5QWN0aW9uIGRlY2lkZVBvbGljeUZvckV4
dGVybmFsTG9hZChjb25zdCBSZXNvdXJjZVJlcXVlc3QgJiwgYm9vbCBpc0ZyYWdtZW50U2Nyb2xs
KTsKKyAgICB2b2lkIGRlbGF5UG9saWN5Q2hlY2tVbnRpbEZyYWdtZW50RXhpc3RzKGNvbnN0IFN0
cmluZyYgZnJhZ21lbnQsIEZyYW1lUG9saWN5RnVuY3Rpb24pOworCisgICAgdm9pZCBkZWZlcnJl
ZEpvYnNUaW1lckZpcmVkKFRpbWVyPEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeT4qKTsKKwor
ICAgIEZyYW1lKiBtX2ZyYW1lOworICAgIFJlc291cmNlRXJyb3IgbV9sb2FkRXJyb3I7CisgICAg
QmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJQYWdlUHJpdmF0ZSogbV93ZWJQYWdlUHJpdmF0ZTsKKwor
ICAgIFRpbWVyPEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeT4qIG1fZGVmZXJyZWRKb2JzVGlt
ZXI7CisgICAgS1VSTCBtX2RlZmVycmVkTWFudWFsU2NyaXB0OworICAgIEdlb2xvY2F0aW9uKiBt
X2dlb2xvY2F0aW9uOworICAgIGJvb2wgbV9zZW50UmVhZHlUb1JlbmRlcjsKKworICAgIEZyYW1l
UG9saWN5RnVuY3Rpb24gbV9wZW5kaW5nRnJhZ21lbnRTY3JvbGxQb2xpY3lGdW5jdGlvbjsKKyAg
ICBTdHJpbmcgbV9wZW5kaW5nRnJhZ21lbnRTY3JvbGw7CisKKyAgICBib29sIG1fbG9hZGluZ0Vy
cm9yUGFnZTsKKyAgICBib29sIG1fY2xpZW50UmVkaXJlY3RJc1BlbmRpbmc7CisgICAgYm9vbCBt
X2NoaWxkRnJhbWVDcmVhdGlvblN1cHByZXNzZWQ7CisKKyAgICAvLyBUaGlzIHNldCBpbmNsdWRl
cyB0aGUgb3JpZ2luYWwgYW5kIGZpbmFsIHVybHMgZm9yIHNlcnZlciByZWRpcmVjdHMuCisgICAg
SGFzaFNldDxLVVJMPiBtX2hpc3RvcnlOYXZpZ2F0aW9uU291cmNlVVJMczsKKyAgICBIYXNoU2V0
PEtVUkw+IG1fcmVkaXJlY3RVUkxzVG9Ta2lwRHVlVG9IaXN0b3J5TmF2aWdhdGlvbjsKKworICAg
IC8vIFBsdWdpbiB2aWV3IHRvIHJlZGlyZWN0IGRhdGEgdG8uCisgICAgV2ViQ29yZTo6UGx1Z2lu
VmlldyogbV9wbHVnaW5WaWV3OworICAgIGJvb2wgbV9oYXNTZW50UmVzcG9uc2VUb1BsdWdpbjsK
KworICAgIC8vIFVzZWQgdG8gc3RvcCBtZWRpYSBmaWxlcyBmcm9tIGxvYWRpbmcgYmVjYXVzZSB3
ZSBkb24ndCBuZWVkIHRvIGhhdmUgdGhlIGVudGlyZSBmaWxlIGxvYWRlZCBieSBXZWJLaXQuCisg
ICAgYm9vbCBtX2NhbmNlbExvYWRPbk5leHREYXRhOworfTsKKworfSAvLyBXZWJDb3JlCisKKyNl
bmRpZiAvLyBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnlfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126604</attachid>
            <date>2012-02-10 16:39:55 -0800</date>
            <delta_ts>2012-02-13 13:37:23 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78275-20120210193933.patch</filename>
            <type>text/plain</type>
            <size>68998</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3MTA5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDljM2E2NmRhNThjMjhhYjI5
YzQwMjQ5YzBhNTcwYTg2YTA1N2IwNTIuLjk5YjE5MjRhZDQyMTU2YzBhN2VhZGM5OTA1YmFiNzEz
MDdjYjkyMGMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTItMDItMTAgIEphY2t5IEpp
YW5nICA8emhhamlhbmdAcmltLmNvbT4KKworICAgICAgICBbQmxhY2tCZXJyeV0gVXBzdHJlYW0g
QmxhY2tCZXJyeSBXZWJDb3JlU3VwcG9ydCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkgY2xh
c3MKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc4Mjc1
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW5pdGlh
bCB1cHN0cmVhbSwgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJDb3Jl
U3VwcG9ydC9GcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkuY3BwOiBBZGRlZC4KKyAgICAgICAg
KiBibGFja2JlcnJ5L1dlYkNvcmVTdXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeS5o
OiBBZGRlZC4KKwogMjAxMi0wMi0wOCAgUm9iIEJ1aXMgIDxyYnVpc0ByaW0uY29tPgogCiAgICAg
ICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBEdW1wUmVuZGVyVHJlZUJsYWNrQmVycnkKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRl
ckNsaWVudEJsYWNrQmVycnkuY3BwIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYkNvcmVT
dXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNTVmNWRk
NDIyMTYzNDBhODM0MzM4MTRmNTVjNzJjNzcwZDhmYjYyNgotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRlckNsaWVudEJs
YWNrQmVycnkuY3BwCkBAIC0wLDAgKzEsMTI4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl
CisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5LmgiCisKKyNpbmNsdWRlICJCYWNr
Rm9yd2FyZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJCYWNrRm9yd2FyZExpc3RJbXBsLmgiCisj
aW5jbHVkZSAiQmFja2luZ1N0b3JlQ2xpZW50LmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlX3Au
aCIKKyNpbmNsdWRlICJCYXNlNjQuaCIKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2luY2x1
ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUgIkNocm9tZUNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNs
dWRlICJDbGllbnRFeHRlbnNpb24uaCIKKyNpbmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCisjaW5j
bHVkZSAiRHVtcFJlbmRlclRyZWVDbGllbnQuaCIKKyNpbmNsdWRlICJGcmFtZU5ldHdvcmtpbmdD
b250ZXh0QmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhU
TUxGb3JtRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxIZWFkRWxlbWVudC5oIgorI2luY2x1ZGUg
IkhUTUxJbWFnZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MTGlua0VsZW1lbnQuaCIKKyNpbmNs
dWRlICJIVE1MTWVkaWFFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTE1ldGFFbGVtZW50LmgiCisj
aW5jbHVkZSAiSFRNTFBsdWdJbkVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVFRQUGFyc2Vycy5oIgor
I2luY2x1ZGUgIkhpc3RvcnlJdGVtLmgiCisjaW5jbHVkZSAiSWNvbkRhdGFiYXNlLmgiCisjaW5j
bHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJJbnB1dEhhbmRsZXIuaCIKKyNpbmNsdWRlICJNSU1F
VHlwZVJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAiTmF0aXZlSW1hZ2VTa2lhLmgiCisjaW5jbHVkZSAi
TmV0d29ya01hbmFnZXIuaCIKKyNpbmNsdWRlICJOb2RlTGlzdC5oIgorI2luY2x1ZGUgIk5vdElt
cGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBsdWdpblZpZXcuaCIK
KyNpbmNsdWRlICJQcm9ncmVzc1RyYWNrZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJFbWJlZGRlZE9i
amVjdC5oIgorI2luY2x1ZGUgIlNjb3BlUG9pbnRlci5oIgorI2luY2x1ZGUgIlNlY3VyaXR5UG9s
aWN5LmgiCisjaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCisjaW5jbHVkZSAiVGV4dEVuY29kaW5n
LmgiCisjaW5jbHVkZSAiVG91Y2hFdmVudEhhbmRsZXIuaCIKKyNpZiBFTkFCTEUoV0VCRE9NKQor
I2luY2x1ZGUgIldlYkRPTURvY3VtZW50LmgiCisjZW5kaWYKKyNpbmNsdWRlICJXZWJQYWdlQ2xp
ZW50LmgiCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1Mb2cuaD4KKyNpbmNsdWRlIDxC
bGFja0JlcnJ5UGxhdGZvcm1TY3JlZW4uaD4KKyNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9BUElD
YXN0Lmg+CisjaW5jbHVkZSA8bmV0d29yay9GaWx0ZXJTdHJlYW0uaD4KKyNpbmNsdWRlIDxuZXR3
b3JrL05ldHdvcmtSZXF1ZXN0Lmg+CisKK3VzaW5nIFdURjo6U3RyaW5nOwordXNpbmcgbmFtZXNw
YWNlIFdlYkNvcmU7Cit1c2luZyBuYW1lc3BhY2UgQmxhY2tCZXJyeTo6V2ViS2l0OworCisvLyBU
aGlzIHdhcyBjb3BpZWQgZnJvbSBmaWxlICJXZWJLaXQvU291cmNlL1dlYktpdC9tYWMvTWlzYy9X
ZWJLaXRFcnJvcnMuaCIuCitlbnVtIHsKKyAgICBXZWJLaXRFcnJvckNhbm5vdFNob3dNSU1FVHlw
ZSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsCisgICAgV2ViS2l0RXJyb3JDYW5u
b3RTaG93VVJMID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxLAorICAgIFdl
YktpdEVycm9yRnJhbWVMb2FkSW50ZXJydXB0ZWRCeVBvbGljeUNoYW5nZSA9ICAgICAgICAgICAg
IDEwMiwKKyAgICBXZWJLaXRFcnJvckNhbm5vdFVzZVJlc3RyaWN0ZWRQb3J0ID0gICAgICAgICAg
ICAgICAgICAgICAgICAxMDMsCisgICAgV2ViS2l0RXJyb3JDYW5ub3RGaW5kUGx1Z0luID0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwLAorICAgIFdlYktpdEVycm9yQ2Fubm90TG9h
ZFBsdWdJbiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMSwKKyAgICBXZWJLaXRF
cnJvckphdmFVbmF2YWlsYWJsZSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDIs
CisgICAgV2ViS2l0RXJyb3JQbHVnaW5XaWxsSGFuZGxlTG9hZCA9ICAgICAgICAgICAgICAgICAg
ICAgICAgICAgMjAzCit9OworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0ZyYW1lTG9hZGVyQ2xp
ZW50QmxhY2tCZXJyeTo6RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5KCkKKyAgICA6IG1fZnJh
bWUoMCkKKyAgICAsIG1fd2ViUGFnZVByaXZhdGUoMCkKKyAgICAsIG1fc2VudFJlYWR5VG9SZW5k
ZXIoZmFsc2UpCisgICAgLCBtX3BlbmRpbmdGcmFnbWVudFNjcm9sbFBvbGljeUZ1bmN0aW9uKDAp
CisgICAgLCBtX2xvYWRpbmdFcnJvclBhZ2UoZmFsc2UpCisgICAgLCBtX2NsaWVudFJlZGlyZWN0
SXNQZW5kaW5nKGZhbHNlKQorICAgICwgbV9jaGlsZEZyYW1lQ3JlYXRpb25TdXBwcmVzc2VkKGZh
bHNlKQorICAgICwgbV9wbHVnaW5WaWV3KDApCisgICAgLCBtX2hhc1NlbnRSZXNwb25zZVRvUGx1
Z2luKGZhbHNlKQorICAgICwgbV9jYW5jZWxMb2FkT25OZXh0RGF0YShmYWxzZSkKK3sKKyAgICBt
X2RlZmVycmVkSm9ic1RpbWVyID0gbmV3IFRpbWVyPEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJy
eT4odGhpcywgJkZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGVmZXJyZWRKb2JzVGltZXJG
aXJlZCk7Cit9CisKK0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6fkZyYW1lTG9hZGVyQ2xp
ZW50QmxhY2tCZXJyeSgpCit7CisgICAgZGVsZXRlIG1fZGVmZXJyZWRKb2JzVGltZXI7CisgICAg
bV9kZWZlcnJlZEpvYnNUaW1lciA9IDA7Cit9CisKK2ludCBGcmFtZUxvYWRlckNsaWVudEJsYWNr
QmVycnk6OnBsYXllcklkKCkgY29uc3QKK3sKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZSAmJiBt
X3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudCkKKyAgICAgICAgcmV0dXJuIG1fd2ViUGFnZVByaXZh
dGUtPm1fY2xpZW50LT5nZXRJbnN0YW5jZUlkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wg
RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpjb29raWVzRW5hYmxlZCgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fd2ViUGFnZVByaXZhdGUtPm1fd2ViU2V0dGluZ3MtPmFyZUNvb2tpZXNFbmFi
bGVkKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERp
ZEFkZEJhY2tGb3J3YXJkSXRlbShIaXN0b3J5SXRlbSogaXRlbSkgY29uc3QKK3sKKyAgICAvLyBJ
bmZvcm0gdGhlIGNsaWVudCB0aGF0IHRoZSBiYWNrL2ZvcndhcmQgbGlzdCBoYXMgY2hhbmdlZC4K
KyAgICBpbnZhbGlkYXRlQmFja0ZvcndhcmRMaXN0KCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJD
bGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZFJlbW92ZUJhY2tGb3J3YXJkSXRlbShIaXN0b3J5
SXRlbSogaXRlbSkgY29uc3QKK3sKKyAgICBpbnZhbGlkYXRlQmFja0ZvcndhcmRMaXN0KCk7Cit9
CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZENoYW5nZUJh
Y2tGb3J3YXJkSW5kZXgoKSBjb25zdAoreworICAgIGludmFsaWRhdGVCYWNrRm9yd2FyZExpc3Qo
KTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkQ2hh
bmdlTG9jYXRpb25XaXRoaW5QYWdlKCkKK3sKKyAgICBpZiAoIWlzTWFpbkZyYW1lKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIFN0cmluZyB1cmwgPSBtX2ZyYW1lLT5kb2N1bWVudCgpLT51cmwo
KS5zdHJpbmcoKTsKKyAgICBTdHJpbmcgdG9rZW4gPSBtX2ZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1l
bnRMb2FkZXIoKS0+cmVxdWVzdCgpLnRva2VuKCk7CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5t
X2NsaWVudC0+bm90aWZ5TG9hZFRvQW5jaG9yKHVybC5jaGFyYWN0ZXJzKCksIHVybC5sZW5ndGgo
KSwgdG9rZW4uY2hhcmFjdGVycygpLCB0b2tlbi5sZW5ndGgoKSk7Cit9CisKK3ZvaWQgRnJhbWVM
b2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZFB1c2hTdGF0ZVdpdGhpblBhZ2UoKQor
eworICAgIC8vIEZJWE1FOiBBcyBhIHdvcmthcm91bmQgd2UgYWJ1c2UgYW5jaG9yIG5hdmlnYXRp
b24gdG8gYWNoaWV2ZSBoaXN0b3J5IHB1c2guIFNlZSBQUiAjMTE5Nzc5IGZvciBtb3JlIGRldGFp
bHMuCisgICAgZGlzcGF0Y2hEaWRDaGFuZ2VMb2NhdGlvbldpdGhpblBhZ2UoKTsKK30KKwordm9p
ZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkUmVwbGFjZVN0YXRlV2l0
aGluUGFnZSgpCit7CisgICAgLy8gRklYTUU6IEFzIGEgd29ya2Fyb3VuZCB3ZSBhYnVzZSBhbmNo
b3IgbmF2aWdhdGlvbiB0byBhY2hpZXZlIGhpc3RvcnkgcmVwbGFjZS4gU2VlIFBSICMxMTk3Nzkg
Zm9yIG1vcmUgZGV0YWlscy4KKyAgICBkaXNwYXRjaERpZENoYW5nZUxvY2F0aW9uV2l0aGluUGFn
ZSgpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRQ
b3BTdGF0ZVdpdGhpblBhZ2UoKQoreworICAgIC8vIE5vdCBuZWVkZWQuCit9CisKK3ZvaWQgRnJh
bWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZENhbmNlbENsaWVudFJlZGlyZWN0
KCkKK3sKKyAgICBtX2NsaWVudFJlZGlyZWN0SXNQZW5kaW5nID0gZmFsc2U7Cit9CisKK3ZvaWQg
RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaFdpbGxQZXJmb3JtQ2xpZW50UmVk
aXJlY3QoY29uc3QgS1VSTCYsIGRvdWJsZSwgZG91YmxlKQoreworICAgIGlmIChtX3dlYlBhZ2VQ
cml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlKQorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2R1
bXBSZW5kZXJUcmVlLT5kaWREaXNwYXRjaFdpbGxQZXJmb3JtQ2xpZW50UmVkaXJlY3QoKTsKKwor
ICAgIG1fY2xpZW50UmVkaXJlY3RJc1BlbmRpbmcgPSB0cnVlOworfQorCit2b2lkIEZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEZWNpZGVQb2xpY3lGb3JSZXNwb25zZShGcmFt
ZVBvbGljeUZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25z
ZSwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0KQoreworICAgIC8vIEZJWE1FOiBXaGF0
IHNob3VsZCB3ZSBkbyBmb3IgSFRUUCBzdGF0dXMgY29kZSAyMDQgYW5kIDIwNSBhbmQgImFwcGxp
Y2F0aW9uL3ppcCI/CisgICAgUG9saWN5QWN0aW9uIHBvbGljeSA9IFBvbGljeUlnbm9yZTsKKwor
ICAgIGlmIChjb250ZW50RGlzcG9zaXRpb25UeXBlKHJlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZCgi
Q29udGVudC1EaXNwb3NpdGlvbiIpKSA9PSBDb250ZW50RGlzcG9zaXRpb25BdHRhY2htZW50Cisg
ICAgICAgIHx8IHJlcXVlc3QuZm9yY2VEb3dubG9hZCgpKQorICAgICAgICBwb2xpY3kgPSBQb2xp
Y3lEb3dubG9hZDsKKyAgICBlbHNlIGlmIChjYW5TaG93TUlNRVR5cGUocmVzcG9uc2UubWltZVR5
cGUoKSkpCisgICAgICAgIHBvbGljeSA9IFBvbGljeVVzZTsKKyAgICBlbHNlIGlmICgoUmVzb3Vy
Y2VSZXF1ZXN0OjpUYXJnZXRJc01haW5GcmFtZSA9PSByZXF1ZXN0LnRhcmdldFR5cGUoKSkKKyAg
ICAgICAgICAgICAmJiBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+ZG93bmxvYWRBbGxvd2Vk
KHJlcXVlc3QudXJsKCkuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSkpCisgICAgICAgIHBvbGljeSA9
IFBvbGljeURvd25sb2FkOworCisgICAgKG1fZnJhbWUtPmxvYWRlcigpLT5wb2xpY3lDaGVja2Vy
KCktPipmdW5jdGlvbikocG9saWN5KTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNr
QmVycnk6OmRpc3BhdGNoRGVjaWRlUG9saWN5Rm9yTmF2aWdhdGlvbkFjdGlvbihGcmFtZVBvbGlj
eUZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCBOYXZpZ2F0aW9uQWN0aW9uJiBhY3Rpb24sIGNvbnN0
IFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCwgUGFzc1JlZlB0cjxGb3JtU3RhdGU+KQoreworICAg
IFBvbGljeUFjdGlvbiBkZWNpc2lvbiA9IFBvbGljeVVzZTsKKworICAgIGNvbnN0IEtVUkwmIHVy
bCA9IHJlcXVlc3QudXJsKCk7CisKKyAgICAvLyBGcmFnbWVudCBzY3JvbGxzIG9uIHRoZSBzYW1l
IHBhZ2Ugc2hvdWxkIGFsd2F5cyBiZSBoYW5kbGVkIGludGVybmFsbHkuCisgICAgLy8gKE9ubHkg
Y291bnQgYXMgYSBmcmFnbWVudCBzY3JvbGwgaWYgd2UgYXJlIHNjcm9sbGluZyB0byBhICNmcmFn
bWVudCB1cmwsIG5vdCBiYWNrIHRvIHRoZSB0b3AsIGFuZCByZWxvYWRpbmcKKyAgICAvLyB0aGUg
c2FtZSB1cmwgaXMgbm90IGEgZnJhZ21lbnQgc2Nyb2xsIGV2ZW4gaWYgaXQgaGFzIGEgI2ZyYWdt
ZW50LikKKyAgICBjb25zdCBLVVJMJiBjdXJyZW50VXJsID0gbV9mcmFtZS0+ZG9jdW1lbnQoKS0+
dXJsKCk7CisgICAgYm9vbCBpc0ZyYWdtZW50U2Nyb2xsID0gdXJsLmhhc0ZyYWdtZW50SWRlbnRp
ZmllcigpICYmIHVybCAhPSBjdXJyZW50VXJsICYmIGVxdWFsSWdub3JpbmdGcmFnbWVudElkZW50
aWZpZXIoY3VycmVudFVybCwgdXJsKTsKKyAgICBpZiAoZGVjaXNpb24gPT0gUG9saWN5VXNlKQor
ICAgICAgICBkZWNpc2lvbiA9IGRlY2lkZVBvbGljeUZvckV4dGVybmFsTG9hZChyZXF1ZXN0LCBp
c0ZyYWdtZW50U2Nyb2xsKTsKKworICAgIC8vIExldCB0aGUgY2xpZW50IGhhdmUgYSBjaGFuY2Ug
dG8gc2F5IHdoZXRoZXIgdGhpcyBuYXZpZ2F0aW9uIHNob3VsZAorICAgIC8vIGJlIGlnbm9yZWQg
b3Igbm90LgorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdCBwbGF0Zm9y
bVJlcXVlc3Q7CisgICAgcmVxdWVzdC5pbml0aWFsaXplUGxhdGZvcm1SZXF1ZXN0KHBsYXRmb3Jt
UmVxdWVzdCwgZmFsc2UgLyppc0luaXRpYWwqLyk7CisgICAgaWYgKGlzTWFpbkZyYW1lKCkgJiYg
IW1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5hY2NlcHROYXZpZ2F0aW9uUmVxdWVzdCgKKyAg
ICAgICAgcGxhdGZvcm1SZXF1ZXN0LCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmF2aWdhdGlvblR5
cGUoYWN0aW9uLnR5cGUoKSkpKSB7CisgICAgICAgIGlmIChhY3Rpb24udHlwZSgpID09IE5hdmln
YXRpb25UeXBlRm9ybVN1Ym1pdHRlZAorICAgICAgICAgICAgfHwgYWN0aW9uLnR5cGUoKSA9PSBO
YXZpZ2F0aW9uVHlwZUZvcm1SZXN1Ym1pdHRlZCkKKyAgICAgICAgICAgIG1fZnJhbWUtPmxvYWRl
cigpLT5yZXNldE11bHRpcGxlRm9ybVN1Ym1pc3Npb25Qcm90ZWN0aW9uKCk7CisKKyAgICAgICAg
aWYgKGFjdGlvbi50eXBlKCkgPT0gTmF2aWdhdGlvblR5cGVMaW5rQ2xpY2tlZCAmJiB1cmwuaGFz
RnJhZ21lbnRJZGVudGlmaWVyKCkpIHsKKyAgICAgICAgICAgIFJlc291cmNlUmVxdWVzdCBlbXB0
eVJlcXVlc3Q7CisgICAgICAgICAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+YWN0aXZlRG9jdW1lbnRM
b2FkZXIoKS0+c2V0TGFzdENoZWNrZWRSZXF1ZXN0KGVtcHR5UmVxdWVzdCk7CisgICAgICAgIH0K
KyAgICAgICAgZGVjaXNpb24gPSBQb2xpY3lJZ25vcmU7CisgICAgfQorCisgICAgLy8gSWYgd2Ug
YWJvcnQgaGVyZSwgZGlzcGF0Y2hEaWRDYW5jZWxDbGllbnRSZWRpcmVjdCB3aWxsIG5vdCBiZSBj
YWxsZWQuCisgICAgLy8gU28gY2FsbCBpdCBieSBoYW5kLgorICAgIGlmIChkZWNpc2lvbiA9PSBQ
b2xpY3lJZ25vcmUpCisgICAgICAgIGRpc3BhdGNoRGlkQ2FuY2VsQ2xpZW50UmVkaXJlY3QoKTsK
KworICAgIChtX2ZyYW1lLT5sb2FkZXIoKS0+cG9saWN5Q2hlY2tlcigpLT4qZnVuY3Rpb24pKGRl
Y2lzaW9uKTsKKworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlKQor
ICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlLT5kaWREZWNpZGVQb2xp
Y3lGb3JOYXZpZ2F0aW9uQWN0aW9uKGFjdGlvbiwgcmVxdWVzdCk7Cit9CisKK3ZvaWQgRnJhbWVM
b2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkZWxheVBvbGljeUNoZWNrVW50aWxGcmFnbWVudEV4aXN0
cyhjb25zdCBTdHJpbmcmIGZyYWdtZW50LCBGcmFtZVBvbGljeUZ1bmN0aW9uIGZ1bmN0aW9uKQor
eworICAgIEFTU0VSVChpc01haW5GcmFtZSgpKTsKKworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRl
LT5sb2FkU3RhdGUoKSA8IFdlYlBhZ2VQcml2YXRlOjpGaW5pc2hlZCAmJiAhbV9mcmFtZS0+ZG9j
dW1lbnQoKS0+ZmluZEFuY2hvcihmcmFnbWVudCkpIHsKKyAgICAgICAgLy8gVGVsbCB0aGUgY2xp
ZW50IHdlIG5lZWQgbW9yZSBkYXRhLCBpbiBjYXNlIHRoZSBmcmFnbWVudCBleGlzdHMgYnV0IGlz
IGJlaW5nIGhlbGQgYmFjay4KKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5l
ZWRNb3JlRGF0YSgpOworICAgICAgICBtX3BlbmRpbmdGcmFnbWVudFNjcm9sbFBvbGljeUZ1bmN0
aW9uID0gZnVuY3Rpb247CisgICAgICAgIG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsID0gZnJhZ21l
bnQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAobV9mcmFtZS0+bG9hZGVyKCktPnBv
bGljeUNoZWNrZXIoKS0+KmZ1bmN0aW9uKShQb2xpY3lVc2UpOworfQorCit2b2lkIEZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y2FuY2VsUG9saWN5Q2hlY2soKQoreworICAgIG1fcGVuZGlu
Z0ZyYWdtZW50U2Nyb2xsUG9saWN5RnVuY3Rpb24gPSAwOworICAgIG1fcGVuZGluZ0ZyYWdtZW50
U2Nyb2xsID0gU3RyaW5nKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5
Ojpkb1BlbmRpbmdGcmFnbWVudFNjcm9sbCgpCit7CisgICAgaWYgKG1fcGVuZGluZ0ZyYWdtZW50
U2Nyb2xsLmlzTnVsbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBNYWtlIHN1cmUgdG8g
Y2xlYXIgdGhlIHBlbmRpbmcgbWVtYmVycyBmaXJzdCB0byBhdm9pZCByZWN1cnNpb24uCisgICAg
U3RyaW5nIGZyYWdtZW50ID0gbV9wZW5kaW5nRnJhZ21lbnRTY3JvbGw7CisgICAgbV9wZW5kaW5n
RnJhZ21lbnRTY3JvbGwgPSBTdHJpbmcoKTsKKworICAgIEZyYW1lUG9saWN5RnVuY3Rpb24gZnVu
Y3Rpb24gPSBtX3BlbmRpbmdGcmFnbWVudFNjcm9sbFBvbGljeUZ1bmN0aW9uOworICAgIG1fcGVu
ZGluZ0ZyYWdtZW50U2Nyb2xsUG9saWN5RnVuY3Rpb24gPSAwOworCisgICAgZGVsYXlQb2xpY3lD
aGVja1VudGlsRnJhZ21lbnRFeGlzdHMoZnJhZ21lbnQsIGZ1bmN0aW9uKTsKK30KKwordm9pZCBG
cmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGVjaWRlUG9saWN5Rm9yTmV3V2lu
ZG93QWN0aW9uKEZyYW1lUG9saWN5RnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IE5hdmlnYXRpb25B
Y3Rpb24mLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmIHJlcXVlc3QsIFBhc3NSZWZQdHI8Rm9ybVN0
YXRlPiwgY29uc3QgU3RyaW5nJiBmcmFtZU5hbWUpCit7CisgICAgaWYgKHJlcXVlc3QuaXNSZXF1
ZXN0ZWRCeVBsdWdpbigpICYmIFNjcmlwdENvbnRyb2xsZXI6OnByb2Nlc3NpbmdVc2VyR2VzdHVy
ZSgpICYmICFtX3dlYlBhZ2VQcml2YXRlLT5tX3BsdWdpbk1heU9wZW5OZXdUYWIpCisgICAgICAg
IChtX2ZyYW1lLT5sb2FkZXIoKS0+cG9saWN5Q2hlY2tlcigpLT4qZnVuY3Rpb24pKFBvbGljeUln
bm9yZSk7CisKKyAgICAvLyBBIG5ldyB3aW5kb3cgY2FuIG5ldmVyIGJlIGEgZnJhZ21lbnQgc2Ny
b2xsLgorICAgIFBvbGljeUFjdGlvbiBkZWNpc2lvbiA9IGRlY2lkZVBvbGljeUZvckV4dGVybmFs
TG9hZChyZXF1ZXN0LCBmYWxzZSk7CisgICAgKG1fZnJhbWUtPmxvYWRlcigpLT5wb2xpY3lDaGVj
a2VyKCktPipmdW5jdGlvbikoZGVjaXNpb24pOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50
QmxhY2tCZXJyeTo6Y29tbWl0dGVkTG9hZChEb2N1bWVudExvYWRlciogbG9hZGVyLCBjb25zdCBj
aGFyKiBkYXRhLCBpbnQgbGVuZ3RoKQoreworICAgIC8vIFRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBj
b2RlIG1heSBzZWVtLi4uYSBiaXQgb2RkLiBJdCdzIHN0cnVjdHVyZWQgd2l0aCB0d28gY2hlY2tz
IG9uIHRoZSBzdGF0ZQorICAgIC8vIG9mIG1fcGx1Z2luVmlldyBiZWNhdXNlIGl0J3MgYWN0dWFs
bHkgcmVjZWl2ZWREYXRhIHRoYXQgbWF5IGNhdXNlIHRoZSByZXF1ZXN0IHRvIHJlLWRpcmVjdCBk
YXRhCisgICAgLy8gdG8gYSBQbHVnaW5WaWV3LiBUaGlzIGlzIGJlY2F1c2UgcmVjZWl2ZWREYXRh
IG1heSBkZWNpZGUgdG8gY3JlYXRlIGEgUGx1Z2luRG9jdW1lbnQgY29udGFpbmluZworICAgIC8v
IGEgUGx1Z2luVmlldy4gVGhlIFBsdWdpblZpZXcgd2lsbCByZXF1ZXN0IHRoYXQgdGhlIG1haW4g
cmVzb3VyY2UgZm9yIHRoZSBmcmFtZSBiZSByZWRpcmVjdGVkCisgICAgLy8gdG8gdGhlIFBsdWdp
blZpZXcuIFNvIGFmdGVyIHJlY2VpdmVkRGF0YSBoYXMgYmVlbiBjYWxsZWQsIHRoaXMgY29kZSBu
ZWVkcyB0byBjaGVjayB3aGV0aGVyCisgICAgLy8gcmUtZGlyZWN0aW9uIHRvIGEgUGx1Z2luVmll
dyBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHBhc3MgdGhlIHNhbWUgZGF0YSBvbiB0byB0aGUgUGx1
Z2luVmlldy4KKyAgICAvLyBUaGVyZWFmdGVyLCBhbGwgZGF0YSB3aWxsIGJlIHJlLWRpcmVjdGVk
IHRvIHRoZSBQbHVnaW5WaWV3OyBpLmUuLCBubyBhZGRpdGlvbmFsIGRhdGEgd2lsbCBnbworICAg
IC8vIHRvIHJlY2VpdmVkRGF0YS4KKworICAgIGlmICghbV9wbHVnaW5WaWV3KSB7CisgICAgICAg
IGNvbnN0IFN0cmluZyYgdGV4dEVuY29kaW5nID0gbG9hZGVyLT5yZXNwb25zZSgpLnRleHRFbmNv
ZGluZ05hbWUoKTsKKyAgICAgICAgcmVjZWl2ZWREYXRhKGRhdGEsIGxlbmd0aCwgdGV4dEVuY29k
aW5nKTsKKyAgICB9CisKKyAgICBpZiAobV9wbHVnaW5WaWV3KSB7CisgICAgICAgIGlmICghbV9o
YXNTZW50UmVzcG9uc2VUb1BsdWdpbikgeworICAgICAgICAgICAgbV9wbHVnaW5WaWV3LT5kaWRS
ZWNlaXZlUmVzcG9uc2UobG9hZGVyLT5yZXNwb25zZSgpKTsKKyAgICAgICAgICAgIG1faGFzU2Vu
dFJlc3BvbnNlVG9QbHVnaW4gPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtX3Bs
dWdpblZpZXcpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgbV9wbHVnaW5WaWV3LT5k
aWRSZWNlaXZlRGF0YShkYXRhLCBsZW5ndGgpOworICAgIH0KK30KKworUGFzc1JlZlB0cjxXaWRn
ZXQ+IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y3JlYXRlUGx1Z2luKGNvbnN0IEludFNp
emUmIHBsdWdpblNpemUsCisgICAgSFRNTFBsdWdJbkVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IEtV
UkwmIHVybCwgY29uc3QgVmVjdG9yPFN0cmluZz4mIHBhcmFtTmFtZXMsCisgICAgY29uc3QgVmVj
dG9yPFN0cmluZz4mIHBhcmFtVmFsdWVzLCBjb25zdCBTdHJpbmcmIG1pbWVUeXBlSW4sIGJvb2wg
bG9hZE1hbnVhbGx5KQoreworICAgIFN0cmluZyBtaW1lVHlwZShtaW1lVHlwZUluKTsKKyAgICBp
ZiAobWltZVR5cGUuaXNFbXB0eSgpKSB7CisgICAgICAgIG1pbWVUeXBlID0gTUlNRVR5cGVSZWdp
c3RyeTo6Z2V0TUlNRVR5cGVGb3JQYXRoKHVybC5wYXRoKCkpOworICAgICAgICBtaW1lVHlwZSA9
IEJsYWNrQmVycnk6OldlYktpdDo6V2ViU2V0dGluZ3M6OmdldE5vcm1hbGl6ZWRNSU1FVHlwZSht
aW1lVHlwZSk7CisgICAgICAgIGlmIChtaW1lVHlwZSAhPSAiYXBwbGljYXRpb24veC1zaG9ja3dh
dmUtZmxhc2giKQorICAgICAgICAgICAgbWltZVR5cGUgPSBtaW1lVHlwZUluOworICAgIH0KKwor
ICAgIGlmIChtaW1lVHlwZSA9PSAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giIHx8IG1p
bWVUeXBlID09ICJhcHBsaWNhdGlvbi9qbmV4dC1zY3JpcHRhYmxlLXBsdWdpbiIpIHsKKyAgICAg
ICAgUmVmUHRyPFBsdWdpblZpZXc+IHBsdWdpblZpZXcgPSBQbHVnaW5WaWV3OjpjcmVhdGUobV9m
cmFtZSwgcGx1Z2luU2l6ZSwgZWxlbWVudCwgdXJsLCBwYXJhbU5hbWVzLCBwYXJhbVZhbHVlcywg
bWltZVR5cGUsIGxvYWRNYW51YWxseSk7CisgICAgICAgIHJldHVybiBwbHVnaW5WaWV3OworICAg
IH0KKyAgICAvLyBJZiBpdCdzIG5vdCB0aGUgcGx1Z2luIHR5cGUgd2Ugc3VwcG9ydCwgdHJ5IGxv
YWQgZGlyZWN0bHkgZnJvbSBicm93c2VyLgorICAgIGlmIChtX2ZyYW1lLT5sb2FkZXIoKSAmJiBt
X2ZyYW1lLT5sb2FkZXIoKS0+c3ViZnJhbWVMb2FkZXIoKSAmJiAhdXJsLmlzTnVsbCgpKQorICAg
ICAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+c3ViZnJhbWVMb2FkZXIoKS0+cmVxdWVzdEZyYW1lKGVs
ZW1lbnQsIHVybCwgU3RyaW5nKCkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRnJhbWVM
b2FkZXJDbGllbnRCbGFja0JlcnJ5OjpyZWRpcmVjdERhdGFUb1BsdWdpbihXaWRnZXQqIHBsdWdp
bldpZGdldCkKK3sKKyAgICBBU1NFUlQoIW1fcGx1Z2luVmlldyk7CisgICAgbV9wbHVnaW5WaWV3
ID0gc3RhdGljX2Nhc3Q8UGx1Z2luVmlldyo+KHBsdWdpbldpZGdldCk7CisgICAgbV9oYXNTZW50
UmVzcG9uc2VUb1BsdWdpbiA9IGZhbHNlOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50Qmxh
Y2tCZXJyeTo6cmVjZWl2ZWREYXRhKGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgsIGNvbnN0
IFN0cmluZyYgdGV4dEVuY29kaW5nKQoreworICAgIGlmICghbV9mcmFtZSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKG1fY2FuY2VsTG9hZE9uTmV4dERhdGEpIHsKKyAgICAgICAgbV9mcmFt
ZS0+bG9hZGVyKCktPmFjdGl2ZURvY3VtZW50TG9hZGVyKCktPnN0b3BMb2FkaW5nKCk7CisgICAg
ICAgIG1fZnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigpLT53cml0ZXIoKS0+ZW5kKCk7
CisgICAgICAgIG1fY2FuY2VsTG9hZE9uTmV4dERhdGEgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIC8vIFNldCB0aGUgZW5jb2RpbmcuIFRoaXMgb25seSBuZWVkcyB0byBi
ZSBkb25lIG9uY2UsIGJ1dCBpdCdzIGhhcm1sZXNzIHRvIGRvIGl0IGFnYWluIGxhdGVyLgorICAg
IFN0cmluZyBlbmNvZGluZyA9IG1fZnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigpLT5v
dmVycmlkZUVuY29kaW5nKCk7CisgICAgYm9vbCB1c2VyQ2hvc2VuID0gIWVuY29kaW5nLmlzTnVs
bCgpOworICAgIGlmIChlbmNvZGluZy5pc051bGwoKSkKKyAgICAgICAgZW5jb2RpbmcgPSB0ZXh0
RW5jb2Rpbmc7CisgICAgbV9mcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCktPndyaXRl
cigpLT5zZXRFbmNvZGluZyhlbmNvZGluZywgdXNlckNob3Nlbik7CisgICAgbV9mcmFtZS0+bG9h
ZGVyKCktPmRvY3VtZW50TG9hZGVyKCktPndyaXRlcigpLT5hZGREYXRhKGRhdGEsIGxlbmd0aCk7
Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpmaW5pc2hlZExvYWRpbmco
RG9jdW1lbnRMb2FkZXIqIGxvYWRlcikKK3sKKyAgICBpZiAobV9wbHVnaW5WaWV3KSB7CisgICAg
ICAgIG1fcGx1Z2luVmlldy0+ZGlkRmluaXNoTG9hZGluZygpOworICAgICAgICBtX3BsdWdpblZp
ZXcgPSAwOworICAgICAgICBtX2hhc1NlbnRSZXNwb25zZVRvUGx1Z2luID0gZmFsc2U7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgLy8gVGVsbGluZyB0aGUgZnJhbWUgd2UgcmVjZWl2ZWQgc29tZSBk
YXRhIGFuZCBwYXNzaW5nIDAgYXMgdGhlIGRhdGEgaXMgb3VyCisgICAgICAgIC8vIHdheSB0byBn
ZXQgd29yayBkb25lIHRoYXQgaXMgbm9ybWFsbHkgZG9uZSB3aGVuIHRoZSBmaXJzdCBiaXQgb2Yg
ZGF0YSBpcworICAgICAgICAvLyByZWNlaXZlZCwgZXZlbiBmb3IgdGhlIGNhc2Ugb2YgYSBkb2N1
bWVudCB3aXRoIG5vIGRhdGEgKGxpa2UgYWJvdXQ6YmxhbmspCisgICAgICAgIGNvbW1pdHRlZExv
YWQobG9hZGVyLCAwLCAwKTsKKworICAgICAgICBpZiAoIW1fZnJhbWUtPmRvY3VtZW50KCkpCisg
ICAgICAgICAgICByZXR1cm47CisgICAgfQorfQorCitQYXNzUmVmUHRyPERvY3VtZW50TG9hZGVy
PiBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmNyZWF0ZURvY3VtZW50TG9hZGVyKGNvbnN0
IFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCwgY29uc3QgU3Vic3RpdHV0ZURhdGEmIHN1YnN0aXR1
dGVEYXRhKQoreworICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSByZXF1ZXN0IHdpdGggdGhlIHRv
a2VuIGZyb20gdGhlIG9yaWdpbmFsIHJlcXVlc3QgZm9yIHRoaXMgZnJhbWUKKyAgICAvLyAodW5s
ZXNzIGl0IGFscmVhZHkgaGFzIGEgdG9rZW4sIGluIHdoaWNoIGNhc2UgdGhlIHJlcXVlc3QgY2Ft
ZSBmcm9tIHRoZSBjbGllbnQpCisgICAgUmVzb3VyY2VSZXF1ZXN0IG5ld1JlcXVlc3QocmVxdWVz
dCk7CisgICAgaWYgKG1fZnJhbWUgJiYgbV9mcmFtZS0+bG9hZGVyKCkgJiYgbV9mcmFtZS0+bG9h
ZGVyKCktPmRvY3VtZW50TG9hZGVyKCkpIHsKKyAgICAgICAgY29uc3QgUmVzb3VyY2VSZXF1ZXN0
JiBvcmlnaW5hbFJlcXVlc3QgPSBtX2ZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKS0+
b3JpZ2luYWxSZXF1ZXN0KCk7CisgICAgICAgIGlmIChyZXF1ZXN0LnRva2VuKCkuaXNOdWxsKCkg
JiYgIW9yaWdpbmFsUmVxdWVzdC50b2tlbigpLmlzTnVsbCgpKQorICAgICAgICAgICAgbmV3UmVx
dWVzdC5zZXRUb2tlbihvcmlnaW5hbFJlcXVlc3QudG9rZW4oKSk7CisgICAgfQorCisgICAgLy8g
RklYTUU6IFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHNoYXJlZC4KKyAgICBSZWZQdHI8RG9jdW1l
bnRMb2FkZXI+IGxvYWRlciA9IERvY3VtZW50TG9hZGVyOjpjcmVhdGUobmV3UmVxdWVzdCwgc3Vi
c3RpdHV0ZURhdGEpOworICAgIGlmIChzdWJzdGl0dXRlRGF0YS5pc1ZhbGlkKCkpCisgICAgICAg
IGxvYWRlci0+c2V0RGVmZXJNYWluUmVzb3VyY2VEYXRhTG9hZChmYWxzZSk7CisgICAgcmV0dXJu
IGxvYWRlci5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5
OjpmcmFtZUxvYWRlckRlc3Ryb3llZCgpCit7CisgICAgZGVsZXRlIHRoaXM7Cit9CisKK3ZvaWQg
RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojp0cmFuc2l0aW9uVG9Db21taXR0ZWRGb3JOZXdQ
YWdlKCkKK3sKKyAgICBtX2NhbmNlbExvYWRPbk5leHREYXRhID0gZmFsc2U7CisKKyAgICAvLyBJ
biBGcmFtZTo6Y3JlYXRlVmlldywgRnJhbWUncyBGcmFtZVZpZXcgb2JqZWN0IGlzIHNldCB0byAw
IGFuZCAgcmVjcmVhdGVkLgorICAgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBhdG9taWMsIGFu
ZCBhbiBhdHRlbXB0IHRvIGJsaXQgY29udGVudHMgbWlnaHQgaGFwcGVuCisgICAgLy8gaW4gdGhl
IGJhY2tpbmcgc3RvcmUgZnJvbSBhbm90aGVyIHRocmVhZCAoc2VlIEJhY2tpbmdTdG9yZVByaXZh
dGU6OmJsaXRDb250ZW50cyBtZXRob2QpLAorICAgIC8vIHNvIHdlIHN1c3BlbmQgYW5kIHJlc3Vt
ZSBzY3JlZW4gdXBkYXRlIHRvIG1ha2Ugc3VyZSB3ZSBkbyBub3QgZ2V0IGEgaW52YWxpZCBGcmFt
ZVZpZXcKKyAgICAvLyBzdGF0ZS4KKyAgICBCYWNraW5nU3RvcmVDbGllbnQqIGJhY2tpbmdTdG9y
ZUNsaWVudEZvckZyYW1lID0gbV93ZWJQYWdlUHJpdmF0ZS0+YmFja2luZ1N0b3JlQ2xpZW50Rm9y
RnJhbWUobV9mcmFtZSk7CisgICAgaWYgKGJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKQorICAg
ICAgICBiYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZS0+YmFja2luZ1N0b3JlKCktPmQtPnN1c3Bl
bmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCk7CisKKyAgICAvLyBXZSBhcmUgbmF2aWdh
dGluZyBhd2F5IGZyb20gdGhpcyBkb2N1bWVudCwgc28gY2xlYW4gdXAgYW55IGZvb3RwcmludCB3
ZSBtaWdodCBoYXZlLgorICAgIGlmIChtX2ZyYW1lLT5kb2N1bWVudCgpKQorICAgICAgICBtX3dl
YlBhZ2VQcml2YXRlLT5jbGVhckRvY3VtZW50RGF0YShtX2ZyYW1lLT5kb2N1bWVudCgpKTsKKwor
ICAgIENvbG9yIGJhY2tncm91bmRDb2xvcihtX3dlYlBhZ2VQcml2YXRlLT5tX3dlYlNldHRpbmdz
LT5iYWNrZ3JvdW5kQ29sb3IoKSk7CisKKyAgICBtX2ZyYW1lLT5jcmVhdGVWaWV3KG1fd2ViUGFn
ZVByaXZhdGUtPnZpZXdwb3J0U2l6ZSgpLCAgICAgLyp2aWV3cG9ydCovCisgICAgICAgICAgICAg
ICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IsICAgICAgICAgICAgICAgICAgLypiYWNrZ3JvdW5k
IGNvbG9yKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvci5oYXNBbHBo
YSgpLCAgICAgICAvKmlzIHRyYW5zcGFyZW50Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1f
d2ViUGFnZVByaXZhdGUtPmFjdHVhbFZpc2libGVTaXplKCksLypmaXhlZCByZXBvcnRlZCBzaXpl
Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPmZpeGVkTGF5b3V0
U2l6ZSgpLCAgLypmaXhlZCBsYXlvdXQgc2l6ZSovCisgICAgICAgICAgICAgICAgICAgICAgICBt
X3dlYlBhZ2VQcml2YXRlLT51c2VGaXhlZExheW91dCgpLCAgIC8qdXNlIGZpeGVkIGxheW91dCAq
LworICAgICAgICAgICAgICAgICAgICAgICAgU2Nyb2xsYmFyQWx3YXlzT2ZmLCAgICAgICAgICAg
ICAgIC8qaG9yIG1vZGUqLworICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC8qbG9jayB0aGUgbW9kZSovCisgICAgICAgICAgICAgICAgICAg
ICAgICBTY3JvbGxiYXJBbHdheXNPZmYsICAgICAgICAgICAgICAgLyp2ZXIgbW9kZSovCisgICAg
ICAgICAgICAgICAgICAgICAgICB0cnVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyps
b2NrIHRoZSBtb2RlKi8KKworICAgIGlmIChiYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZSkKKyAg
ICAgICAgYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUtPmJhY2tpbmdTdG9yZSgpLT5kLT5yZXN1
bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKEJhY2tpbmdTdG9yZTo6Tm9uZSk7CisgICAg
bV9mcmFtZS0+dmlldygpLT51cGRhdGVDYW5IYXZlU2Nyb2xsYmFycygpOworCisgICAgaWYgKGlz
TWFpbkZyYW1lKCkpIHsKKyAgICAgICAgLy8gU2luY2UgdGhlIG1haW5mcmFtZSBoYXMgYSB0aWxl
ZCBiYWNraW5nc3RvcmUgcmVxdWVzdCB0byByZWNlaXZlIGFsbCB1cGRhdGUKKyAgICAgICAgLy8g
cmVjdHMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCB3aGljaCBqdXN0IHNlbmRzIHVwZGF0ZSByZWN0
cyBmb3IgY3VycmVudGx5CisgICAgICAgIC8vIHZpc2libGUgdmlld3BvcnQuCisgICAgICAgIG1f
ZnJhbWUtPnZpZXcoKS0+c2V0UGFpbnRzRW50aXJlQ29udGVudHModHJ1ZSk7CisgICAgfQorfQor
CitTdHJpbmcgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojp1c2VyQWdlbnQoY29uc3QgS1VS
TCYpCit7CisgICAgcmV0dXJuIG1fd2ViUGFnZVByaXZhdGUtPm1fd2ViU2V0dGluZ3MtPnVzZXJB
Z2VudFN0cmluZygpOworfQorCitib29sIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y2Fu
SGFuZGxlUmVxdWVzdChjb25zdCBSZXNvdXJjZVJlcXVlc3QmKSBjb25zdAoreworICAgIC8vIEZJ
WE1FOiBTdHViLgorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEZyYW1lTG9hZGVyQ2xpZW50
QmxhY2tCZXJyeTo6Y2FuU2hvd01JTUVUeXBlKGNvbnN0IFN0cmluZyYgbWltZVR5cGVJbikgY29u
c3QKK3sKKyAgICAvLyBHZXQgbm9ybWFsaXplZCB0eXBlLgorICAgIFN0cmluZyBtaW1lVHlwZSA9
IEJsYWNrQmVycnk6OldlYktpdDo6V2ViU2V0dGluZ3M6OmdldE5vcm1hbGl6ZWRNSU1FVHlwZSht
aW1lVHlwZUluKTsKKworICAgIC8vIEZJWE1FOiBTZWVtcyBubyBvdGhlciBwb3J0IGNoZWNrcyBl
bXB0eSBNSU1FIHR5cGUgaW4gdGhpcyBmdW5jdGlvbi4gU2hvdWxkIHdlIGRvIHRoYXQ/CisgICAg
cmV0dXJuIE1JTUVUeXBlUmVnaXN0cnk6OmlzU3VwcG9ydGVkSW1hZ2VNSU1FVHlwZShtaW1lVHlw
ZSkgfHwgTUlNRVR5cGVSZWdpc3RyeTo6aXNTdXBwb3J0ZWROb25JbWFnZU1JTUVUeXBlKG1pbWVU
eXBlKQorICAgICAgICB8fCBNSU1FVHlwZVJlZ2lzdHJ5Ojppc1N1cHBvcnRlZE1lZGlhTUlNRVR5
cGUobWltZVR5cGUpIHx8IEJsYWNrQmVycnk6OldlYktpdDo6V2ViU2V0dGluZ3M6OmlzU3VwcG9y
dGVkT2JqZWN0TUlNRVR5cGUobWltZVR5cGUpCisgICAgICAgIHx8IChtaW1lVHlwZSA9PSAiYXBw
bGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTsKK30KKworYm9vbCBGcmFtZUxvYWRlckNsaWVu
dEJsYWNrQmVycnk6OmNhblNob3dNSU1FVHlwZUFzSFRNTChjb25zdCBTdHJpbmcmKSBjb25zdAor
eworICAgIC8vIEZJWE1FOiBTdHViLgorICAgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgRnJh
bWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojppc01haW5GcmFtZSgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fZnJhbWUgPT0gbV93ZWJQYWdlUHJpdmF0ZS0+bV9tYWluRnJhbWU7Cit9CisKK3ZvaWQg
RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZFN0YXJ0UHJvdmlzaW9uYWxM
b2FkKCkKK3sKKyAgICBpZiAoaXNNYWluRnJhbWUoKSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0
ZS0+c2V0TG9hZFN0YXRlKFdlYlBhZ2VQcml2YXRlOjpQcm92aXNpb25hbCk7CisKKyAgICBpZiAo
bV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZSkKKyAgICAgICAgbV93ZWJQYWdlUHJp
dmF0ZS0+bV9kdW1wUmVuZGVyVHJlZS0+ZGlkU3RhcnRQcm92aXNpb25hbExvYWRGb3JGcmFtZSht
X2ZyYW1lKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNo
RGlkUmVjZWl2ZVJlc3BvbnNlKERvY3VtZW50TG9hZGVyKiwgdW5zaWduZWQgbG9uZyBpZGVudGlm
aWVyLCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSkKK3sKKyAgICBpZiAobV93ZWJQ
YWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+
bV9kdW1wUmVuZGVyVHJlZS0+ZGlkUmVjZWl2ZVJlc3BvbnNlRm9yRnJhbWUobV9mcmFtZSwgcmVz
cG9uc2UpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hE
aWRSZWNlaXZlVGl0bGUoY29uc3QgU3RyaW5nV2l0aERpcmVjdGlvbiYgdGl0bGUpCit7CisgICAg
aWYgKGlzTWFpbkZyYW1lKCkpCisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5z
ZXRQYWdlVGl0bGUodGl0bGUuc3RyaW5nKCkuY2hhcmFjdGVycygpLCB0aXRsZS5zdHJpbmcoKS5s
ZW5ndGgoKSk7CisKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZSkK
KyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZS0+ZGlkUmVjZWl2ZVRp
dGxlRm9yRnJhbWUodGl0bGUuc3RyaW5nKCksIG1fZnJhbWUpOworfQorCit2b2lkIEZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeTo6c2V0VGl0bGUoY29uc3QgU3RyaW5nV2l0aERpcmVjdGlvbiYg
Lyp0aXRsZSovLCBjb25zdCBLVVJMJiAvKnVybCovKQoreworICAgIC8vIFVzZWQgYnkgQXBwbGUg
V2ViS2l0IHRvIHVwZGF0ZSB0aGUgdGl0bGUgb2YgYW4gZXhpc3RpbmcgaGlzdG9yeSBpdGVtLgor
ICAgIC8vIFF0V2ViS2l0IGRvZXNuJ3QgYWNjb21vZGF0ZSB0aGlzIG9uIGhpc3RvcnkgaXRlbXMu
IElmIGl0IGV2ZXIgZG9lcywKKyAgICAvLyBpdCBzaG91bGQgYmUgcHJpdmF0ZUJyb3dzaW5nLWF3
YXJlLiBGb3Igbm93LCB3ZSBhcmUganVzdCBwYXNzaW5nCisgICAgLy8gZ2xvYmFsaGlzdG9yeSBs
YXlvdXQgdGVzdHMuCisgICAgLy8gRklYTUU6IFVzZSBkaXJlY3Rpb24gb2YgdGl0bGUuCisgICAg
bm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6
OmRpc3BhdGNoRGlkQ29tbWl0TG9hZCgpCit7CisgICAgLy8gRklYTUU6IERvIHdlIG5lZWQgdG8g
ZmluZCBhIHJlcGxhY2VtZW50IGZvciBtX2ZyYW1lLT5kb2N1bWVudCgpLT5zZXRFeHRyYUxheW91
dERlbGF5KDI1MCk7PworCisgICAgU2VjdXJpdHlPcmlnaW4qIHNlY3VyaXR5T3JpZ2luID0gbV9m
cmFtZS0+ZG9jdW1lbnQoKS0+c2VjdXJpdHlPcmlnaW4oKTsKKyAgICBCbGFja0JlcnJ5OjpXZWJL
aXQ6OldlYlNldHRpbmdzKiB3ZWJTZXR0aW5ncyA9IG1fd2ViUGFnZVByaXZhdGUtPm1fd2ViU2V0
dGluZ3M7CisKKyAgICAvLyBXaGl0ZWxpc3QgYWxsIGtub3duIHByb3RvY29scyBpZiBCcm93c2Vy
RmllbGQyIHJlcXVpcmVzIHVucmVzdHJpY3RlZCByZXF1ZXN0cy4KKyAgICBpZiAod2ViU2V0dGlu
Z3MtPmFsbG93Q3Jvc3NTaXRlUmVxdWVzdHMoKSAmJiAhc2VjdXJpdHlPcmlnaW4tPnByb3RvY29s
KCkuaXNFbXB0eSgpKSB7CisgICAgICAgIFNlY3VyaXR5UG9saWN5OjphZGRPcmlnaW5BY2Nlc3NX
aGl0ZWxpc3RFbnRyeSgqc2VjdXJpdHlPcmlnaW4sIFN0cmluZygiYWJvdXQiKSwgIiIsIHRydWUp
OworICAgICAgICBTZWN1cml0eVBvbGljeTo6YWRkT3JpZ2luQWNjZXNzV2hpdGVsaXN0RW50cnko
KnNlY3VyaXR5T3JpZ2luLCBTdHJpbmcoImRhdGEiKSwgU3RyaW5nKCIiKSwgdHJ1ZSk7CisgICAg
ICAgIFNlY3VyaXR5UG9saWN5OjphZGRPcmlnaW5BY2Nlc3NXaGl0ZWxpc3RFbnRyeSgqc2VjdXJp
dHlPcmlnaW4sIFN0cmluZygiZmlsZSIpLCBTdHJpbmcoIiIpLCB0cnVlKTsKKyAgICAgICAgU2Vj
dXJpdHlQb2xpY3k6OmFkZE9yaWdpbkFjY2Vzc1doaXRlbGlzdEVudHJ5KCpzZWN1cml0eU9yaWdp
biwgU3RyaW5nKCJodHRwIiksIFN0cmluZygiIiksIHRydWUpOworICAgICAgICBTZWN1cml0eVBv
bGljeTo6YWRkT3JpZ2luQWNjZXNzV2hpdGVsaXN0RW50cnkoKnNlY3VyaXR5T3JpZ2luLCBTdHJp
bmcoImh0dHBzIiksIFN0cmluZygiIiksIHRydWUpOworICAgICAgICBTZWN1cml0eVBvbGljeTo6
YWRkT3JpZ2luQWNjZXNzV2hpdGVsaXN0RW50cnkoKnNlY3VyaXR5T3JpZ2luLCBTdHJpbmcoImph
dmFzY3JpcHQiKSwgU3RyaW5nKCIiKSwgdHJ1ZSk7CisgICAgICAgIFNlY3VyaXR5UG9saWN5Ojph
ZGRPcmlnaW5BY2Nlc3NXaGl0ZWxpc3RFbnRyeSgqc2VjdXJpdHlPcmlnaW4sIFN0cmluZygibG9j
YWwiKSwgU3RyaW5nKCIiKSwgdHJ1ZSk7CisgICAgICAgIFNlY3VyaXR5UG9saWN5OjphZGRPcmln
aW5BY2Nlc3NXaGl0ZWxpc3RFbnRyeSgqc2VjdXJpdHlPcmlnaW4sIFN0cmluZygibWFpbHRvIiks
IFN0cmluZygiIiksIHRydWUpOworICAgICAgICBTZWN1cml0eVBvbGljeTo6YWRkT3JpZ2luQWNj
ZXNzV2hpdGVsaXN0RW50cnkoKnNlY3VyaXR5T3JpZ2luLCBTdHJpbmcoInBhdHRlcm4iKSwgU3Ry
aW5nKCIiKSwgdHJ1ZSk7CisgICAgICAgIFNlY3VyaXR5UG9saWN5OjphZGRPcmlnaW5BY2Nlc3NX
aGl0ZWxpc3RFbnRyeSgqc2VjdXJpdHlPcmlnaW4sIFN0cmluZygicnRjcCIpLCBTdHJpbmcoIiIp
LCB0cnVlKTsKKyAgICAgICAgU2VjdXJpdHlQb2xpY3k6OmFkZE9yaWdpbkFjY2Vzc1doaXRlbGlz
dEVudHJ5KCpzZWN1cml0eU9yaWdpbiwgU3RyaW5nKCJydHAiKSwgU3RyaW5nKCIiKSwgdHJ1ZSk7
CisgICAgICAgIFNlY3VyaXR5UG9saWN5OjphZGRPcmlnaW5BY2Nlc3NXaGl0ZWxpc3RFbnRyeSgq
c2VjdXJpdHlPcmlnaW4sIFN0cmluZygicnRzcCIpLCBTdHJpbmcoIiIpLCB0cnVlKTsKKyAgICAg
ICAgU2VjdXJpdHlQb2xpY3k6OmFkZE9yaWdpbkFjY2Vzc1doaXRlbGlzdEVudHJ5KCpzZWN1cml0
eU9yaWdpbiwgU3RyaW5nKCJzbXMiKSwgU3RyaW5nKCIiKSwgdHJ1ZSk7CisgICAgICAgIFNlY3Vy
aXR5UG9saWN5OjphZGRPcmlnaW5BY2Nlc3NXaGl0ZWxpc3RFbnRyeSgqc2VjdXJpdHlPcmlnaW4s
IFN0cmluZygidGVsIiksIFN0cmluZygiIiksIHRydWUpOworCisgICAgICAgIC8vIFdlIGFsc28g
d2FudCB0byBiZSBhYmxlIHRvIGhhbmRsZSB1bmtub3duIHByb3RvY29scyBpbiB0aGUgY2xpZW50
LgorICAgICAgICBzZWN1cml0eU9yaWdpbi0+Z3JhbnRVbml2ZXJzYWxBY2Nlc3MoKTsKKyAgICB9
CisKKyAgICBpZiAoaXNNYWluRnJhbWUoKSkgeworICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5z
ZXRMb2FkU3RhdGUoV2ViUGFnZVByaXZhdGU6OkNvbW1pdHRlZCk7CisKKyAgICAgICAgU3RyaW5n
IG9yaWdpbmFsVXJsID0gbV9mcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCktPm9yaWdp
bmFsUmVxdWVzdCgpLnVybCgpLnN0cmluZygpOworICAgICAgICBTdHJpbmcgdXJsID0gbV9mcmFt
ZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCktPnJlcXVlc3QoKS51cmwoKS5zdHJpbmcoKTsK
KyAgICAgICAgU3RyaW5nIHRva2VuID0gbV9mcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVy
KCktPnJlcXVlc3QoKS50b2tlbigpOworCisgICAgICAgIC8vIE5vdGlmeSB0aGUgY2xpZW50IHRo
YXQgdGhlIGxvYWQgc3VjY2VlZGVkIG9yIGZhaWxlZCAoaWYgaXQgZmFpbGVkLCB0aGlzCisgICAg
ICAgIC8vIGlzIGFjdHVhbGx5IGNvbW1pdHRpbmcgdGhlIGVycm9yIHBhZ2UsIHdoaWNoIHdhcyBz
ZXQgdGhyb3VnaAorICAgICAgICAvLyBTdWJzdGl0dXRlRGF0YSBpbiBkaXNwYXRjaERpZEZhaWxQ
cm92aXNpb25hbExvYWQpCisgICAgICAgIGlmIChtX2xvYWRpbmdFcnJvclBhZ2UpIHsKKyAgICAg
ICAgICAgIG1fbG9hZGluZ0Vycm9yUGFnZSA9IGZhbHNlOworICAgICAgICAgICAgbV93ZWJQYWdl
UHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlmeUxvYWRGYWlsZWRCZWZvcmVDb21taXQoCisgICAgICAg
ICAgICAgICAgb3JpZ2luYWxVcmwuY2hhcmFjdGVycygpLCBvcmlnaW5hbFVybC5sZW5ndGgoKSwK
KyAgICAgICAgICAgICAgICAgICAgdXJsLmNoYXJhY3RlcnMoKSwgdXJsLmxlbmd0aCgpLCB0b2tl
bi5jaGFyYWN0ZXJzKCksIHRva2VuLmxlbmd0aCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5ub3RpZnlMb2FkQ29tbWl0dGVkKAor
ICAgICAgICAgICAgICAgIG9yaWdpbmFsVXJsLmNoYXJhY3RlcnMoKSwgb3JpZ2luYWxVcmwubGVu
Z3RoKCksCisgICAgICAgICAgICAgICAgICAgIHVybC5jaGFyYWN0ZXJzKCksIHVybC5sZW5ndGgo
KSwgdG9rZW4uY2hhcmFjdGVycygpLCB0b2tlbi5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZSkKKyAgICAgICAg
bV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZS0+ZGlkQ29tbWl0TG9hZEZvckZyYW1l
KG1fZnJhbWUpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0
Y2hEaWRIYW5kbGVPbmxvYWRFdmVudHMoKQoreworICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xp
ZW50LT5ub3RpZnlEb2N1bWVudE9uTG9hZCgpOworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5t
X2R1bXBSZW5kZXJUcmVlKQorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJU
cmVlLT5kaWRIYW5kbGVPbmxvYWRFdmVudHNGb3JGcmFtZShtX2ZyYW1lKTsKK30KKwordm9pZCBG
cmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkRmluaXNoTG9hZCgpCit7Cisg
ICAgZGlkRmluaXNoT3JGYWlsTG9hZGluZyhSZXNvdXJjZUVycm9yKCkpOworCisgICAgaWYgKG1f
d2ViUGFnZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUpCisgICAgICAgIG1fd2ViUGFnZVByaXZh
dGUtPm1fZHVtcFJlbmRlclRyZWUtPmRpZEZpbmlzaExvYWRGb3JGcmFtZShtX2ZyYW1lKTsKKwor
ICAgIGlmICghaXNNYWluRnJhbWUoKSB8fCBtX3dlYlBhZ2VQcml2YXRlLT5tX3dlYlNldHRpbmdz
LT5pc0VtYWlsTW9kZSgpCisgICAgICAgIHx8ICFtX2ZyYW1lLT5kb2N1bWVudCgpIHx8ICFtX2Zy
YW1lLT5kb2N1bWVudCgpLT5oZWFkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEhUTUxIZWFk
RWxlbWVudCogaGVhZEVsZW1lbnQgPSBtX2ZyYW1lLT5kb2N1bWVudCgpLT5oZWFkKCk7CisgICAg
Ly8gRklYTUU6IEhhbmRsZSBOT1NDUklQVCBzcGVjaWFsIGNhc2U/CisKKyAgICAvLyBQcm9jZXNz
IGRvY3VtZW50IG1ldGFkYXRhLgorICAgIFJlZlB0cjxOb2RlTGlzdD4gbm9kZUxpc3QgPSBoZWFk
RWxlbWVudC0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGEiKTsKKyAgICB1bnNpZ25lZCBpbnQg
c2l6ZSA9IG5vZGVMaXN0LT5sZW5ndGgoKTsKKyAgICBTY29wZUFycmF5PFdlYlN0cmluZz4gaGVh
ZGVyczsKKworICAgIC8vIFRoaXMgbWF5IGFsbG9jYXRlIG1vcmUgc3BhY2UgdGhhbiBuZWVkZWQg
c2luY2Ugbm90IGFsbCBtZXRhIGVsZW1lbnRzIHdpbGwgYmUgaHR0cC1lcXVpdi4KKyAgICBoZWFk
ZXJzLnJlc2V0KG5ldyBXZWJTdHJpbmdbMiAqIHNpemVdKTsKKyAgICB1bnNpZ25lZCBoZWFkZXJz
TGVuZ3RoID0gMDsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsK
KyAgICAgICAgSFRNTE1ldGFFbGVtZW50KiBtZXRhRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxN
ZXRhRWxlbWVudCo+KG5vZGVMaXN0LT5pdGVtKGkpKTsKKyAgICAgICAgaWYgKFdURjo6ZXF1YWxJ
Z25vcmluZ0Nhc2UobWV0YUVsZW1lbnQtPm5hbWUoKSwgImFwcGxlLW1vYmlsZS13ZWItYXBwLWNh
cGFibGUiKQorICAgICAgICAgICAgJiYgV1RGOjplcXVhbElnbm9yaW5nQ2FzZShtZXRhRWxlbWVu
dC0+Y29udGVudCgpLnN0cmlwV2hpdGVTcGFjZSgpLCAieWVzIikpCisgICAgICAgICAgICBtX3dl
YlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+c2V0V2ViQXBwQ2FwYWJsZSgpOworICAgICAgICBlbHNl
IHsKKyAgICAgICAgICAgIFN0cmluZyBodHRwRXF1aXYgPSBtZXRhRWxlbWVudC0+aHR0cEVxdWl2
KCkuc3RyaXBXaGl0ZVNwYWNlKCk7CisgICAgICAgICAgICBTdHJpbmcgY29udGVudCA9IG1ldGFF
bGVtZW50LT5jb250ZW50KCkuc3RyaXBXaGl0ZVNwYWNlKCk7CisKKyAgICAgICAgICAgIGlmICgh
aHR0cEVxdWl2LmlzTnVsbCgpICYmICFjb250ZW50LmlzTnVsbCgpKSB7CisgICAgICAgICAgICAg
ICAgaGVhZGVyc1toZWFkZXJzTGVuZ3RoKytdID0gaHR0cEVxdWl2OworICAgICAgICAgICAgICAg
IGhlYWRlcnNbaGVhZGVyc0xlbmd0aCsrXSA9IGNvbnRlbnQ7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICBpZiAoaGVhZGVyc0xlbmd0aCA+IDApCisgICAgICAgIG1fd2Vi
UGFnZVByaXZhdGUtPm1fY2xpZW50LT5zZXRNZXRhSGVhZGVycyhoZWFkZXJzLCBoZWFkZXJzTGVu
Z3RoKTsKKworICAgIG5vZGVMaXN0ID0gaGVhZEVsZW1lbnQtPmdldEVsZW1lbnRzQnlUYWdOYW1l
KCJsaW5rIik7CisgICAgc2l6ZSA9IG5vZGVMaXN0LT5sZW5ndGgoKTsKKworICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgSFRNTExpbmtFbGVtZW50KiBs
aW5rRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVudCo+KG5vZGVMaXN0LT5pdGVt
KGkpKTsKKyAgICAgICAgU3RyaW5nIGhyZWYgPSBsaW5rRWxlbWVudC0+aHJlZigpLnN0cmluZygp
OworICAgICAgICBpZiAoIWhyZWYuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBTdHJpbmcgdGl0
bGUgPSBsaW5rRWxlbWVudC0+dGl0bGUoKTsKKworICAgICAgICAgICAgaWYgKFdURjo6ZXF1YWxJ
Z25vcmluZ0Nhc2UobGlua0VsZW1lbnQtPnJlbCgpLCAiYXBwbGUtdG91Y2gtaWNvbiIpKQorICAg
ICAgICAgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5zZXRMYXJnZUljb24oaHJl
Zi5sYXRpbjEoKS5kYXRhKCkpOworICAgICAgICAgICAgZWxzZSBpZiAoV1RGOjplcXVhbElnbm9y
aW5nQ2FzZShsaW5rRWxlbWVudC0+cmVsKCksICJzZWFyY2giKSkgeworICAgICAgICAgICAgICAg
IGlmIChXVEY6OmVxdWFsSWdub3JpbmdDYXNlKGxpbmtFbGVtZW50LT50eXBlKCksICJhcHBsaWNh
dGlvbi9vcGVuc2VhcmNoZGVzY3JpcHRpb24reG1sIikpCisgICAgICAgICAgICAgICAgICAgIG1f
d2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5zZXRTZWFyY2hQcm92aWRlckRldGFpbHModGl0bGUu
dXRmOCgpLmRhdGEoKSwgaHJlZi51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBp
ZiAoV1RGOjplcXVhbElnbm9yaW5nQ2FzZShsaW5rRWxlbWVudC0+cmVsKCksICJhbHRlcm5hdGUi
KQorICAgICAgICAgICAgICAgICYmIChXVEY6OmVxdWFsSWdub3JpbmdDYXNlKGxpbmtFbGVtZW50
LT50eXBlKCksICJhcHBsaWNhdGlvbi9yc3MreG1sIikKKyAgICAgICAgICAgICAgICB8fCBXVEY6
OmVxdWFsSWdub3JpbmdDYXNlKGxpbmtFbGVtZW50LT50eXBlKCksICJhcHBsaWNhdGlvbi9hdG9t
K3htbCIpKSkKKyAgICAgICAgICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+c2V0
QWx0ZXJuYXRlRmVlZERldGFpbHModGl0bGUudXRmOCgpLmRhdGEoKSwgaHJlZi51dGY4KCkuZGF0
YSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNr
QmVycnk6OmRpc3BhdGNoRGlkRmluaXNoRG9jdW1lbnRMb2FkKCkKK3sKKyAgICBpZiAobV93ZWJQ
YWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+
bV9kdW1wUmVuZGVyVHJlZS0+ZGlkRmluaXNoRG9jdW1lbnRMb2FkRm9yRnJhbWUobV9mcmFtZSk7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50Qmxh
Y2tCZXJyeTo6ZGlzcGF0Y2hEaWRGYWlsTG9hZChjb25zdCBSZXNvdXJjZUVycm9yJiBlcnJvcikK
K3sKKyAgICBkaWRGaW5pc2hPckZhaWxMb2FkaW5nKGVycm9yKTsKKyAgICBpZiAobV93ZWJQYWdl
UHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9k
dW1wUmVuZGVyVHJlZS0+ZGlkRmFpbExvYWRGb3JGcmFtZShtX2ZyYW1lKTsKK30KKwordm9pZCBG
cmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpZEZpbmlzaE9yRmFpbExvYWRpbmcoY29uc3Qg
UmVzb3VyY2VFcnJvciYgZXJyb3IpCit7CisgICAgLy8gRklYTUU6IERvIHdlIG5lZWQgdG8gZmlu
ZCBhIHJlcGxhY2VtZW50IGZvciBtX2ZyYW1lLT5kb2N1bWVudCgpLT5zZXRFeHRyYUxheW91dERl
bGF5KDApOz8KKworICAgIC8vIElmIHdlIGhhdmUgZmluaXNoZWQgbG9hZGluZyBhIHBhZ2UgdGhy
b3VnaCBoaXN0b3J5IG5hdmlnYXRpb24sIGFueQorICAgIC8vIGF0dGVtcHQgdG8gZ28gYmFjayB0
byB0aGF0IHBhZ2UgdGhyb3VnaCBhbiBhdXRvbWF0aWMgcmVkaXJlY3Qgc2hvdWxkIGJlCisgICAg
Ly8gZGVuaWVkIHRvIGF2b2lkIHJlZGlyZWN0IGxvb3BzLiBTbyBzYXZlIHRoZSBoaXN0b3J5IG5h
dmlnYXRpb24gdXJscyB0bworICAgIC8vIGNoZWNrIGxhdGVyLiAoSWYgdGhpcyB3YXMgbm90IGEg
aGlzdG9yeSBuYXZpZ2F0aW9uLAorICAgIC8vIG1faGlzdG9yeU5hdmlnYXRpb25Tb3VyY2VVUkxz
IHdpbGwgYmUgZW1wdHksIGFuZCB3ZSBzaG91bGQgc2F2ZSB0aGF0CisgICAgLy8gdG9vLikKKyAg
ICBtX3JlZGlyZWN0VVJMc1RvU2tpcER1ZVRvSGlzdG9yeU5hdmlnYXRpb24uc3dhcChtX2hpc3Rv
cnlOYXZpZ2F0aW9uU291cmNlVVJMcyk7CisKKyAgICAvLyBIaXN0b3J5IG5hdmlnYXRpb24gaXMg
ZmluaXNoZWQgc28gY2xlYXIgdGhlIGhpc3RvcnkgbmF2aWdhdGlvbiB1cmwuCisgICAgbV9oaXN0
b3J5TmF2aWdhdGlvblNvdXJjZVVSTHMuY2xlYXIoKTsKKworICAgIGlmIChpc01haW5GcmFtZSgp
KSB7CisgICAgICAgIG1fbG9hZEVycm9yID0gZXJyb3I7CisgICAgICAgIG1fd2ViUGFnZVByaXZh
dGUtPnNldExvYWRTdGF0ZShlcnJvci5pc051bGwoKSA/IFdlYlBhZ2VQcml2YXRlOjpGaW5pc2hl
ZCA6IFdlYlBhZ2VQcml2YXRlOjpGYWlsZWQpOworICAgIH0KK30KKwordm9pZCBGcmFtZUxvYWRl
ckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkRmFpbFByb3Zpc2lvbmFsTG9hZChjb25zdCBS
ZXNvdXJjZUVycm9yJiBlcnJvcikKK3sKKyAgICBpZiAoaXNNYWluRnJhbWUoKSkgeworICAgICAg
ICBtX2xvYWRFcnJvciA9IGVycm9yOworICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5zZXRMb2Fk
U3RhdGUoV2ViUGFnZVByaXZhdGU6OkZhaWxlZCk7CisKKyAgICAgICAgaWYgKGVycm9yLmRvbWFp
bigpID09IFJlc291cmNlRXJyb3I6OnBsYXRmb3JtRXJyb3JEb21haW4KKyAgICAgICAgICAgICAg
ICAmJiAoZXJyb3IuZXJyb3JDb2RlKCkgPT0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkZpbHRlclN0
cmVhbTo6U3RhdHVzRXJyb3JBbHJlYWR5SGFuZGxlZCkpIHsKKyAgICAgICAgICAgIC8vIEVycm9y
IGhhcyBhbHJlYWR5IGJlZW4gZGlzcGxheWVkIGJ5IGNsaWVudC4KKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnJvci5kb21haW4oKS5pc0VtcHR5KCkgJiYg
IWVycm9yLmVycm9yQ29kZSgpICYmIGVycm9yLmZhaWxpbmdVUkwoKS5pc0VtcHR5KCkgJiYgZXJy
b3IubG9jYWxpemVkRGVzY3JpcHRpb24oKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIERv
bid0IHRyeSB0byBkaXNwbGF5IGVtcHR5IGVycm9ycyByZXR1cm5lZCBmcm9tIHRoZSB1bmltcGxl
bWVudGVkIGVycm9yIGZ1bmN0aW9ucyBpbiBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkgLSB0
aGVyZSdzIG5vdGhpbmcgdG8gZGlzcGxheSBhbnl3YXkuCisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVy
VHJlZSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZS0+ZGlkRmFp
bFByb3Zpc2lvbmFsTG9hZEZvckZyYW1lKG1fZnJhbWUpOworCisgICAgaWYgKCFpc01haW5GcmFt
ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTdHJpbmcgZXJyb3JQYWdlID0gbV93ZWJQYWdl
UHJpdmF0ZS0+bV9jbGllbnQtPmdldEVycm9yUGFnZShlcnJvci5lcnJvckNvZGUoKQorICAgICAg
ICAgICAgLCBlcnJvci5sb2NhbGl6ZWREZXNjcmlwdGlvbigpLmlzRW1wdHkoKSA/ICIiIDogZXJy
b3IubG9jYWxpemVkRGVzY3JpcHRpb24oKS51dGY4KCkuZGF0YSgpCisgICAgICAgICAgICAsIGVy
cm9yLmZhaWxpbmdVUkwoKS5pc0VtcHR5KCkgPyAiIiA6IGVycm9yLmZhaWxpbmdVUkwoKS51dGY4
KCkuZGF0YSgpKTsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSdyZSBzdGlsbCBpbiB0aGUgcHJvdmlz
aW9uYWxMb2FkIHN0YXRlIC0gZ2V0RXJyb3JQYWdlIHJ1bnMgYQorICAgIC8vIG5lc3RlZCBldmVu
dCBsb29wIHdoaWxlIGl0J3Mgd2FpdGluZyBmb3IgY2xpZW50IHJlc291cmNlcyB0byBsb2FkIHNv
CisgICAgLy8gdGhlcmUncyBhIHNtYWxsIHdpbmRvdyBmb3IgdGhlIHVzZXIgdG8gaGl0IHN0b3Au
CisgICAgaWYgKG1fZnJhbWUtPmxvYWRlcigpLT5wcm92aXNpb25hbERvY3VtZW50TG9hZGVyKCkp
IHsKKyAgICAgICAgU3Vic3RpdHV0ZURhdGEgZXJyb3JEYXRhKHV0ZjhCdWZmZXIoZXJyb3JQYWdl
KSwgInRleHQvaHRtbCIsICJ1dGYtOCIsIEtVUkwoS1VSTCgpLCBlcnJvci5mYWlsaW5nVVJMKCkp
KTsKKworICAgICAgICBSZXNvdXJjZVJlcXVlc3Qgb3JpZ2luYWxSZXF1ZXN0ID0gbV9mcmFtZS0+
bG9hZGVyKCktPnByb3Zpc2lvbmFsRG9jdW1lbnRMb2FkZXIoKS0+b3JpZ2luYWxSZXF1ZXN0KCk7
CisKKyAgICAgICAgLy8gTG9hZGluZyB1c2luZyBTdWJzdGl0dXRlRGF0YSB3aWxsIHJlcGxhY2Ug
dGhlIG9yaWdpbmFsIHJlcXVlc3Qgd2l0aCBvdXIKKyAgICAgICAgLy8gZXJyb3IgZGF0YS4gVGhp
cyBtdXN0IGJlIGRvbmUgd2l0aGluIGRpc3BhdGNoRGlkRmFpbFByb3Zpc2lvbmFsTG9hZCwKKyAg
ICAgICAgLy8gYW5kIGRvIE5PVCBjYWxsIHN0b3BBbGxMb2FkZXJzIGZpcnN0LCBiZWNhdXNlIHRo
ZSBsb2FkZXIgY2hlY2tzIHRoZQorICAgICAgICAvLyBwcm92aXNpb25hbERvY3VtZW50TG9hZGVy
IHRvIGRlY2lkZSB0aGUgbG9hZCB0eXBlOyBpZiBjYWxsZWQgYW55IG90aGVyCisgICAgICAgIC8v
IHdheSwgdGhlIGVycm9yIHBhZ2UgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgaGlzdG9yeSBp
bnN0ZWFkIG9mCisgICAgICAgIC8vIHJlcGxhY2luZyB0aGUgZmFpbGVkIGxvYWQuCisgICAgICAg
IC8vCisgICAgICAgIC8vIElmIHRoaXMgY29tZXMgZnJvbSBhIGJhY2svZm9yd2FyZCBuYXZpZ2F0
aW9uLCB3ZSBuZWVkIHRvIHNhdmUgdGhlIGN1cnJlbnQgdmlld3N0YXRlCisgICAgICAgIC8vIHRv
IG9yaWdpbmFsIGhpc3RvcnlpdGVtLCBhbmQgcHJldmVudCB0aGUgcmVzdG9yZSBvZiB2aWV3IHN0
YXRlIHRvIHRoZSBlcnJvciBwYWdlLgorCisgICAgICAgIGlmIChpc0JhY2tGb3J3YXJkTG9hZFR5
cGUobV9mcmFtZS0+bG9hZGVyKCktPmxvYWRUeXBlKCkpKSB7CisgICAgICAgICAgICBtX2ZyYW1l
LT5sb2FkZXIoKS0+aGlzdG9yeSgpLT5zYXZlU2Nyb2xsUG9zaXRpb25BbmRWaWV3U3RhdGVUb0l0
ZW0obV9mcmFtZS0+bG9hZGVyKCktPmhpc3RvcnkoKS0+Y3VycmVudEl0ZW0oKSk7CisgICAgICAg
ICAgICBBU1NFUlQobV9mcmFtZS0+bG9hZGVyKCktPmhpc3RvcnkoKS0+cHJvdmlzaW9uYWxJdGVt
KCkpOworICAgICAgICAgICAgbV9mcmFtZS0+bG9hZGVyKCktPmhpc3RvcnkoKS0+cHJvdmlzaW9u
YWxJdGVtKCktPnZpZXdTdGF0ZSgpLnNob3VsZFNhdmVWaWV3U3RhdGUgPSBmYWxzZTsKKyAgICAg
ICAgfQorICAgICAgICBtX2xvYWRpbmdFcnJvclBhZ2UgPSB0cnVlOworICAgICAgICBtX2ZyYW1l
LT5sb2FkZXIoKS0+bG9hZChvcmlnaW5hbFJlcXVlc3QsIGVycm9yRGF0YSwgZmFsc2UpOworICAg
IH0KK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoV2lsbFN1
Ym1pdEZvcm0oRnJhbWVQb2xpY3lGdW5jdGlvbiBmdW5jdGlvbiwgUGFzc1JlZlB0cjxGb3JtU3Rh
dGU+KQoreworICAgIC8vIEZJWE1FOiBTdHViLgorICAgIChtX2ZyYW1lLT5sb2FkZXIoKS0+cG9s
aWN5Q2hlY2tlcigpLT4qZnVuY3Rpb24pKFBvbGljeVVzZSk7Cit9CisKK1Bhc3NSZWZQdHI8RnJh
bWU+IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y3JlYXRlRnJhbWUoY29uc3QgS1VSTCYg
dXJsLCBjb25zdCBTdHJpbmcmIG5hbWUKKyAgICAsIEhUTUxGcmFtZU93bmVyRWxlbWVudCogb3du
ZXJFbGVtZW50LCBjb25zdCBTdHJpbmcmIHJlZmVycmVyLCBib29sIGFsbG93c1Njcm9sbGluZywg
aW50IG1hcmdpbldpZHRoLCBpbnQgbWFyZ2luSGVpZ2h0KQoreworICAgIGlmICghbV93ZWJQYWdl
UHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAobV9jaGlsZEZyYW1lQ3JlYXRp
b25TdXBwcmVzc2VkKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEZyYW1lTG9hZGVyQ2xpZW50
QmxhY2tCZXJyeSogZnJhbWVMb2FkZXJDbGllbnQgPSBuZXcgRnJhbWVMb2FkZXJDbGllbnRCbGFj
a0JlcnJ5KCk7CisgICAgUmVmUHRyPEZyYW1lPiBjaGlsZEZyYW1lID0gRnJhbWU6OmNyZWF0ZSht
X2ZyYW1lLT5wYWdlKCksIG93bmVyRWxlbWVudCwgZnJhbWVMb2FkZXJDbGllbnQpOworICAgIGZy
YW1lTG9hZGVyQ2xpZW50LT5zZXRGcmFtZShjaGlsZEZyYW1lLmdldCgpLCBtX3dlYlBhZ2VQcml2
YXRlKTsKKworICAgIC8vIEluaXRpYWxpemUgRnJhbWVWaWV3LgorICAgIFJlZlB0cjxGcmFtZVZp
ZXc+IGZyYW1lVmlldyA9IEZyYW1lVmlldzo6Y3JlYXRlKGNoaWxkRnJhbWUuZ2V0KCkpOworICAg
IGNoaWxkRnJhbWUtPnNldFZpZXcoZnJhbWVWaWV3LmdldCgpKTsKKyAgICBpZiAoIWFsbG93c1Nj
cm9sbGluZykKKyAgICAgICAgZnJhbWVWaWV3LT5zZXRTY3JvbGxiYXJNb2RlcyhTY3JvbGxiYXJB
bHdheXNPZmYsIFNjcm9sbGJhckFsd2F5c09mZik7CisgICAgaWYgKG1hcmdpbldpZHRoICE9IC0x
KQorICAgICAgICBmcmFtZVZpZXctPnNldE1hcmdpbldpZHRoKG1hcmdpbldpZHRoKTsKKyAgICBp
ZiAobWFyZ2luSGVpZ2h0ICE9IC0xKQorICAgICAgICBmcmFtZVZpZXctPnNldE1hcmdpbkhlaWdo
dChtYXJnaW5IZWlnaHQpOworCisgICAgY2hpbGRGcmFtZS0+dHJlZSgpLT5zZXROYW1lKG5hbWUp
OworICAgIG1fZnJhbWUtPnRyZWUoKS0+YXBwZW5kQ2hpbGQoY2hpbGRGcmFtZSk7CisgICAgY2hp
bGRGcmFtZS0+aW5pdCgpOworCisgICAgaWYgKCFjaGlsZEZyYW1lLT50cmVlKCktPnBhcmVudCgp
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIEJhY2tpbmdTdG9yZUNsaWVudDo6Y3JlYXRlKGNo
aWxkRnJhbWUuZ2V0KCksIG1fZnJhbWUsIG1fd2ViUGFnZVByaXZhdGUtPm1fd2ViUGFnZSk7CisK
KyAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+bG9hZFVSTEludG9DaGlsZEZyYW1lKHVybCwgcmVmZXJy
ZXIsIGNoaWxkRnJhbWUuZ2V0KCkpOworCisgICAgaWYgKCFjaGlsZEZyYW1lLT50cmVlKCktPnBh
cmVudCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBjaGlsZEZyYW1lLnJlbGVh
c2UoKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpZFRyYW5zZmVy
Q2hpbGRGcmFtZVRvTmV3RG9jdW1lbnQoUGFnZSogLypvbGRQYWdlKi8pCit7CisgICAgUGFnZSog
bmV3UGFnZSA9IG1fZnJhbWUtPnBhZ2UoKTsKKyAgICBtX3dlYlBhZ2VQcml2YXRlID0gc3RhdGlj
X2Nhc3Q8Q2hyb21lQ2xpZW50QmxhY2tCZXJyeSo+KG5ld1BhZ2UtPmNocm9tZSgpLT5jbGllbnQo
KSktPndlYlBhZ2VQcml2YXRlKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0Jl
cnJ5Ojp0cmFuc2ZlckxvYWRpbmdSZXNvdXJjZUZyb21QYWdlKFJlc291cmNlTG9hZGVyKiwgY29u
c3QgUmVzb3VyY2VSZXF1ZXN0JiwgUGFnZSopCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30K
KworT2JqZWN0Q29udGVudFR5cGUgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpvYmplY3RD
b250ZW50VHlwZShjb25zdCBLVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgbWltZVR5cGVJbiwgYm9v
bCBzaG91bGRQcmVmZXJQbHVnSW5zRm9ySW1hZ2VzKQoreworICAgIFN0cmluZyBtaW1lVHlwZSA9
IG1pbWVUeXBlSW47CisgICAgaWYgKG1pbWVUeXBlLmlzRW1wdHkoKSkKKyAgICAgICAgbWltZVR5
cGUgPSBNSU1FVHlwZVJlZ2lzdHJ5OjpnZXRNSU1FVHlwZUZvclBhdGgodXJsLnBhdGgoKSk7CisK
KyAgICAvLyBHZXQgbWFwcGVkIHR5cGUuCisgICAgbWltZVR5cGUgPSBCbGFja0JlcnJ5OjpXZWJL
aXQ6OldlYlNldHRpbmdzOjpnZXROb3JtYWxpemVkTUlNRVR5cGUobWltZVR5cGUpOworCisgICAg
T2JqZWN0Q29udGVudFR5cGUgZGVmYXVsdFR5cGUgPSBGcmFtZUxvYWRlcjo6ZGVmYXVsdE9iamVj
dENvbnRlbnRUeXBlKHVybCwgbWltZVR5cGUsIHNob3VsZFByZWZlclBsdWdJbnNGb3JJbWFnZXMp
OworICAgIGlmIChkZWZhdWx0VHlwZSAhPSBPYmplY3RDb250ZW50Tm9uZSkKKyAgICAgICAgcmV0
dXJuIGRlZmF1bHRUeXBlOworCisgICAgaWYgKEJsYWNrQmVycnk6OldlYktpdDo6V2ViU2V0dGlu
Z3M6OmlzU3VwcG9ydGVkT2JqZWN0TUlNRVR5cGUobWltZVR5cGUpKQorICAgICAgICByZXR1cm4g
T2JqZWN0Q29udGVudE90aGVyUGx1Z2luOworCisgICAgcmV0dXJuIE9iamVjdENvbnRlbnROb25l
OworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hXaWxsQ2xv
c2UoKQoreworICAgIG1fd2ViUGFnZVByaXZhdGUtPm1faW5wdXRIYW5kbGVyLT5mcmFtZVVubG9h
ZGVkKG1fZnJhbWUpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6c2V0
TWFpbkRvY3VtZW50RXJyb3IoRG9jdW1lbnRMb2FkZXIqLCBjb25zdCBSZXNvdXJjZUVycm9yJiBl
cnJvcikKK3sKKyAgICBpZiAobV9wbHVnaW5WaWV3KSB7CisgICAgICAgIG1fcGx1Z2luVmlldy0+
ZGlkRmFpbChlcnJvcik7CisgICAgICAgIG1fcGx1Z2luVmlldyA9IDA7CisgICAgICAgIG1faGFz
U2VudFJlc3BvbnNlVG9QbHVnaW4gPSBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgRnJhbWVMb2Fk
ZXJDbGllbnRCbGFja0JlcnJ5Ojpwb3N0UHJvZ3Jlc3NTdGFydGVkTm90aWZpY2F0aW9uKCkKK3sK
KyAgICBpZiAoIWlzTWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIE5ldyBs
b2FkIHN0YXJ0ZWQsIHNvIGNsZWFyIHRoZSBlcnJvci4KKyAgICBtX2xvYWRFcnJvciA9IFJlc291
cmNlRXJyb3IoKTsKKyAgICBtX3NlbnRSZWFkeVRvUmVuZGVyID0gZmFsc2U7CisgICAgbV93ZWJQ
YWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlmeUxvYWRTdGFydGVkKCk7Cit9CisKK3ZvaWQgRnJh
bWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpwb3N0UHJvZ3Jlc3NFc3RpbWF0ZUNoYW5nZWROb3Rp
ZmljYXRpb24oKQoreworICAgIGlmICghaXNNYWluRnJhbWUoKSB8fCAhbV9mcmFtZS0+cGFnZSgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+bm90
aWZ5TG9hZFByb2dyZXNzKG1fZnJhbWUtPnBhZ2UoKS0+cHJvZ3Jlc3MoKS0+ZXN0aW1hdGVkUHJv
Z3Jlc3MoKSAqIDEwMCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpk
aXNwYXRjaERpZEZpcnN0VmlzdWFsbHlOb25FbXB0eUxheW91dCgpCit7CisgICAgaWYgKCFpc01h
aW5GcmFtZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJkaXNwYXRjaERpZEZpcnN0
VmlzdWFsbHlOb25FbXB0eUxheW91dCIpOworCisgICAgcmVhZHlUb1JlbmRlcih0cnVlKTsKKwor
ICAgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgYmUgZ2V0dGluZyBoZXJlIGlmIHdlIGFyZSBub3Qg
aW4gdGhlIENvbW1pdHRlZCBzdGF0ZSBidXQgd2UgYXJlCisgICAgLy8gc28gd2UgY2FuIG5vdCBh
c3NlcnQgb24gdGhhdCByaWdodCBub3cuIEJ1dCB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBs
b2FkLgorICAgIC8vIFJJTSBCdWcgIzU1NQorICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5sb2Fk
U3RhdGUoKSA9PSBXZWJQYWdlUHJpdmF0ZTo6Q29tbWl0dGVkKSB7CisgICAgICAgIG1fd2ViUGFn
ZVByaXZhdGUtPnpvb21Ub0luaXRpYWxTY2FsZU9uTG9hZCgpOyAvLyBTZXQgdGhlIHByb3BlciB6
b29tIGxldmVsIGZpcnN0LgorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2JhY2tpbmdTdG9y
ZS0+ZC0+Y2xlYXJWaXNpYmxlWm9vbSgpOyAvLyBDbGVhciB0aGUgdmlzaWJsZSB6b29tIHNpbmNl
IHdlJ3JlIGV4cGxpY2l0bHkgcmVuZGVyaW5nK2JsaXR0aW5nIGJlbG93LgorICAgICAgICBtX3dl
YlBhZ2VQcml2YXRlLT5tX2JhY2tpbmdTdG9yZS0+ZC0+cmVuZGVyVmlzaWJsZUNvbnRlbnRzKCk7
CisgICAgfQorCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlmeUZpcnN0Vmlz
dWFsbHlOb25FbXB0eUxheW91dCgpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tC
ZXJyeTo6cG9zdFByb2dyZXNzRmluaXNoZWROb3RpZmljYXRpb24oKQoreworICAgIGlmICghaXNN
YWluRnJhbWUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRW1wdHkgcGFnZXMgd2lsbCBu
ZXZlciBoYXZlIGNhbGxlZAorICAgIC8vIGRpc3BhdGNoRGlkRmlyc3RWaXN1YWxseU5vbkVtcHR5
TGF5b3V0LCBzaW5jZSB0aGV5J3JlIHZpc3VhbGx5IGVtcHR5LCBzbworICAgIC8vIHdlIG1heSBu
ZWVkIHRvIGNhbGwgcmVhZHlUb1JlbmRlciBub3cuCisgICAgcmVhZHlUb1JlbmRlcihmYWxzZSk7
CisKKyAgICAvLyBGSVhNRTogU2VuZCB1cCBhIHJlYWwgc3RhdHVzIGNvZGUuCisgICAgbV93ZWJQ
YWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlmeUxvYWRGaW5pc2hlZChtX2xvYWRFcnJvci5pc051
bGwoKSA/IDAgOiAtMSk7CisKKyAgICAvLyBOb3RpZnkgcGx1Z2lucyB0aGF0IGFyZSB3YWl0aW5n
IGZvciB0aGUgcGFnZSB0byBmdWxseSBsb2FkIGJlZm9yZSBzdGFydGluZyB0aGF0CisgICAgLy8g
dGhlIGxvYWQgaGFzIGNvbXBsZXRlZC4KKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5ub3RpZnlQYWdl
T25Mb2FkKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRj
aERpZENsZWFyV2luZG93T2JqZWN0SW5Xb3JsZChET01XcmFwcGVyV29ybGQqIHdvcmxkKQorewor
ICAgIGlmICh3b3JsZCAhPSBtYWluVGhyZWFkTm9ybWFsV29ybGQoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgLy8gUHJvdmlkZSB0aGUgZXh0ZW5zaW9uIG9iamVjdCBmaXJzdCBpbiBjYXNlIHRo
ZSBjbGllbnQgb3Igb3RoZXJzIHdhbnQgdG8gdXNlIGl0CisgICAgLy8gRklYTUU6IENvbmRpdGlv
bmFsbHkgYXR0YWNoIGV4dGVuc2lvbiBvYmplY3QgYmFzZWQgb24gc29tZSBmbGFnIG9yIHdoZXRo
ZXIgb3Igbm90IHdlCisgICAgLy8gYXJlIGJyb3dzZXIgb3Igc29tZXRoaW5nIGVsc2UuCisgICAg
YXR0YWNoRXh0ZW5zaW9uT2JqZWN0VG9GcmFtZShtX2ZyYW1lLCBtX3dlYlBhZ2VQcml2YXRlLT5t
X2NsaWVudCk7CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+bm90aWZ5V2luZG93
T2JqZWN0Q2xlYXJlZCgpOworCisgICAgaWYgKG1fd2ViUGFnZVByaXZhdGUtPm1fZHVtcFJlbmRl
clRyZWUpIHsKKyAgICAgICAgSlNHbG9iYWxDb250ZXh0UmVmIGNvbnRleHQgPSB0b0dsb2JhbFJl
ZihtX2ZyYW1lLT5zY3JpcHQoKS0+Z2xvYmFsT2JqZWN0KG1haW5UaHJlYWROb3JtYWxXb3JsZCgp
KS0+Z2xvYmFsRXhlYygpKTsKKyAgICAgICAgSlNPYmplY3RSZWYgd2luZG93T2JqZWN0ID0gdG9S
ZWYobV9mcmFtZS0+c2NyaXB0KCktPmdsb2JhbE9iamVjdChtYWluVGhyZWFkTm9ybWFsV29ybGQo
KSkpOworICAgICAgICBBU1NFUlQod2luZG93T2JqZWN0KTsKKyAgICAgICAgbV93ZWJQYWdlUHJp
dmF0ZS0+bV9kdW1wUmVuZGVyVHJlZS0+ZGlkQ2xlYXJXaW5kb3dPYmplY3RJbldvcmxkKHdvcmxk
LCBjb250ZXh0LCB3aW5kb3dPYmplY3QpOworICAgIH0KK30KKworYm9vbCBGcmFtZUxvYWRlckNs
aWVudEJsYWNrQmVycnk6OnNob3VsZEdvVG9IaXN0b3J5SXRlbShIaXN0b3J5SXRlbSopIGNvbnN0
Cit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRnJhbWVMb2FkZXJDbGllbnRCbGFja0Jl
cnJ5OjpzaG91bGRTdG9wTG9hZGluZ0Zvckhpc3RvcnlJdGVtKEhpc3RvcnlJdGVtKikgY29uc3QK
K3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVy
cnk6OmludmFsaWRhdGVCYWNrRm9yd2FyZExpc3QoKSBjb25zdAoreworICAgIG5vdGlmeUJhY2tG
b3J3YXJkTGlzdENoYW5nZWQoKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVy
cnk6Om5vdGlmeUJhY2tGb3J3YXJkTGlzdENoYW5nZWQoKSBjb25zdAoreworICAgIEJhY2tGb3J3
YXJkTGlzdEltcGwqIGJhY2tGb3J3YXJkTGlzdCA9IHN0YXRpY19jYXN0PEJhY2tGb3J3YXJkTGlz
dEltcGwqPihtX3dlYlBhZ2VQcml2YXRlLT5tX3BhZ2UtPmJhY2tGb3J3YXJkKCktPmNsaWVudCgp
KTsKKyAgICBBU1NFUlQoYmFja0ZvcndhcmRMaXN0KTsKKworICAgIHVuc2lnbmVkIGxpc3RTaXpl
ID0gYmFja0ZvcndhcmRMaXN0LT5lbnRyaWVzKCkuc2l6ZSgpOworICAgIHVuc2lnbmVkIGN1cnJl
bnRJbmRleCA9IGJhY2tGb3J3YXJkTGlzdC0+YmFja0xpc3RDb3VudCgpOworICAgIG1fd2ViUGFn
ZVByaXZhdGUtPm1fY2xpZW50LT5yZXNldEJhY2tGb3J3YXJkTGlzdChsaXN0U2l6ZSwgY3VycmVu
dEluZGV4KTsKK30KKworRnJhbWUqIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0
Y2hDcmVhdGVQYWdlKGNvbnN0IE5hdmlnYXRpb25BY3Rpb24mIG5hdmlnYXRpb24pCit7CisgICAg
QmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJQYWdlKiB3ZWJQYWdlID0gbV93ZWJQYWdlUHJpdmF0ZS0+
bV9jbGllbnQtPmNyZWF0ZVdpbmRvdygwLCAwLCAtMSwgLTEsIEJsYWNrQmVycnk6OldlYktpdDo6
V2ViUGFnZUNsaWVudDo6RmxhZ1dpbmRvd0RlZmF1bHQsIG5hdmlnYXRpb24udXJsKCkuc3RyaW5n
KCksIFdlYlN0cmluZygpKTsKKyAgICBpZiAoIXdlYlBhZ2UpCisgICAgICAgIHJldHVybiAwOwor
CisgICAgcmV0dXJuIHdlYlBhZ2UtPmQtPm1fcGFnZS0+bWFpbkZyYW1lKCk7Cit9CisKK3ZvaWQg
RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkZXRhY2hlZEZyb21QYXJlbnQyKCkKK3sKKyAg
ICBCYWNraW5nU3RvcmVDbGllbnQqIGJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lID0gbV93ZWJQ
YWdlUHJpdmF0ZS0+YmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUobV9mcmFtZSk7CisgICAgaWYg
KGJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKSB7CisgICAgICAgIGRlbGV0ZSBiYWNraW5nU3Rv
cmVDbGllbnRGb3JGcmFtZTsKKyAgICAgICAgYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUgPSAw
OworICAgIH0KKworICAgIGlmIChtX2ZyYW1lLT5kb2N1bWVudCgpKQorICAgICAgICBtX3dlYlBh
Z2VQcml2YXRlLT5jbGVhckRvY3VtZW50RGF0YShtX2ZyYW1lLT5kb2N1bWVudCgpKTsKKworICAg
IG1fd2ViUGFnZVByaXZhdGUtPm1faW5wdXRIYW5kbGVyLT5mcmFtZVVubG9hZGVkKG1fZnJhbWUp
OworICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5ub3RpZnlGcmFtZURldGFjaGVkKG1f
ZnJhbWUpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hX
aWxsU2VuZFJlcXVlc3QoRG9jdW1lbnRMb2FkZXIqIGRvY0xvYWRlciwgbG9uZyB1bnNpZ25lZCBp
bnQsIFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYpCit7
CisgICAgLy8gSWYgdGhlIHJlcXVlc3QgaXMgYmVpbmcgbG9hZGVkIGJ5IHRoZSBwcm92aXNpb25h
bCBkb2N1bWVudCBsb2FkZXIsIHRoZW4KKyAgICAvLyBpdCBpcyBhIG5ldyB0b3AgbGV2ZWwgcmVx
dWVzdCB3aGljaCBoYXMgbm90IGJlZW4gY29tbWl0ZWQuCisgICAgYm9vbCBpc01haW5SZXNvdXJj
ZUxvYWQgPSBkb2NMb2FkZXIgJiYgZG9jTG9hZGVyID09IGRvY0xvYWRlci0+ZnJhbWVMb2FkZXIo
KS0+cHJvdmlzaW9uYWxEb2N1bWVudExvYWRlcigpOworCisgICAgLy8gQW55IHByb2Nlc3Npbmcg
d2hpY2ggaXMgZG9uZSBmb3IgYWxsIGxvYWRzIChib3RoIG1haW4gYW5kIHN1YnJlc291cmNlKSBz
aG91bGQgZ28gaGVyZS4KKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Qg
cGxhdGZvcm1SZXF1ZXN0OworICAgIHJlcXVlc3QuaW5pdGlhbGl6ZVBsYXRmb3JtUmVxdWVzdChw
bGF0Zm9ybVJlcXVlc3QsIGZhbHNlIC8qaXNJbml0aWFsKi8pOworICAgIG1fd2ViUGFnZVByaXZh
dGUtPm1fY2xpZW50LT5wb3B1bGF0ZUN1c3RvbUhlYWRlcnMocGxhdGZvcm1SZXF1ZXN0KTsKKyAg
ICBjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkhlYWRlckxpc3Qm
IGhlYWRlckxpc3RzID0gcGxhdGZvcm1SZXF1ZXN0LmdldEhlYWRlckxpc3RSZWYoKTsKKyAgICBm
b3IgKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6SGVhZGVyTGlzdDo6Y29u
c3RfaXRlcmF0b3IgaXQgPSBoZWFkZXJMaXN0cy5iZWdpbigpOyBpdCAhPSBoZWFkZXJMaXN0cy5l
bmQoKTsgKytpdCkgeworICAgICAgICBzdGQ6OnN0cmluZyBoZWFkZXJTdHJpbmcgPSBpdC0+Zmly
c3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGhlYWRlclZhbHVlU3RyaW5nID0gaXQtPnNlY29uZDsK
KyAgICAgICAgcmVxdWVzdC5zZXRIVFRQSGVhZGVyRmllbGQoU3RyaW5nKGhlYWRlclN0cmluZy5j
X3N0cigpKSwgU3RyaW5nKGhlYWRlclZhbHVlU3RyaW5nLmNfc3RyKCkpKTsKKyAgICB9CisgICAg
aWYgKGNvb2tpZXNFbmFibGVkKCkpIHsKKyAgICAgICAgU3RyaW5nIGNvb2tpZVBhaXJzID0gY29v
a2llTWFuYWdlcigpLmdldENvb2tpZShyZXF1ZXN0LnVybCgpLCBXaXRoSHR0cE9ubHlDb29raWVz
KTsKKyAgICAgICAgaWYgKCFjb29raWVQYWlycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8v
IFdlIG9ubHkgbW9kaWZ5IHRoZSBXZWJDb3JlIHJlcXVlc3QgdG8gbWFrZSB0aGUgY29va2llcyB2
aXNpYmxlIGluIGluc3BlY3Rvci4KKyAgICAgICAgICAgIHJlcXVlc3Quc2V0SFRUUEhlYWRlckZp
ZWxkKFN0cmluZygiQ29va2llIiksIGNvb2tpZVBhaXJzKTsKKyAgICAgICAgfQorICAgIH0KKyAg
ICBpZiAoIWlzTWFpblJlc291cmNlTG9hZCkgeworICAgICAgICAvLyBEbyBub3RoaW5nIGZvciBu
b3cuCisgICAgICAgIC8vIEFueSBwcm9jZXNzaW5nIHdoaWNoIGlzIGRvbmUgb25seSBmb3Igc3Vi
cmVzb3VyY2VzIHNob3VsZCBnbyBoZXJlLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
Ly8gQWxsIHByb2Nlc3NpbmcgYmV5b25kIHRoaXMgcG9pbnQgaXMgZG9uZSBvbmx5IGZvciBtYWlu
IHJlc291cmNlIGxvYWRzLgorCisgICAgaWYgKG1fY2xpZW50UmVkaXJlY3RJc1BlbmRpbmcgJiYg
aXNNYWluRnJhbWUoKSkgeworICAgICAgICBTdHJpbmcgb3JpZ2luYWxVcmwgPSBtX2ZyYW1lLT5k
b2N1bWVudCgpLT51cmwoKS5zdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nIGZpbmFsVXJsID0gcmVx
dWVzdC51cmwoKS5zdHJpbmcoKTsKKworICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVu
dC0+bm90aWZ5Q2xpZW50UmVkaXJlY3Qob3JpZ2luYWxVcmwuY2hhcmFjdGVycygpLCBvcmlnaW5h
bFVybC5sZW5ndGgoKSwKKyAgICAgICAgICAgIGZpbmFsVXJsLmNoYXJhY3RlcnMoKSwgZmluYWxV
cmwubGVuZ3RoKCkpOworICAgIH0KKworICAgIC8vIEZJWE1FOiBVcGRhdGUgdGhlIHJlcXVlc3Qg
dHlwZS4gU2VlIFBSICMxMTk3OTIuCisgICAgaWYgKGRvY0xvYWRlci0+ZnJhbWVMb2FkZXIoKS0+
aXNMb2FkaW5nTWFpbkZyYW1lKCkpCisgICAgICAgIHJlcXVlc3Quc2V0VGFyZ2V0VHlwZShSZXNv
dXJjZVJlcXVlc3Q6OlRhcmdldElzTWFpbkZyYW1lKTsKKyAgICBlbHNlCisgICAgICAgIHJlcXVl
c3Quc2V0VGFyZ2V0VHlwZShSZXNvdXJjZVJlcXVlc3Q6OlRhcmdldElzU3ViZnJhbWUpOworCisg
ICAgRnJhbWVMb2FkZXIqIGxvYWRlciA9IG1fZnJhbWUtPmxvYWRlcigpOworICAgIEFTU0VSVChs
b2FkZXIpOworICAgIGlmIChpc0JhY2tGb3J3YXJkTG9hZFR5cGUobG9hZGVyLT5sb2FkVHlwZSgp
KSkgeworICAgICAgICAvLyBEbyBub3QgdXNlIHRoZSBwYXNzZWQgRG9jdW1lbnRMb2FkZXIgYmVj
YXVzZSBpdCBpcyB0aGUgbG9hZGVyIHRoYXQKKyAgICAgICAgLy8gd2lsbCBiZSB1c2VkIGZvciB0
aGUgbmV3IHJlcXVlc3QgKHRoZSBERVNUSU5BVElPTiBvZiB0aGUgaGlzdG9yeQorICAgICAgICAv
LyBuYXZpZ2F0aW9uIC0gd2Ugd2FudCB0byB1c2UgdGhlIGN1cnJlbnQgRG9jdW1lbnRMb2FkZXIg
dG8gcmVjb3JkIHRoZQorICAgICAgICAvLyBTT1VSQ0UpLgorICAgICAgICBEb2N1bWVudExvYWRl
ciogZG9jTG9hZGVyID0gbV9mcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCk7CisgICAg
ICAgIEFTU0VSVChkb2NMb2FkZXIpOworICAgICAgICBtX2hpc3RvcnlOYXZpZ2F0aW9uU291cmNl
VVJMcy5hZGQoZG9jTG9hZGVyLT51cmwoKSk7CisgICAgICAgIG1faGlzdG9yeU5hdmlnYXRpb25T
b3VyY2VVUkxzLmFkZChkb2NMb2FkZXItPm9yaWdpbmFsVVJMKCkpOworICAgIH0KK30KKwordm9p
ZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmxvYWRJY29uRXh0ZXJuYWxseShjb25zdCBT
dHJpbmcmIG9yaWdpbmFsUGFnZVVybCwgY29uc3QgU3RyaW5nJiBmaW5hbFBhZ2VVcmwsIGNvbnN0
IFN0cmluZyYgaWNvblVybCkKK3sKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+c2V0
SWNvbkZvclVybChvcmlnaW5hbFBhZ2VVcmwudXRmOCgpLmRhdGEoKSwgZmluYWxQYWdlVXJsLnV0
ZjgoKS5kYXRhKCksIGljb25VcmwudXRmOCgpLmRhdGEoKSk7Cit9CisKK3ZvaWQgRnJhbWVMb2Fk
ZXJDbGllbnRCbGFja0JlcnJ5OjpzYXZlVmlld1N0YXRlVG9JdGVtKEhpc3RvcnlJdGVtKiBpdGVt
KQoreworICAgIGlmICghaXNNYWluRnJhbWUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNT
RVJUKGl0ZW0pOworICAgIEhpc3RvcnlJdGVtVmlld1N0YXRlJiB2aWV3U3RhdGUgPSBpdGVtLT52
aWV3U3RhdGUoKTsKKyAgICBpZiAodmlld1N0YXRlLnNob3VsZFNhdmVWaWV3U3RhdGUpIHsKKyAg
ICAgICAgdmlld1N0YXRlLm9yaWVudGF0aW9uID0gbV93ZWJQYWdlUHJpdmF0ZS0+bWFpbkZyYW1l
KCktPm9yaWVudGF0aW9uKCk7CisgICAgICAgIHZpZXdTdGF0ZS5pc1pvb21Ub0ZpdFNjYWxlID0g
bV93ZWJQYWdlUHJpdmF0ZS0+Y3VycmVudFNjYWxlKCkgPT0gbV93ZWJQYWdlUHJpdmF0ZS0+em9v
bVRvRml0U2NhbGUoKTsKKyAgICAgICAgdmlld1N0YXRlLnNjYWxlID0gbV93ZWJQYWdlUHJpdmF0
ZS0+Y3VycmVudFNjYWxlKCk7CisgICAgICAgIHZpZXdTdGF0ZS5zaG91bGRSZWZsb3dCbG9jayA9
IG1fd2ViUGFnZVByaXZhdGUtPm1fc2hvdWxkUmVmbG93QmxvY2s7CisgICAgfQorfQorCit2b2lk
IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6cmVzdG9yZVZpZXdTdGF0ZSgpCit7CisgICAg
aWYgKCFpc01haW5GcmFtZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBIaXN0b3J5SXRlbSog
Y3VycmVudEl0ZW0gPSBtX2ZyYW1lLT5sb2FkZXIoKS0+aGlzdG9yeSgpLT5jdXJyZW50SXRlbSgp
OworICAgIEFTU0VSVChjdXJyZW50SXRlbSk7CisKKyAgICBpZiAoIWN1cnJlbnRJdGVtKQorICAg
ICAgICByZXR1cm47CisKKyAgICAvLyBXZWJQYWdlUHJpdmF0ZSBpcyBtZXNzaW5nIHVwIEZyYW1l
Vmlldzo6d2FzU2Nyb2xsZWRCeVVzZXIoKSBieSBzZW5kaW5nCisgICAgLy8gc2Nyb2xsIGV2ZW50
cyB0aGF0IGxvb2sgbGlrZSB0aGV5IHdlcmUgdXNlciBnZW5lcmF0ZWQgYWxsIHRoZSB0aW1lLgor
ICAgIC8vCisgICAgLy8gRXZlbiBpZiB0aGUgdXNlciBkaWQgbm90IHNjcm9sbCwgRnJhbWVWaWV3
IGlzIGdvbm5hIHRoaW5rIHRoZXkgZGlkLgorICAgIC8vIFNvIHdlIHVzZSBvdXIgb3duIGJvb2tr
ZWVwaW5nIGNvZGUgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlIHdlcmUKKyAgICAvLyBhY3R1
YWxseSBzY3JvbGxlZCBieSB0aGUgdXNlciBkdXJpbmcgbG9hZC4KKyAgICAvLworICAgIC8vIElm
IHRoZSB1c2VyIGRpZCBzY3JvbGwgdGhvdWdoLCBhbGwgYXJlIGdvaW5nIHRvIGJlIGluIGFncmVl
bWVudCBhYm91dAorICAgIC8vIHRoYXQsIGFuZCB0aGUgd29yc3QgdGhpbmcgdGhhdCBjb3VsZCBo
YXBwZW4gaXMgdGhhdAorICAgIC8vIEhpc3RvcnlDb250cm9sbGVyOjpyZXN0b3JlU2Nyb2xsUG9z
aXRpb25BbmRWaWV3U3RhdGUgY2FsbHMKKyAgICAvLyBzZXRTY3JvbGxQb3NpdGlvbiB3aXRoIHRo
ZSB0aGUgc2FtZSBwb2ludCwgd2hpY2ggaXMgYSBOT09QLgorICAgIEludFNpemUgY29udGVudHNT
aXplID0gY3VycmVudEl0ZW0tPmNvbnRlbnRzU2l6ZSgpOworICAgIEludFBvaW50IHNjcm9sbFBv
c2l0aW9uID0gY3VycmVudEl0ZW0tPnNjcm9sbFBvaW50KCk7CisgICAgaWYgKG1fd2ViUGFnZVBy
aXZhdGUtPm1fdXNlclBlcmZvcm1lZE1hbnVhbFNjcm9sbCkKKyAgICAgICAgc2Nyb2xsUG9zaXRp
b24gPSBtX3dlYlBhZ2VQcml2YXRlLT5zY3JvbGxQb3NpdGlvbigpOworCisgICAgLy8gV2UgbmVl
ZCB0byByZXNldCB0aGlzIHZhcmlhYmxlIGFmdGVyIHRoZSB2aWV3IHN0YXRlIGhhcyBiZWVuIHJl
c3RvcmVkLgorICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fZGlkUmVzdG9yZUZyb21QYWdlQ2FjaGUg
PSBmYWxzZTsKKyAgICBIaXN0b3J5SXRlbVZpZXdTdGF0ZSYgdmlld1N0YXRlID0gY3VycmVudEl0
ZW0tPnZpZXdTdGF0ZSgpOworCisgICAgLy8gQWxzbywgdHJ5IHRvIGtlZXAgdGhlIHVzZXJzIHpv
b20gaWYgYW55LgorICAgIGRvdWJsZSBzY2FsZSA9IHZpZXdTdGF0ZS5zY2FsZTsKKyAgICBib29s
IHNob3VsZFJlZmxvd0Jsb2NrID0gdmlld1N0YXRlLnNob3VsZFJlZmxvd0Jsb2NrOworICAgIGlm
IChtX3dlYlBhZ2VQcml2YXRlLT5tX3VzZXJQZXJmb3JtZWRNYW51YWxab29tKSB7CisgICAgICAg
IHNjYWxlID0gbV93ZWJQYWdlUHJpdmF0ZS0+Y3VycmVudFNjYWxlKCk7CisgICAgICAgIHNob3Vs
ZFJlZmxvd0Jsb2NrID0gbV93ZWJQYWdlUHJpdmF0ZS0+bV9zaG91bGRSZWZsb3dCbG9jazsKKyAg
ICB9CisKKyAgICBib29sIHNjcm9sbENoYW5nZWQgPSBzY3JvbGxQb3NpdGlvbiAhPSBtX3dlYlBh
Z2VQcml2YXRlLT5zY3JvbGxQb3NpdGlvbigpOworICAgIGJvb2wgc2NhbGVDaGFuZ2VkID0gc2Nh
bGUgIT0gbV93ZWJQYWdlUHJpdmF0ZS0+Y3VycmVudFNjYWxlKCk7CisgICAgYm9vbCByZWZsb3dD
aGFuZ2VkID0gc2hvdWxkUmVmbG93QmxvY2sgIT0gbV93ZWJQYWdlUHJpdmF0ZS0+bV9zaG91bGRS
ZWZsb3dCbG9jazsKKyAgICBib29sIG9yaWVudGF0aW9uQ2hhbmdlZCA9IHZpZXdTdGF0ZS5vcmll
bnRhdGlvbiAlIDE4MCAhPSBtX3dlYlBhZ2VQcml2YXRlLT5tYWluRnJhbWUoKS0+b3JpZW50YXRp
b24oKSAlIDE4MDsKKworICAgIGlmICghc2Nyb2xsQ2hhbmdlZCAmJiAhc2NhbGVDaGFuZ2VkICYm
ICFyZWZsb3dDaGFuZ2VkICYmICFvcmllbnRhdGlvbkNoYW5nZWQpCisgICAgICAgIHJldHVybjsK
KworICAgIC8vIFdoZW4gcm90YXRlIGhhcHBlbnMsIG9ubHkgem9vbSB3aGVuIHByZXZpb3VzIHBh
Z2Ugd2FzIHpvb21Ub0ZpdFNjYWxlLCBvdGhlcndpc2Uga2VlcCBvbGQgc2NhbGUuCisgICAgaWYg
KG9yaWVudGF0aW9uQ2hhbmdlZCAmJiB2aWV3U3RhdGUuaXNab29tVG9GaXRTY2FsZSkKKyAgICAg
ICAgc2NhbGUgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OlNjcmVlbjo6d2lkdGgo
KSAqIHNjYWxlIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3Jh
cGhpY3M6OlNjcmVlbjo6aGVpZ2h0KCkpOworICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fYmFja2lu
Z1N0b3JlLT5kLT5zdXNwZW5kU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcygpOyAvLyBkb24n
dCBmbGFzaCBjaGVja2VyYm9hcmQgZm9yIHRoZSBzZXRTY3JvbGxQb3NpdGlvbiBjYWxsCisgICAg
bV9mcmFtZS0+dmlldygpLT5zZXRDb250ZW50c1NpemVGcm9tSGlzdG9yeShjb250ZW50c1NpemUp
OworCisgICAgLy8gSGVyZSB3ZSBuZWVkIHRvIHNldCBzY3JvbGwgcG9zaXRpb24gd2hhdCB3ZSBh
c2tlZCBmb3IuCisgICAgLy8gU28gd2UgdXNlIFNjcm9sbFZpZXc6OnNldENhbk92ZXJzY3JvbGwo
dHJ1ZSkuCisgICAgYm9vbCBvbGRDYW5PdmVyc2Nyb2xsID0gbV9mcmFtZS0+dmlldygpLT5jYW5P
dmVyU2Nyb2xsKCk7CisgICAgbV9mcmFtZS0+dmlldygpLT5zZXRDYW5PdmVyc2Nyb2xsKHRydWUp
OworICAgIG1fd2ViUGFnZVByaXZhdGUtPnNldFNjcm9sbFBvc2l0aW9uKHNjcm9sbFBvc2l0aW9u
KTsKKyAgICBtX2ZyYW1lLT52aWV3KCktPnNldENhbk92ZXJzY3JvbGwob2xkQ2FuT3ZlcnNjcm9s
bCk7CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX3Nob3VsZFJlZmxvd0Jsb2NrID0gdmlld1N0
YXRlLnNob3VsZFJlZmxvd0Jsb2NrOworCisgICAgLy8gV2lsbCByZXN0b3JlIHVwZGF0ZXMgdG8g
YmFja2luZ3N0b3JlIGd1YXJhbnRlZWQhCisgICAgaWYgKCFtX3dlYlBhZ2VQcml2YXRlLT56b29t
QWJvdXRQb2ludChzY2FsZSwgbV9mcmFtZS0+dmlldygpLT5zY3JvbGxQb3NpdGlvbigpLCB0cnVl
IC8qIGVuZm9yY2VTY2FsZUNsYW1waW5nICovLCB0cnVlIC8qZm9yY2VSZW5kZXJpbmcqLywgdHJ1
ZSAvKmlzUmVzdG9yaW5nWm9vbUxldmVsKi8pKSB7CisgICAgICAgIC8vIElmIHdlJ3JlIGFscmVh
ZHkgYXQgdGhhdCBzY2FsZSwgdGhlbiB3ZSBzaG91bGQgc3RpbGwgZm9yY2UgcmVuZGVyaW5nIHNp
bmNlCisgICAgICAgIC8vIG91ciBzY3JvbGwgcG9zaXRpb24gY2hhbmdlZC4KKyAgICAgICAgbV93
ZWJQYWdlUHJpdmF0ZS0+bV9iYWNraW5nU3RvcmUtPmQtPnJlbmRlclZpc2libGVDb250ZW50cygp
OworCisgICAgICAgIC8vIFdlIG5lZWQgdG8gbm90aWZ5IHRoZSBjbGllbnQgb2YgdGhlIHNjcm9s
bCBwb3NpdGlvbiBhbmQgY29udGVudCBzaXplIGNoYW5nZShzKSBhYm92ZSBldmVuIGlmIHdlIGRp
ZG4ndCBzY2FsZS4KKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bm90aWZ5VHJhbnNmb3JtZWRD
b250ZW50c1NpemVDaGFuZ2VkKCk7CisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm5vdGlmeVRy
YW5zZm9ybWVkU2Nyb2xsQ2hhbmdlZCgpOworICAgIH0KK30KKworUG9saWN5QWN0aW9uIEZyYW1l
TG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGVjaWRlUG9saWN5Rm9yRXh0ZXJuYWxMb2FkKGNvbnN0
IFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCwgYm9vbCBpc0ZyYWdtZW50U2Nyb2xsKQoreworICAg
IGNvbnN0IEtVUkwmIHVybCA9IHJlcXVlc3QudXJsKCk7CisgICAgU3RyaW5nIHBhdHRlcm4gPSBt
X3dlYlBhZ2VQcml2YXRlLT5maW5kUGF0dGVyblN0cmluZ0ZvclVybCh1cmwpOworICAgIGlmICgh
cGF0dGVybi5pc0VtcHR5KCkpIHsKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQt
PmhhbmRsZVN0cmluZ1BhdHRlcm4ocGF0dGVybi5jaGFyYWN0ZXJzKCksIHBhdHRlcm4ubGVuZ3Ro
KCkpOworICAgICAgICByZXR1cm4gUG9saWN5SWdub3JlOworICAgIH0KKworICAgIGlmIChtX3dl
YlBhZ2VQcml2YXRlLT5tX3dlYlNldHRpbmdzLT5hcmVMaW5rc0hhbmRsZWRFeHRlcm5hbGx5KCkK
KyAgICAgICAgICAgICYmIGlzTWFpbkZyYW1lKCkKKyAgICAgICAgICAgICYmICFyZXF1ZXN0Lm11
c3RIYW5kbGVJbnRlcm5hbGx5KCkKKyAgICAgICAgICAgICYmICFpc0ZyYWdtZW50U2Nyb2xsKSB7
CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdCBwbGF0Zm9ybVJl
cXVlc3Q7CisgICAgICAgIHJlcXVlc3QuaW5pdGlhbGl6ZVBsYXRmb3JtUmVxdWVzdChwbGF0Zm9y
bVJlcXVlc3QpOworICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+aGFuZGxlRXh0
ZXJuYWxMaW5rKHBsYXRmb3JtUmVxdWVzdCwgcmVxdWVzdC5hbmNob3JUZXh0KCkuY2hhcmFjdGVy
cygpLCByZXF1ZXN0LmFuY2hvclRleHQoKS5sZW5ndGgoKSwgbV9jbGllbnRSZWRpcmVjdElzUGVu
ZGluZyk7CisgICAgICAgIHJldHVybiBQb2xpY3lJZ25vcmU7CisgICAgfQorCisgICAgcmV0dXJu
IFBvbGljeVVzZTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OndpbGxE
ZWZlckxvYWRpbmcoKQoreworICAgIG1fZGVmZXJyZWRKb2JzVGltZXItPnN0b3AoKTsKKworICAg
IGlmICghaXNNYWluRnJhbWUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV93ZWJQYWdlUHJp
dmF0ZS0+d2lsbERlZmVyTG9hZGluZygpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50Qmxh
Y2tCZXJyeTo6ZGlkUmVzdW1lTG9hZGluZygpCit7CisgICAgaWYgKCFtX2RlZmVycmVkTWFudWFs
U2NyaXB0LmlzTnVsbCgpKQorICAgICAgICBtX2RlZmVycmVkSm9ic1RpbWVyLT5zdGFydE9uZVNo
b3QoMCk7CisKKyAgICBpZiAoIWlzTWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IG1fd2ViUGFnZVByaXZhdGUtPmRpZFJlc3VtZUxvYWRpbmcoKTsKK30KKwordm9pZCBGcmFtZUxv
YWRlckNsaWVudEJsYWNrQmVycnk6OnNldERlZmVycmVkTWFudWFsU2NyaXB0KGNvbnN0IEtVUkwm
IHNjcmlwdCkKK3sKKyAgICBBU1NFUlQoIW1fZGVmZXJyZWRKb2JzVGltZXItPmlzQWN0aXZlKCkp
OworICAgIG1fZGVmZXJyZWRNYW51YWxTY3JpcHQgPSBzY3JpcHQ7Cit9CisKK3ZvaWQgRnJhbWVM
b2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkZWZlcnJlZEpvYnNUaW1lckZpcmVkKFRpbWVyPEZyYW1l
TG9hZGVyQ2xpZW50QmxhY2tCZXJyeT4qKQoreworICAgIEFTU0VSVCghbV9mcmFtZS0+cGFnZSgp
LT5kZWZlcnNMb2FkaW5nKCkpOworCisgICAgaWYgKCFtX2RlZmVycmVkTWFudWFsU2NyaXB0Lmlz
TnVsbCgpKSB7CisgICAgICAgIC8vIEV4ZWN1dGluZyB0aGUgc2NyaXB0IHdpbGwgc2V0IGRlZmVy
cmVkIGxvYWRpbmcsIHdoaWNoIGNvdWxkIHRyaWdnZXIgdGhpcyB0aW1lciBhZ2FpbiBpZiBhIHNj
cmlwdCBpcyBzZXQuIFNvIGNsZWFyIHRoZSBzY3JpcHQgZmlyc3QuCisgICAgICAgIEtVUkwgc2Ny
aXB0ID0gbV9kZWZlcnJlZE1hbnVhbFNjcmlwdDsKKyAgICAgICAgbV9kZWZlcnJlZE1hbnVhbFNj
cmlwdCA9IEtVUkwoKTsKKworICAgICAgICBtX2ZyYW1lLT5zY3JpcHQoKS0+ZXhlY3V0ZUlmSmF2
YVNjcmlwdFVSTChzY3JpcHQpOworICAgIH0KKworICAgIEFTU0VSVCghbV9mcmFtZS0+cGFnZSgp
LT5kZWZlcnNMb2FkaW5nKCkpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJy
eTo6cmVhZHlUb1JlbmRlcihib29sIHBhZ2VJc1Zpc3VhbGx5Tm9uRW1wdHkpCit7CisgICAgLy8g
T25seSBzZW5kIHRoZSBub3RpZmljYXRpb24gb25jZS4KKyAgICBpZiAoIW1fc2VudFJlYWR5VG9S
ZW5kZXIpIHsKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlmeUxvYWRS
ZWFkeVRvUmVuZGVyKHBhZ2VJc1Zpc3VhbGx5Tm9uRW1wdHkpOworICAgICAgICBtX3NlbnRSZWFk
eVRvUmVuZGVyID0gdHJ1ZTsKKyAgICB9Cit9CisKK1Bhc3NSZWZQdHI8RnJhbWVOZXR3b3JraW5n
Q29udGV4dD4gRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpjcmVhdGVOZXR3b3JraW5nQ29u
dGV4dCgpCit7CisgICAgcmV0dXJuIEZyYW1lTmV0d29ya2luZ0NvbnRleHRCbGFja0JlcnJ5Ojpj
cmVhdGUobV9mcmFtZSk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojph
dXRoZW50aWNhdGlvbkNoYWxsZW5nZShjb25zdCBTdHJpbmcmIHJlYWxtLCBTdHJpbmcmIHVzZXJu
YW1lLCBTdHJpbmcmIHBhc3N3b3JkKQoreworICAgIFdlYlN0cmluZyB3ZWJQYWdlVXNlcm5hbWU7
CisgICAgV2ViU3RyaW5nIHdlYlBhZ2VQYXNzd29yZDsKKworICAgIG1fd2ViUGFnZVByaXZhdGUt
Pm1fY2xpZW50LT5hdXRoZW50aWNhdGlvbkNoYWxsZW5nZShyZWFsbS5jaGFyYWN0ZXJzKCksIHJl
YWxtLmxlbmd0aCgpLCB3ZWJQYWdlVXNlcm5hbWUsIHdlYlBhZ2VQYXNzd29yZCk7CisKKyAgICB1
c2VybmFtZSA9IHdlYlBhZ2VVc2VybmFtZTsKKyAgICBwYXNzd29yZCA9IHdlYlBhZ2VQYXNzd29y
ZDsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OnN0YXJ0RG93bmxvYWQo
Y29uc3QgUmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0LCBjb25zdCBTdHJpbmcmIC8qc3VnZ2VzdGVk
TmFtZSovKQoreworICAgIC8vIEZJWE1FOiB1c2UgdGhlIHN1Z2dlc3RlZE5hbWU/CisgICAgbV93
ZWJQYWdlUHJpdmF0ZS0+bG9hZChyZXF1ZXN0LnVybCgpLnN0cmluZygpLnV0ZjgoKS5kYXRhKCks
IDAsICJHRVQiLCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OlVzZVByb3Rv
Y29sQ2FjaGVQb2xpY3ksIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgIiIpOworfQor
Cit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZG93bmxvYWQoUmVzb3VyY2VIYW5k
bGUqIGhhbmRsZSwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0
JiwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYgcikKK3sKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6RmlsdGVyU3RyZWFtKiBzdHJlYW0gPSBOZXR3b3JrTWFuYWdlcjo6aW5zdGFuY2UoKS0+c3Ry
ZWFtRm9ySGFuZGxlKGhhbmRsZSk7CisgICAgQVNTRVJUKHN0cmVhbSk7CisKKyAgICBtX3dlYlBh
Z2VQcml2YXRlLT5tX2NsaWVudC0+ZG93bmxvYWRSZXF1ZXN0ZWQoc3RyZWFtLCByLnN1Z2dlc3Rl
ZEZpbGVuYW1lKCkpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlz
cGF0Y2hEaWRSZWNlaXZlSWNvbigpCit7CisgICAgU3RyaW5nIHVybCA9IG1fZnJhbWUtPmRvY3Vt
ZW50KCktPnVybCgpLnN0cmluZygpOworICAgIEltYWdlKiBpbWcgPSBpY29uRGF0YWJhc2UoKS5z
eW5jaHJvbm91c0ljb25Gb3JQYWdlVVJMKHVybCwgSW50U2l6ZSgxMCwgMTApKTsKKyAgICBTdHJp
bmcgaWNvblVybCA9IGljb25EYXRhYmFzZSgpLnN5bmNocm9ub3VzSWNvblVSTEZvclBhZ2VVUkwo
dXJsKTsKKyAgICBpZiAoaW1nICYmIGltZy0+ZGF0YSgpKSB7CisgICAgICAgIE5hdGl2ZUltYWdl
U2tpYSogYml0bWFwPSBpbWctPm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCk7CisgICAgICAg
IGlmICghYml0bWFwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBiaXRtYXAtPmxvY2tQ
aXhlbHMoKTsKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPnNldEZhdmljb24o
aW1nLT53aWR0aCgpLCBpbWctPmhlaWdodCgpLCAodW5zaWduZWQgY2hhciopYml0bWFwLT5nZXRQ
aXhlbHMoKSwgaWNvblVybC51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgYml0bWFwLT51bmxvY2tQ
aXhlbHMoKTsKKyAgICB9Cit9CisKK2Jvb2wgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpj
YW5DYWNoZVBhZ2UoKSBjb25zdAoreworICAgIC8vIFdlIHdvbid0IGNhY2hlIHBhZ2VzIGNvbnRh
aW5pbmcgdmlkZW8gb3IgYXVkaW8uCisgICAgQVNTRVJUKG1fZnJhbWUtPmRvY3VtZW50KCkpOwor
ICAgIFJlZlB0cjxOb2RlTGlzdD4gbm9kZUxpc3QgPSBtX2ZyYW1lLT5kb2N1bWVudCgpLT5nZXRF
bGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTsKKyAgICBpZiAobm9kZUxpc3QuZ2V0KCktPmxlbmd0
aCgpID4gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIG5vZGVMaXN0ID0gbV9mcmFtZS0+
ZG9jdW1lbnQoKS0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoImF1ZGlvIik7CisgICAgaWYgKG5vZGVM
aXN0LmdldCgpLT5sZW5ndGgoKSA+IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8v
IFRoZSBtdWx0aXBhcnQgb2YgIm11bHRpcGFydC94LW1peGVkLXJlcGxhY2UiIG9ubHkgc3VwcG9y
dHMgaW1hZ2UsIGNvcnJlY3Q/CisgICAgLy8gd2UgbWF5IGhhdmUgYSBiZXR0ZXIgcGxhY2UgdG8g
aGFuZGxlIHRoaXMgY2FzZT8KKyAgICBub2RlTGlzdCA9IG1fZnJhbWUtPmRvY3VtZW50KCktPmdl
dEVsZW1lbnRzQnlUYWdOYW1lKCJpbWciKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
bm9kZUxpc3QuZ2V0KCktPmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgSFRNTEltYWdlRWxlbWVu
dCogbm9kZSA9IHN0YXRpY19jYXN0PEhUTUxJbWFnZUVsZW1lbnQqPihub2RlTGlzdC5nZXQoKS0+
aXRlbShpKSk7CisgICAgICAgIENhY2hlZEltYWdlKiBjYWNoZWRpbWFnZSA9IG5vZGUgPyBub2Rl
LT5jYWNoZWRJbWFnZSgpIDogMDsKKyAgICAgICAgaWYgKGNhY2hlZGltYWdlICYmIGNhY2hlZGlt
YWdlLT5yZXNwb25zZSgpLmlzTXVsdGlwYXJ0UGF5bG9hZCgpKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNs
aWVudEJsYWNrQmVycnk6OnByb3Zpc2lvbmFsTG9hZFN0YXJ0ZWQoKQoreworICAgIC8vIFdlIHdv
dWxkIGxpa2UgdG8gaGlkZSB0aGUgdmlydHVhbCBrZXlib2FyZCBiZWZvcmUgaXQgbmF2aWdhdGVz
IHRvIGFub3RoZXIgcGFnZQorICAgIC8vIHNvIHRoYXQgdGhlIHNjcm9sbCBvZmZzZXQgd2l0aG91
dCBrZXlib2FyZCBzaG93biB3aWxsIGJlIHNhdmVkIGluIHRoZSBoaXN0b3J5IGl0ZW0uCisgICAg
Ly8gYW5kIHRoZW4gd2hlbiB0aGUgdXNlciBuYXZpZ2F0ZXMgYmFjaywgaXQgd2lsbCBzY3JvbGwg
dG8gdGhlIHJpZ2h0IHBvc2l0aW9uLgorICAgIGlmIChpc01haW5GcmFtZSgpKQorICAgICAgICBt
X3dlYlBhZ2VQcml2YXRlLT5zaG93VmlydHVhbEtleWJvYXJkKGZhbHNlKTsKK30KKworLy8gV2Ug
ZG9uJ3QgbmVlZCB0byBwcm92aWRlIHRoZSBlcnJvciBtZXNzYWdlIHN0cmluZywgdGhhdCB3aWxs
IGJlIGhhbmRsZWQgaW4gQnJvd3NlckVycm9yUGFnZSBhY2NvcmRpbmcgdG8gdGhlIGVycm9yIGNv
ZGUuCitSZXNvdXJjZUVycm9yIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y2Fubm90U2hv
d1VSTEVycm9yKGNvbnN0IFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCkKK3sKKyAgICAvLyBGSVhN
RTogV2h5IGFyZSB3ZSBub3QgcGFzc2luZyB0aGUgZG9tYWluIHRvIHRoZSBSZXNvdXJjZUVycm9y
PyBTZWUgUFIgIzExOTc4OS4KKyAgICByZXR1cm4gUmVzb3VyY2VFcnJvcihTdHJpbmcoKSwgV2Vi
S2l0RXJyb3JDYW5ub3RTaG93VVJMLCByZXF1ZXN0LnVybCgpLnN0cmluZygpLCBTdHJpbmcoKSk7
Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaWRSZXN0b3JlRnJvbVBh
Z2VDYWNoZSgpCit7CisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9kaWRSZXN0b3JlRnJvbVBhZ2VD
YWNoZSA9IHRydWU7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNw
YXRjaFdpbGxVcGRhdGVBcHBsaWNhdGlvbkNhY2hlKGNvbnN0IFJlc291cmNlUmVxdWVzdCYpCit7
CisgICAgQVNTRVJUKGlzTWFpbkZyYW1lKCkpOworICAgIGlmICghaXNNYWluRnJhbWUoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlmeVdp
bGxVcGRhdGVBcHBsaWNhdGlvbkNhY2hlKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5OjpkaXNwYXRjaERpZExvYWRGcm9tQXBwbGljYXRpb25DYWNoZShjb25zdCBSZXNv
dXJjZVJlcXVlc3QmKQoreworICAgIEFTU0VSVChpc01haW5GcmFtZSgpKTsKKyAgICBpZiAoIWlz
TWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fd2ViUGFnZVByaXZhdGUtPm1f
Y2xpZW50LT5ub3RpZnlEaWRMb2FkRnJvbUFwcGxpY2F0aW9uQ2FjaGUoKTsKK30KKworfSAvLyBX
ZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViQ29yZVN1cHBv
cnQvRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5LmggYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVy
cnkvV2ViQ29yZVN1cHBvcnQvRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5LmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uOTQ3NTg5ZjZmN2Q4YTYwODA1YWJkNTFiNjIyZDE5NGNkZTIxMzU1YgotLS0gL2Rldi9udWxs
CisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRl
ckNsaWVudEJsYWNrQmVycnkuaApAQCAtMCwwICsxLDIzNyBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNl
bnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNv
ZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIEZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeV9oCisjZGVmaW5lIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJy
eV9oCisKKyNpbmNsdWRlICJEb2N1bWVudExvYWRlci5oIgorI2luY2x1ZGUgIkZvcm1TdGF0ZS5o
IgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkZXJDbGllbnQuaCIKKyNp
bmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIldpZGdldC5oIgorCituYW1lc3Bh
Y2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2UgV2ViS2l0IHsKK2NsYXNzIFdlYlBhZ2VQcml2YXRl
OworfQorfQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEZyYW1lTmV0d29ya2luZ0Nv
bnRleHQ7CitjbGFzcyBHZW9sb2NhdGlvbjsKK2NsYXNzIEhUTUxGb3JtRWxlbWVudDsKKworY2xh
c3MgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5IDogcHVibGljIEZyYW1lTG9hZGVyQ2xpZW50
IHsKK3B1YmxpYzoKKyAgICBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkoKTsKKyAgICB+RnJh
bWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5KCk7CisKKyAgICB2b2lkIHNldEZyYW1lKEZyYW1lKiBm
cmFtZSwgQmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJQYWdlUHJpdmF0ZSogd2ViUGFnZVByaXZhdGUp
IHsgbV9mcmFtZSA9IGZyYW1lOyBtX3dlYlBhZ2VQcml2YXRlID0gd2ViUGFnZVByaXZhdGU7IH0K
KworICAgIGludCBwbGF5ZXJJZCgpIGNvbnN0OworICAgIGJvb2wgY29va2llc0VuYWJsZWQoKSBj
b25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBmcmFtZUxvYWRlckRlc3Ryb3llZCgpOworICAgIHZp
cnR1YWwgYm9vbCBoYXNXZWJWaWV3KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHZpcnR1
YWwgdm9pZCBtYWtlUmVwcmVzZW50YXRpb24oRG9jdW1lbnRMb2FkZXIqKSB7IG5vdEltcGxlbWVu
dGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZm9yY2VMYXlvdXQoKSB7IG5vdEltcGxlbWVudGVk
KCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZm9yY2VMYXlvdXRGb3JOb25IVE1MKCkgeyBub3RJbXBs
ZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIHNldENvcGllc09uU2Nyb2xsKCkgeyBub3RJ
bXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGRldGFjaGVkRnJvbVBhcmVudDIoKTsK
KyAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoZWRGcm9tUGFyZW50MygpIHsgbm90SW1wbGVtZW50ZWQo
KTsgfQorICAgIHZpcnR1YWwgdm9pZCBhc3NpZ25JZGVudGlmaWVyVG9Jbml0aWFsUmVxdWVzdChs
b25nIHVuc2lnbmVkIGludCwgRG9jdW1lbnRMb2FkZXIqLCBjb25zdCBSZXNvdXJjZVJlcXVlc3Qm
KSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hXaWxsU2Vu
ZFJlcXVlc3QoRG9jdW1lbnRMb2FkZXIqLCBsb25nIHVuc2lnbmVkIGludCwgUmVzb3VyY2VSZXF1
ZXN0JiwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYpOworICAgIHZpcnR1YWwgYm9vbCBzaG91bGRV
c2VDcmVkZW50aWFsU3RvcmFnZShEb2N1bWVudExvYWRlciosIGxvbmcgdW5zaWduZWQgaW50KSB7
IG5vdEltcGxlbWVudGVkKCk7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgdm9pZCBkaXNw
YXRjaERpZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShEb2N1bWVudExvYWRlciosIGxv
bmcgdW5zaWduZWQgaW50LCBjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpIHsgbm90SW1w
bGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZENhbmNlbEF1dGhlbnRp
Y2F0aW9uQ2hhbGxlbmdlKERvY3VtZW50TG9hZGVyKiwgbG9uZyB1bnNpZ25lZCBpbnQsIGNvbnN0
IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJikgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmly
dHVhbCB2b2lkIGRpc3BhdGNoRGlkUmVjZWl2ZVJlc3BvbnNlKERvY3VtZW50TG9hZGVyKiwgbG9u
ZyB1bnNpZ25lZCBpbnQsIGNvbnN0IFJlc291cmNlUmVzcG9uc2UmKTsKKyAgICB2aXJ0dWFsIHZv
aWQgZGlzcGF0Y2hEaWRSZWNlaXZlQ29udGVudExlbmd0aChEb2N1bWVudExvYWRlciosIGxvbmcg
dW5zaWduZWQgaW50LCBpbnQpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9p
ZCBkaXNwYXRjaERpZEZpbmlzaExvYWRpbmcoRG9jdW1lbnRMb2FkZXIqLCBsb25nIHVuc2lnbmVk
IGludCkgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlk
RmFpbExvYWRpbmcoRG9jdW1lbnRMb2FkZXIqLCBsb25nIHVuc2lnbmVkIGludCwgY29uc3QgUmVz
b3VyY2VFcnJvciYpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgYm9vbCBkaXNw
YXRjaERpZExvYWRSZXNvdXJjZUZyb21NZW1vcnlDYWNoZShEb2N1bWVudExvYWRlciosIGNvbnN0
IFJlc291cmNlUmVxdWVzdCYsIGNvbnN0IFJlc291cmNlUmVzcG9uc2UmLCBpbnQpIHsgbm90SW1w
bGVtZW50ZWQoKTsgcmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlk
SGFuZGxlT25sb2FkRXZlbnRzKCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkUmVjZWl2
ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxMb2FkKCkgeyBub3RJbXBsZW1lbnRlZCgpOyB9
CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkQ2FuY2VsQ2xpZW50UmVkaXJlY3QoKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hXaWxsUGVyZm9ybUNsaWVudFJlZGlyZWN0KGNvbnN0IEtV
UkwmLCBkb3VibGUsIGRvdWJsZSk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkQ2hhbmdl
TG9jYXRpb25XaXRoaW5QYWdlKCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkUHVzaFN0
YXRlV2l0aGluUGFnZSgpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZFJlcGxhY2VTdGF0
ZVdpdGhpblBhZ2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRQb3BTdGF0ZVdpdGhp
blBhZ2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hXaWxsQ2xvc2UoKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZGlzcGF0Y2hEaWRSZWNlaXZlSWNvbigpOworICAgIHZpcnR1YWwgdm9pZCBkaXNw
YXRjaERpZFN0YXJ0UHJvdmlzaW9uYWxMb2FkKCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNo
RGlkUmVjZWl2ZVRpdGxlKGNvbnN0IFN0cmluZ1dpdGhEaXJlY3Rpb24mKTsKKyAgICB2aXJ0dWFs
IHZvaWQgc2V0VGl0bGUoY29uc3QgU3RyaW5nV2l0aERpcmVjdGlvbiYgdGl0bGUsIGNvbnN0IEtV
UkwmKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRDb21taXRMb2FkKCk7CisgICAgdmly
dHVhbCB2b2lkIGRpc3BhdGNoRGlkRmFpbFByb3Zpc2lvbmFsTG9hZChjb25zdCBSZXNvdXJjZUVy
cm9yJik7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkRmFpbExvYWQoY29uc3QgUmVzb3Vy
Y2VFcnJvciYpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZEZpbmlzaERvY3VtZW50TG9h
ZCgpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZEZpbmlzaExvYWQoKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZGlzcGF0Y2hEaWRGaXJzdExheW91dCgpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQor
ICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZEZpcnN0VmlzdWFsbHlOb25FbXB0eUxheW91dCgp
OworICAgIHZpcnR1YWwgRnJhbWUqIGRpc3BhdGNoQ3JlYXRlUGFnZShjb25zdCBOYXZpZ2F0aW9u
QWN0aW9uJik7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoU2hvdygpIHsgbm90SW1wbGVtZW50
ZWQoKTsgfQorCisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGVjaWRlUG9saWN5Rm9yUmVzcG9u
c2UoRnJhbWVQb2xpY3lGdW5jdGlvbiwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYsIGNvbnN0IFJl
c291cmNlUmVxdWVzdCYpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERlY2lkZVBvbGljeUZv
ck5ld1dpbmRvd0FjdGlvbihGcmFtZVBvbGljeUZ1bmN0aW9uLCBjb25zdCBOYXZpZ2F0aW9uQWN0
aW9uJiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiwgUGFzc1JlZlB0cjxGb3JtU3RhdGU+LCBjb25z
dCBTdHJpbmcmIGZyYW1lTmFtZSk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGVjaWRlUG9s
aWN5Rm9yTmF2aWdhdGlvbkFjdGlvbihGcmFtZVBvbGljeUZ1bmN0aW9uLCBjb25zdCBOYXZpZ2F0
aW9uQWN0aW9uJiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiwgUGFzc1JlZlB0cjxGb3JtU3RhdGU+
KTsKKyAgICB2aXJ0dWFsIHZvaWQgY2FuY2VsUG9saWN5Q2hlY2soKTsKKyAgICB2aXJ0dWFsIHZv
aWQgZGlzcGF0Y2hVbmFibGVUb0ltcGxlbWVudFBvbGljeShjb25zdCBSZXNvdXJjZUVycm9yJikg
eyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoV2lsbFN1Ym1p
dEZvcm0oRnJhbWVQb2xpY3lGdW5jdGlvbiwgUGFzc1JlZlB0cjxGb3JtU3RhdGU+KTsKKyAgICB2
aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRMb2FkTWFpblJlc291cmNlKERvY3VtZW50TG9hZGVyKikg
eyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIHJldmVydFRvUHJvdmlzaW9u
YWxTdGF0ZShEb2N1bWVudExvYWRlciopIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1
YWwgdm9pZCBzZXRNYWluRG9jdW1lbnRFcnJvcihEb2N1bWVudExvYWRlciosIGNvbnN0IFJlc291
cmNlRXJyb3ImKTsKKyAgICB2aXJ0dWFsIHZvaWQgcG9zdFByb2dyZXNzU3RhcnRlZE5vdGlmaWNh
dGlvbigpOworICAgIHZpcnR1YWwgdm9pZCBwb3N0UHJvZ3Jlc3NFc3RpbWF0ZUNoYW5nZWROb3Rp
ZmljYXRpb24oKTsKKyAgICB2aXJ0dWFsIHZvaWQgcG9zdFByb2dyZXNzRmluaXNoZWROb3RpZmlj
YXRpb24oKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TWFpbkZyYW1lRG9jdW1lbnRSZWFkeShib29s
KSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnREb3dubG9hZChj
b25zdCBSZXNvdXJjZVJlcXVlc3QmLCBjb25zdCBTdHJpbmcmIHN1Z2dlc3RlZE5hbWUgPSBTdHJp
bmcoKSk7CisgICAgdmlydHVhbCB2b2lkIHdpbGxDaGFuZ2VUaXRsZShEb2N1bWVudExvYWRlciop
IHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBkaWRDaGFuZ2VUaXRsZShE
b2N1bWVudExvYWRlciopIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBj
b21taXR0ZWRMb2FkKERvY3VtZW50TG9hZGVyKiwgY29uc3QgY2hhciosIGludCk7CisgICAgdmly
dHVhbCB2b2lkIGZpbmlzaGVkTG9hZGluZyhEb2N1bWVudExvYWRlciopOworICAgIHZpcnR1YWwg
dm9pZCB1cGRhdGVHbG9iYWxIaXN0b3J5KCkgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmly
dHVhbCB2b2lkIHVwZGF0ZUdsb2JhbEhpc3RvcnlSZWRpcmVjdExpbmtzKCkgeyBub3RJbXBsZW1l
bnRlZCgpOyB9CisgICAgdmlydHVhbCBib29sIHNob3VsZEdvVG9IaXN0b3J5SXRlbShIaXN0b3J5
SXRlbSopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBzaG91bGRTdG9wTG9hZGluZ0Zvckhpc3Rv
cnlJdGVtKEhpc3RvcnlJdGVtKikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlk
QWRkQmFja0ZvcndhcmRJdGVtKEhpc3RvcnlJdGVtKikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lk
IGRpc3BhdGNoRGlkUmVtb3ZlQmFja0ZvcndhcmRJdGVtKEhpc3RvcnlJdGVtKikgY29uc3Q7Cisg
ICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkQ2hhbmdlQmFja0ZvcndhcmRJbmRleCgpIGNvbnN0
OworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaFdpbGxVcGRhdGVBcHBsaWNhdGlvbkNhY2hlKGNv
bnN0IFJlc291cmNlUmVxdWVzdCYpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZExvYWRG
cm9tQXBwbGljYXRpb25DYWNoZShjb25zdCBSZXNvdXJjZVJlcXVlc3QmKTsKKyAgICB2aXJ0dWFs
IHZvaWQgZGlkRGlzcGxheUluc2VjdXJlQ29udGVudCgpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQor
ICAgIHZpcnR1YWwgdm9pZCBkaWRSdW5JbnNlY3VyZUNvbnRlbnQoU2VjdXJpdHlPcmlnaW4qLCBj
b25zdCBLVVJMJikgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCBSZXNvdXJjZUVy
cm9yIGludGVycnVwdGVkRm9yUG9saWN5Q2hhbmdlRXJyb3IoY29uc3QgUmVzb3VyY2VSZXF1ZXN0
JikgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gUmVzb3VyY2VFcnJvcigiIiwgMCwgIiIsICIi
KTsgfQorICAgIHZpcnR1YWwgUmVzb3VyY2VFcnJvciBjYW5jZWxsZWRFcnJvcihjb25zdCBSZXNv
dXJjZVJlcXVlc3QmKSB7IG5vdEltcGxlbWVudGVkKCk7IHJldHVybiBSZXNvdXJjZUVycm9yKCIi
LCAwLCAiIiwgIiIpOyB9CisgICAgdmlydHVhbCBSZXNvdXJjZUVycm9yIGJsb2NrZWRFcnJvcihj
b25zdCBSZXNvdXJjZVJlcXVlc3QmKSB7IG5vdEltcGxlbWVudGVkKCk7IHJldHVybiBSZXNvdXJj
ZUVycm9yKCIiLCAwLCAiIiwgIiIpOyB9CisgICAgdmlydHVhbCBSZXNvdXJjZUVycm9yIGNhbm5v
dFNob3dVUkxFcnJvcihjb25zdCBSZXNvdXJjZVJlcXVlc3QmKTsKKyAgICB2aXJ0dWFsIFJlc291
cmNlRXJyb3IgaW50ZXJydXB0Rm9yUG9saWN5Q2hhbmdlRXJyb3IoY29uc3QgUmVzb3VyY2VSZXF1
ZXN0JikgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gUmVzb3VyY2VFcnJvcigiIiwgMCwgIiIs
ICIiKTsgfQorICAgIHZpcnR1YWwgUmVzb3VyY2VFcnJvciBjYW5ub3RTaG93TUlNRVR5cGVFcnJv
cihjb25zdCBSZXNvdXJjZVJlc3BvbnNlJikgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gUmVz
b3VyY2VFcnJvcigiIiwgMCwgIiIsICIiKTsgfQorICAgIHZpcnR1YWwgUmVzb3VyY2VFcnJvciBm
aWxlRG9lc05vdEV4aXN0RXJyb3IoY29uc3QgUmVzb3VyY2VSZXNwb25zZSYpIHsgbm90SW1wbGVt
ZW50ZWQoKTsgcmV0dXJuIFJlc291cmNlRXJyb3IoIiIsIDAsICIiLCAiIik7IH0KKyAgICB2aXJ0
dWFsIFJlc291cmNlRXJyb3IgcGx1Z2luV2lsbEhhbmRsZUxvYWRFcnJvcihjb25zdCBSZXNvdXJj
ZVJlc3BvbnNlJikgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gUmVzb3VyY2VFcnJvcigiIiwg
MCwgIiIsICIiKTsgfQorICAgIHZpcnR1YWwgYm9vbCBzaG91bGRGYWxsQmFjayhjb25zdCBSZXNv
dXJjZUVycm9yJikgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0
dWFsIGJvb2wgY2FuSGFuZGxlUmVxdWVzdChjb25zdCBSZXNvdXJjZVJlcXVlc3QmKSBjb25zdDsK
KyAgICB2aXJ0dWFsIGJvb2wgY2FuU2hvd01JTUVUeXBlKGNvbnN0IFN0cmluZyYpIGNvbnN0Owor
ICAgIHZpcnR1YWwgYm9vbCBjYW5TaG93TUlNRVR5cGVBc0hUTUwoY29uc3QgU3RyaW5nJikgY29u
c3Q7CisgICAgdmlydHVhbCBib29sIHJlcHJlc2VudGF0aW9uRXhpc3RzRm9yVVJMU2NoZW1lKGNv
bnN0IFN0cmluZyYpIGNvbnN0IHsgbm90SW1wbGVtZW50ZWQoKTsgcmV0dXJuIGZhbHNlOyB9Cisg
ICAgdmlydHVhbCBTdHJpbmcgZ2VuZXJhdGVkTUlNRVR5cGVGb3JVUkxTY2hlbWUoY29uc3QgU3Ry
aW5nJikgY29uc3QgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gU3RyaW5nKCk7IH0KKyAgICB2
aXJ0dWFsIHZvaWQgZnJhbWVMb2FkQ29tcGxldGVkKCkgeyBub3RJbXBsZW1lbnRlZCgpOyB9Cisg
ICAgdmlydHVhbCB2b2lkIHNhdmVWaWV3U3RhdGVUb0l0ZW0oSGlzdG9yeUl0ZW0qKTsKKyAgICB2
aXJ0dWFsIHZvaWQgcmVzdG9yZVZpZXdTdGF0ZSgpOworICAgIHZpcnR1YWwgdm9pZCBwcm92aXNp
b25hbExvYWRTdGFydGVkKCk7CisgICAgdmlydHVhbCB2b2lkIGRpZEZpbmlzaExvYWQoKSB7IG5v
dEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUZvckRhdGFTb3VyY2VS
ZXBsYWNlbWVudCgpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0
cjxEb2N1bWVudExvYWRlcj4gY3JlYXRlRG9jdW1lbnRMb2FkZXIoY29uc3QgUmVzb3VyY2VSZXF1
ZXN0JiwgY29uc3QgU3Vic3RpdHV0ZURhdGEmKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0VGl0bGUo
Y29uc3QgU3RyaW5nJiwgY29uc3QgS1VSTCYpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZp
cnR1YWwgU3RyaW5nIHVzZXJBZ2VudChjb25zdCBLVVJMJik7CisgICAgdmlydHVhbCB2b2lkIHNh
dmVQbGF0Zm9ybURhdGFUb0NhY2hlZEZyYW1lKENhY2hlZEZyYW1lKikgeyBub3RJbXBsZW1lbnRl
ZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIHRyYW5zaXRpb25Ub0NvbW1pdHRlZEZyb21DYWNoZWRG
cmFtZShDYWNoZWRGcmFtZSopIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9p
ZCB0cmFuc2l0aW9uVG9Db21taXR0ZWRGb3JOZXdQYWdlKCk7CisgICAgdmlydHVhbCBib29sIGNh
bkNhY2hlUGFnZSgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBkaWRTYXZlVG9QYWdlQ2FjaGUo
KSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlkUmVzdG9yZUZyb21QYWdlQ2FjaGUoKTsKKyAgICB2
aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRCZWNvbWVGcmFtZXNldChib29sKSB7IH0KKyAgICB2aXJ0
dWFsIHZvaWQgZG93bmxvYWQoUmVzb3VyY2VIYW5kbGUqLCBjb25zdCBSZXNvdXJjZVJlcXVlc3Qm
LCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmLCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJik7CisgICAg
dmlydHVhbCBQYXNzUmVmUHRyPEZyYW1lPiBjcmVhdGVGcmFtZShjb25zdCBLVVJMJiwgY29uc3Qg
U3RyaW5nJiwgSFRNTEZyYW1lT3duZXJFbGVtZW50KiwgY29uc3QgU3RyaW5nJiwgYm9vbCwgaW50
LCBpbnQpOworICAgIHZpcnR1YWwgdm9pZCBkaWRUcmFuc2ZlckNoaWxkRnJhbWVUb05ld0RvY3Vt
ZW50KFBhZ2UqKTsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8V2lkZ2V0PiBjcmVhdGVQbHVnaW4o
Y29uc3QgSW50U2l6ZSYsIEhUTUxQbHVnSW5FbGVtZW50KiwgY29uc3QgS1VSTCYsIGNvbnN0IFdU
Rjo6VmVjdG9yPFN0cmluZywgMHU+JiwgY29uc3QgV1RGOjpWZWN0b3I8U3RyaW5nLCAwdT4mLCBj
b25zdCBTdHJpbmcmLCBib29sKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVkaXJlY3REYXRhVG9QbHVn
aW4oV2lkZ2V0Kik7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPFdpZGdldD4gY3JlYXRlSmF2YUFw
cGxldFdpZGdldChjb25zdCBJbnRTaXplJiwgSFRNTEFwcGxldEVsZW1lbnQqLCBjb25zdCBLVVJM
JiwgY29uc3QgV1RGOjpWZWN0b3I8U3RyaW5nLCAwdT4mLCBjb25zdCBXVEY6OlZlY3RvcjxTdHJp
bmcsIDB1PiYpIHsgbm90SW1wbGVtZW50ZWQoKTsgcmV0dXJuIDA7IH0KKworICAgIHZpcnR1YWwg
T2JqZWN0Q29udGVudFR5cGUgb2JqZWN0Q29udGVudFR5cGUoY29uc3QgS1VSTCYsIGNvbnN0IFN0
cmluZyYgbWltZVR5cGUsIGJvb2wgc2hvdWxkUHJlZmVyUGx1Z0luc0ZvckltYWdlcyk7CisgICAg
dmlydHVhbCBTdHJpbmcgb3ZlcnJpZGVNZWRpYVR5cGUoKSBjb25zdCB7IG5vdEltcGxlbWVudGVk
KCk7IHJldHVybiBTdHJpbmcoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZENsZWFy
V2luZG93T2JqZWN0SW5Xb3JsZChET01XcmFwcGVyV29ybGQqKTsKKyAgICB2aXJ0dWFsIHZvaWQg
ZG9jdW1lbnRFbGVtZW50QXZhaWxhYmxlKCkgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmly
dHVhbCB2b2lkIGRpZFBlcmZvcm1GaXJzdE5hdmlnYXRpb24oKSBjb25zdCB7IG5vdEltcGxlbWVu
dGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJGb3JJY29uTm90aWZpY2F0aW9uKGJv
b2wpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorCisgICAgdmlydHVhbCBib29sIHNob3VsZExvYWRJ
Y29uRXh0ZXJuYWxseSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCB2b2lkIGxvYWRJ
Y29uRXh0ZXJuYWxseShjb25zdCBTdHJpbmcmIG9yaWdpbmFsUGFnZVVybCwgY29uc3QgU3RyaW5n
JiBmaW5hbFBhZ2VVcmwsIGNvbnN0IFN0cmluZyYgaWNvblVybCk7CisKKyAgICB2aXJ0dWFsIHZv
aWQgZGlkRGV0ZWN0WFNTKGNvbnN0IEtVUkwmLCBib29sKSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQg
dHJhbnNmZXJMb2FkaW5nUmVzb3VyY2VGcm9tUGFnZShSZXNvdXJjZUxvYWRlciosIGNvbnN0IFJl
c291cmNlUmVxdWVzdCYsIFBhZ2UqKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkVHJhbnNmZXJDaGls
ZEZyYW1lVG9OZXdEb2N1bWVudCgpIHsgbm90SW1wbGVtZW50ZWQoKTsgfTsKKyAgICB2aXJ0dWFs
IHZvaWQgZGlzcGF0Y2hEaWRDaGFuZ2VJY29ucyhJY29uVHlwZSkgeyBub3RJbXBsZW1lbnRlZCgp
OyB9OworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaFdpbGxTZW5kU3VibWl0RXZlbnQoSFRNTEZv
cm1FbGVtZW50KikgeyBub3RJbXBsZW1lbnRlZCgpOyB9OworCisgICAgdmlydHVhbCB2b2lkIHdp
bGxEZWZlckxvYWRpbmcoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkUmVzdW1lTG9hZGluZygpOwor
ICAgIHZpcnR1YWwgdm9pZCBhdXRoZW50aWNhdGlvbkNoYWxsZW5nZShjb25zdCBTdHJpbmcmIHJl
YWxtLCBTdHJpbmcmIHVzZXJuYW1lLCBTdHJpbmcmIHBhc3N3b3JkKTsKKworICAgIHZpcnR1YWwg
UGFzc1JlZlB0cjxGcmFtZU5ldHdvcmtpbmdDb250ZXh0PiBjcmVhdGVOZXR3b3JraW5nQ29udGV4
dCgpOworCisgICAgIC8vIFNjaGVkdWxlIGEgc2NyaXB0IHRoYXQgd2FzIGxvYWRlZCBtYW51YWxs
eSBieSB0aGUgdXNlciAoZWcuIGEKKyAgICAgLy8gYm9va21hcmtsZXQpIHdoaWxlIHBhZ2UgbG9h
ZGluZyB3YXMgZGVmZXJyZWQuCisgICAgdm9pZCBzZXREZWZlcnJlZE1hbnVhbFNjcmlwdChjb25z
dCBLVVJMJik7CisKKyAgICB2b2lkIHJlYWR5VG9SZW5kZXIoYm9vbCBwYWdlSXNWaXN1YWxseU5v
bkVtcHR5KTsKKworICAgIHZvaWQgZG9QZW5kaW5nRnJhZ21lbnRTY3JvbGwoKTsKKworICAgIC8v
IFVzZWQgdG8gc3RvcCBtZWRpYSBmaWxlcyBmcm9tIGxvYWRpbmcgYmVjYXVzZSB3ZSBkb24ndCBu
ZWVkIHRvIGhhdmUgdGhlIGVudGlyZSBmaWxlIGxvYWRlZCBieSBXZWJLaXQuCisgICAgdm9pZCBz
ZXRDYW5jZWxMb2FkT25OZXh0RGF0YSgpIHsgbV9jYW5jZWxMb2FkT25OZXh0RGF0YSA9IHRydWU7
IH0KKyAgICBib29sIHNob3VsZENhbmNlbExvYWRPbk5leHREYXRhKCkgY29uc3QgeyByZXR1cm4g
bV9jYW5jZWxMb2FkT25OZXh0RGF0YTsgfQorCisgICAgdm9pZCBzdXBwcmVzc0NoaWxkRnJhbWVD
cmVhdGlvbigpIHsgbV9jaGlsZEZyYW1lQ3JlYXRpb25TdXBwcmVzc2VkID0gdHJ1ZTsgfQorCitw
cml2YXRlOgorICAgIHZvaWQgcmVjZWl2ZWREYXRhKGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IFN0
cmluZyYpOworICAgIHZvaWQgZGlkRmluaXNoT3JGYWlsTG9hZGluZyhjb25zdCBSZXNvdXJjZUVy
cm9yJik7CisgICAgYm9vbCBpc01haW5GcmFtZSgpIGNvbnN0OworCisgICAgdm9pZCBpbnZhbGlk
YXRlQmFja0ZvcndhcmRMaXN0KCkgY29uc3Q7CisgICAgdm9pZCBub3RpZnlCYWNrRm9yd2FyZExp
c3RDaGFuZ2VkKCkgY29uc3Q7CisKKyAgICBQb2xpY3lBY3Rpb24gZGVjaWRlUG9saWN5Rm9yRXh0
ZXJuYWxMb2FkKGNvbnN0IFJlc291cmNlUmVxdWVzdCAmLCBib29sIGlzRnJhZ21lbnRTY3JvbGwp
OworICAgIHZvaWQgZGVsYXlQb2xpY3lDaGVja1VudGlsRnJhZ21lbnRFeGlzdHMoY29uc3QgU3Ry
aW5nJiBmcmFnbWVudCwgRnJhbWVQb2xpY3lGdW5jdGlvbik7CisKKyAgICB2b2lkIGRlZmVycmVk
Sm9ic1RpbWVyRmlyZWQoVGltZXI8RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5PiopOworCisg
ICAgRnJhbWUqIG1fZnJhbWU7CisgICAgUmVzb3VyY2VFcnJvciBtX2xvYWRFcnJvcjsKKyAgICBC
bGFja0JlcnJ5OjpXZWJLaXQ6OldlYlBhZ2VQcml2YXRlKiBtX3dlYlBhZ2VQcml2YXRlOworCisg
ICAgVGltZXI8RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5PiogbV9kZWZlcnJlZEpvYnNUaW1l
cjsKKyAgICBLVVJMIG1fZGVmZXJyZWRNYW51YWxTY3JpcHQ7CisgICAgR2VvbG9jYXRpb24qIG1f
Z2VvbG9jYXRpb247CisgICAgYm9vbCBtX3NlbnRSZWFkeVRvUmVuZGVyOworCisgICAgRnJhbWVQ
b2xpY3lGdW5jdGlvbiBtX3BlbmRpbmdGcmFnbWVudFNjcm9sbFBvbGljeUZ1bmN0aW9uOworICAg
IFN0cmluZyBtX3BlbmRpbmdGcmFnbWVudFNjcm9sbDsKKworICAgIGJvb2wgbV9sb2FkaW5nRXJy
b3JQYWdlOworICAgIGJvb2wgbV9jbGllbnRSZWRpcmVjdElzUGVuZGluZzsKKyAgICBib29sIG1f
Y2hpbGRGcmFtZUNyZWF0aW9uU3VwcHJlc3NlZDsKKworICAgIC8vIFRoaXMgc2V0IGluY2x1ZGVz
IHRoZSBvcmlnaW5hbCBhbmQgZmluYWwgdXJscyBmb3Igc2VydmVyIHJlZGlyZWN0cy4KKyAgICBI
YXNoU2V0PEtVUkw+IG1faGlzdG9yeU5hdmlnYXRpb25Tb3VyY2VVUkxzOworICAgIEhhc2hTZXQ8
S1VSTD4gbV9yZWRpcmVjdFVSTHNUb1NraXBEdWVUb0hpc3RvcnlOYXZpZ2F0aW9uOworCisgICAg
Ly8gUGx1Z2luIHZpZXcgdG8gcmVkaXJlY3QgZGF0YSB0by4KKyAgICBQbHVnaW5WaWV3KiBtX3Bs
dWdpblZpZXc7CisgICAgYm9vbCBtX2hhc1NlbnRSZXNwb25zZVRvUGx1Z2luOworCisgICAgLy8g
VXNlZCB0byBzdG9wIG1lZGlhIGZpbGVzIGZyb20gbG9hZGluZyBiZWNhdXNlIHdlIGRvbid0IG5l
ZWQgdG8gaGF2ZSB0aGUgZW50aXJlIGZpbGUgbG9hZGVkIGJ5IFdlYktpdC4KKyAgICBib29sIG1f
Y2FuY2VsTG9hZE9uTmV4dERhdGE7Cit9OworCit9IC8vIFdlYkNvcmUKKworI2VuZGlmIC8vIEZy
YW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeV9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126818</attachid>
            <date>2012-02-13 13:37:27 -0800</date>
            <delta_ts>2012-02-14 10:18:59 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78275-20120213163708.patch</filename>
            <type>text/plain</type>
            <size>69377</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3MTA5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDljM2E2NmRhNThjMjhhYjI5
YzQwMjQ5YzBhNTcwYTg2YTA1N2IwNTIuLjk5YjE5MjRhZDQyMTU2YzBhN2VhZGM5OTA1YmFiNzEz
MDdjYjkyMGMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTItMDItMTAgIEphY2t5IEpp
YW5nICA8emhhamlhbmdAcmltLmNvbT4KKworICAgICAgICBbQmxhY2tCZXJyeV0gVXBzdHJlYW0g
QmxhY2tCZXJyeSBXZWJDb3JlU3VwcG9ydCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkgY2xh
c3MKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc4Mjc1
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW5pdGlh
bCB1cHN0cmVhbSwgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJDb3Jl
U3VwcG9ydC9GcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkuY3BwOiBBZGRlZC4KKyAgICAgICAg
KiBibGFja2JlcnJ5L1dlYkNvcmVTdXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeS5o
OiBBZGRlZC4KKwogMjAxMi0wMi0wOCAgUm9iIEJ1aXMgIDxyYnVpc0ByaW0uY29tPgogCiAgICAg
ICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBEdW1wUmVuZGVyVHJlZUJsYWNrQmVycnkKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRl
ckNsaWVudEJsYWNrQmVycnkuY3BwIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYkNvcmVT
dXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMjNkMDUw
NGYyMDUyODJmMDhlOTAxMmQ5MWE3ZDBjNDkzMjNjNWYzNwotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRlckNsaWVudEJs
YWNrQmVycnkuY3BwCkBAIC0wLDAgKzEsMTI4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl
CisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5LmgiCisKKyNpbmNsdWRlICJCYWNr
Rm9yd2FyZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJCYWNrRm9yd2FyZExpc3RJbXBsLmgiCisj
aW5jbHVkZSAiQmFja2luZ1N0b3JlQ2xpZW50LmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlX3Au
aCIKKyNpbmNsdWRlICJCYXNlNjQuaCIKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2luY2x1
ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUgIkNocm9tZUNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNs
dWRlICJDbGllbnRFeHRlbnNpb24uaCIKKyNpbmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCisjaW5j
bHVkZSAiRHVtcFJlbmRlclRyZWVDbGllbnQuaCIKKyNpbmNsdWRlICJGcmFtZU5ldHdvcmtpbmdD
b250ZXh0QmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhU
TUxGb3JtRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxIZWFkRWxlbWVudC5oIgorI2luY2x1ZGUg
IkhUTUxJbWFnZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MTGlua0VsZW1lbnQuaCIKKyNpbmNs
dWRlICJIVE1MTWVkaWFFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTE1ldGFFbGVtZW50LmgiCisj
aW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTFBsdWdJbkVsZW1lbnQuaCIKKyNp
bmNsdWRlICJIVFRQUGFyc2Vycy5oIgorI2luY2x1ZGUgIkhpc3RvcnlJdGVtLmgiCisjaW5jbHVk
ZSAiSWNvbkRhdGFiYXNlLmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJJbnB1dEhh
bmRsZXIuaCIKKyNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAiTmF0aXZl
SW1hZ2VTa2lhLmgiCisjaW5jbHVkZSAiTmV0d29ya01hbmFnZXIuaCIKKyNpbmNsdWRlICJOb2Rl
TGlzdC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGFnZS5oIgor
I2luY2x1ZGUgIlBsdWdpblZpZXcuaCIKKyNpbmNsdWRlICJQcm9ncmVzc1RyYWNrZXIuaCIKKyNp
bmNsdWRlICJSZW5kZXJFbWJlZGRlZE9iamVjdC5oIgorI2luY2x1ZGUgIlNjb3BlUG9pbnRlci5o
IgorI2luY2x1ZGUgIlNlY3VyaXR5UG9saWN5LmgiCisjaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgi
CisjaW5jbHVkZSAiVGV4dEVuY29kaW5nLmgiCisjaW5jbHVkZSAiVG91Y2hFdmVudEhhbmRsZXIu
aCIKKyNpZiBFTkFCTEUoV0VCRE9NKQorI2luY2x1ZGUgIldlYkRPTURvY3VtZW50LmgiCisjZW5k
aWYKKyNpbmNsdWRlICJXZWJQYWdlQ2xpZW50LmgiCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxh
dGZvcm1Mb2cuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1TY3JlZW4uaD4KKyNpbmNs
dWRlIDxKYXZhU2NyaXB0Q29yZS9BUElDYXN0Lmg+CisjaW5jbHVkZSA8bmV0d29yay9GaWx0ZXJT
dHJlYW0uaD4KKyNpbmNsdWRlIDxuZXR3b3JrL05ldHdvcmtSZXF1ZXN0Lmg+CisKK3VzaW5nIFdU
Rjo6U3RyaW5nOwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Cit1c2luZyBuYW1lc3BhY2UgQmxh
Y2tCZXJyeTo6V2ViS2l0OworCisvLyBUaGlzIHdhcyBjb3BpZWQgZnJvbSBmaWxlICJXZWJLaXQv
U291cmNlL1dlYktpdC9tYWMvTWlzYy9XZWJLaXRFcnJvcnMuaCIuCitlbnVtIHsKKyAgICBXZWJL
aXRFcnJvckNhbm5vdFNob3dNSU1FVHlwZSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAx
MDAsCisgICAgV2ViS2l0RXJyb3JDYW5ub3RTaG93VVJMID0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgMTAxLAorICAgIFdlYktpdEVycm9yRnJhbWVMb2FkSW50ZXJydXB0ZWRCeVBv
bGljeUNoYW5nZSA9ICAgICAgICAgICAgIDEwMiwKKyAgICBXZWJLaXRFcnJvckNhbm5vdFVzZVJl
c3RyaWN0ZWRQb3J0ID0gICAgICAgICAgICAgICAgICAgICAgICAxMDMsCisgICAgV2ViS2l0RXJy
b3JDYW5ub3RGaW5kUGx1Z0luID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwLAor
ICAgIFdlYktpdEVycm9yQ2Fubm90TG9hZFBsdWdJbiA9ICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIDIwMSwKKyAgICBXZWJLaXRFcnJvckphdmFVbmF2YWlsYWJsZSA9ICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAyMDIsCisgICAgV2ViS2l0RXJyb3JQbHVnaW5XaWxsSGFuZGxl
TG9hZCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAzCit9OworCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6RnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5KCkKKyAgICA6IG1fZnJhbWUoMCkKKyAgICAsIG1fd2ViUGFnZVByaXZhdGUoMCkK
KyAgICAsIG1fc2VudFJlYWR5VG9SZW5kZXIoZmFsc2UpCisgICAgLCBtX3BlbmRpbmdGcmFnbWVu
dFNjcm9sbFBvbGljeUZ1bmN0aW9uKDApCisgICAgLCBtX2xvYWRpbmdFcnJvclBhZ2UoZmFsc2Up
CisgICAgLCBtX2NsaWVudFJlZGlyZWN0SXNQZW5kaW5nKGZhbHNlKQorICAgICwgbV9jaGlsZEZy
YW1lQ3JlYXRpb25TdXBwcmVzc2VkKGZhbHNlKQorICAgICwgbV9wbHVnaW5WaWV3KDApCisgICAg
LCBtX2hhc1NlbnRSZXNwb25zZVRvUGx1Z2luKGZhbHNlKQorICAgICwgbV9jYW5jZWxMb2FkT25O
ZXh0RGF0YShmYWxzZSkKK3sKKyAgICBtX2RlZmVycmVkSm9ic1RpbWVyID0gbmV3IFRpbWVyPEZy
YW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeT4odGhpcywgJkZyYW1lTG9hZGVyQ2xpZW50QmxhY2tC
ZXJyeTo6ZGVmZXJyZWRKb2JzVGltZXJGaXJlZCk7Cit9CisKK0ZyYW1lTG9hZGVyQ2xpZW50Qmxh
Y2tCZXJyeTo6fkZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeSgpCit7CisgICAgZGVsZXRlIG1f
ZGVmZXJyZWRKb2JzVGltZXI7CisgICAgbV9kZWZlcnJlZEpvYnNUaW1lciA9IDA7Cit9CisKK2lu
dCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OnBsYXllcklkKCkgY29uc3QKK3sKKyAgICBp
ZiAobV93ZWJQYWdlUHJpdmF0ZSAmJiBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudCkKKyAgICAg
ICAgcmV0dXJuIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5nZXRJbnN0YW5jZUlkKCk7Cisg
ICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpjb29r
aWVzRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fd2ViUGFnZVByaXZhdGUtPm1fd2Vi
U2V0dGluZ3MtPmFyZUNvb2tpZXNFbmFibGVkKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGll
bnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZEFkZEJhY2tGb3J3YXJkSXRlbShIaXN0b3J5SXRlbSog
aXRlbSkgY29uc3QKK3sKKyAgICAvLyBJbmZvcm0gdGhlIGNsaWVudCB0aGF0IHRoZSBiYWNrL2Zv
cndhcmQgbGlzdCBoYXMgY2hhbmdlZC4KKyAgICBpbnZhbGlkYXRlQmFja0ZvcndhcmRMaXN0KCk7
Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZFJlbW92
ZUJhY2tGb3J3YXJkSXRlbShIaXN0b3J5SXRlbSogaXRlbSkgY29uc3QKK3sKKyAgICBpbnZhbGlk
YXRlQmFja0ZvcndhcmRMaXN0KCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0Jl
cnJ5OjpkaXNwYXRjaERpZENoYW5nZUJhY2tGb3J3YXJkSW5kZXgoKSBjb25zdAoreworICAgIGlu
dmFsaWRhdGVCYWNrRm9yd2FyZExpc3QoKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJs
YWNrQmVycnk6OmRpc3BhdGNoRGlkQ2hhbmdlTG9jYXRpb25XaXRoaW5QYWdlKCkKK3sKKyAgICBp
ZiAoIWlzTWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFN0cmluZyB1cmwgPSBt
X2ZyYW1lLT5kb2N1bWVudCgpLT51cmwoKS5zdHJpbmcoKTsKKyAgICBTdHJpbmcgdG9rZW4gPSBt
X2ZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKS0+cmVxdWVzdCgpLnRva2VuKCk7CisK
KyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+bm90aWZ5TG9hZFRvQW5jaG9yKHVybC5j
aGFyYWN0ZXJzKCksIHVybC5sZW5ndGgoKSwgdG9rZW4uY2hhcmFjdGVycygpLCB0b2tlbi5sZW5n
dGgoKSk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERp
ZFB1c2hTdGF0ZVdpdGhpblBhZ2UoKQoreworICAgIC8vIEZJWE1FOiBBcyBhIHdvcmthcm91bmQg
d2UgYWJ1c2UgYW5jaG9yIG5hdmlnYXRpb24gdG8gYWNoaWV2ZSBoaXN0b3J5IHB1c2guIFNlZSBQ
UiAjMTE5Nzc5IGZvciBtb3JlIGRldGFpbHMuCisgICAgZGlzcGF0Y2hEaWRDaGFuZ2VMb2NhdGlv
bldpdGhpblBhZ2UoKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRp
c3BhdGNoRGlkUmVwbGFjZVN0YXRlV2l0aGluUGFnZSgpCit7CisgICAgLy8gRklYTUU6IEFzIGEg
d29ya2Fyb3VuZCB3ZSBhYnVzZSBhbmNob3IgbmF2aWdhdGlvbiB0byBhY2hpZXZlIGhpc3Rvcnkg
cmVwbGFjZS4gU2VlIFBSICMxMTk3NzkgZm9yIG1vcmUgZGV0YWlscy4KKyAgICBkaXNwYXRjaERp
ZENoYW5nZUxvY2F0aW9uV2l0aGluUGFnZSgpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50
QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRQb3BTdGF0ZVdpdGhpblBhZ2UoKQoreworICAgIC8vIE5v
dCBuZWVkZWQuCit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRj
aERpZENhbmNlbENsaWVudFJlZGlyZWN0KCkKK3sKKyAgICBtX2NsaWVudFJlZGlyZWN0SXNQZW5k
aW5nID0gZmFsc2U7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNw
YXRjaFdpbGxQZXJmb3JtQ2xpZW50UmVkaXJlY3QoY29uc3QgS1VSTCYsIGRvdWJsZSwgZG91Ymxl
KQoreworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlKQorICAgICAg
ICBtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlLT5kaWREaXNwYXRjaFdpbGxQZXJm
b3JtQ2xpZW50UmVkaXJlY3QoKTsKKworICAgIG1fY2xpZW50UmVkaXJlY3RJc1BlbmRpbmcgPSB0
cnVlOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEZWNp
ZGVQb2xpY3lGb3JSZXNwb25zZShGcmFtZVBvbGljeUZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCBS
ZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0
KQoreworICAgIC8vIEZJWE1FOiBXaGF0IHNob3VsZCB3ZSBkbyBmb3IgSFRUUCBzdGF0dXMgY29k
ZSAyMDQgYW5kIDIwNSBhbmQgImFwcGxpY2F0aW9uL3ppcCI/CisgICAgUG9saWN5QWN0aW9uIHBv
bGljeSA9IFBvbGljeUlnbm9yZTsKKworICAgIGlmIChjb250ZW50RGlzcG9zaXRpb25UeXBlKHJl
c3BvbnNlLmh0dHBIZWFkZXJGaWVsZCgiQ29udGVudC1EaXNwb3NpdGlvbiIpKSA9PSBDb250ZW50
RGlzcG9zaXRpb25BdHRhY2htZW50CisgICAgICAgIHx8IHJlcXVlc3QuZm9yY2VEb3dubG9hZCgp
KQorICAgICAgICBwb2xpY3kgPSBQb2xpY3lEb3dubG9hZDsKKyAgICBlbHNlIGlmIChjYW5TaG93
TUlNRVR5cGUocmVzcG9uc2UubWltZVR5cGUoKSkpCisgICAgICAgIHBvbGljeSA9IFBvbGljeVVz
ZTsKKyAgICBlbHNlIGlmICgoUmVzb3VyY2VSZXF1ZXN0OjpUYXJnZXRJc01haW5GcmFtZSA9PSBy
ZXF1ZXN0LnRhcmdldFR5cGUoKSkKKyAgICAgICAgICAgICAmJiBtX3dlYlBhZ2VQcml2YXRlLT5t
X2NsaWVudC0+ZG93bmxvYWRBbGxvd2VkKHJlcXVlc3QudXJsKCkuc3RyaW5nKCkudXRmOCgpLmRh
dGEoKSkpCisgICAgICAgIHBvbGljeSA9IFBvbGljeURvd25sb2FkOworCisgICAgKG1fZnJhbWUt
PmxvYWRlcigpLT5wb2xpY3lDaGVja2VyKCktPipmdW5jdGlvbikocG9saWN5KTsKK30KKwordm9p
ZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGVjaWRlUG9saWN5Rm9yTmF2
aWdhdGlvbkFjdGlvbihGcmFtZVBvbGljeUZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCBOYXZpZ2F0
aW9uQWN0aW9uJiBhY3Rpb24sIGNvbnN0IFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCwgUGFzc1Jl
ZlB0cjxGb3JtU3RhdGU+KQoreworICAgIFBvbGljeUFjdGlvbiBkZWNpc2lvbiA9IFBvbGljeVVz
ZTsKKworICAgIGNvbnN0IEtVUkwmIHVybCA9IHJlcXVlc3QudXJsKCk7CisKKyAgICAvLyBGcmFn
bWVudCBzY3JvbGxzIG9uIHRoZSBzYW1lIHBhZ2Ugc2hvdWxkIGFsd2F5cyBiZSBoYW5kbGVkIGlu
dGVybmFsbHkuCisgICAgLy8gKE9ubHkgY291bnQgYXMgYSBmcmFnbWVudCBzY3JvbGwgaWYgd2Ug
YXJlIHNjcm9sbGluZyB0byBhICNmcmFnbWVudCB1cmwsIG5vdCBiYWNrIHRvIHRoZSB0b3AsIGFu
ZCByZWxvYWRpbmcKKyAgICAvLyB0aGUgc2FtZSB1cmwgaXMgbm90IGEgZnJhZ21lbnQgc2Nyb2xs
IGV2ZW4gaWYgaXQgaGFzIGEgI2ZyYWdtZW50LikKKyAgICBjb25zdCBLVVJMJiBjdXJyZW50VXJs
ID0gbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCk7CisgICAgYm9vbCBpc0ZyYWdtZW50U2Nyb2xs
ID0gdXJsLmhhc0ZyYWdtZW50SWRlbnRpZmllcigpICYmIHVybCAhPSBjdXJyZW50VXJsICYmIGVx
dWFsSWdub3JpbmdGcmFnbWVudElkZW50aWZpZXIoY3VycmVudFVybCwgdXJsKTsKKyAgICBpZiAo
ZGVjaXNpb24gPT0gUG9saWN5VXNlKQorICAgICAgICBkZWNpc2lvbiA9IGRlY2lkZVBvbGljeUZv
ckV4dGVybmFsTG9hZChyZXF1ZXN0LCBpc0ZyYWdtZW50U2Nyb2xsKTsKKworICAgIC8vIExldCB0
aGUgY2xpZW50IGhhdmUgYSBjaGFuY2UgdG8gc2F5IHdoZXRoZXIgdGhpcyBuYXZpZ2F0aW9uIHNo
b3VsZAorICAgIC8vIGJlIGlnbm9yZWQgb3Igbm90LgorICAgIEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpOZXR3b3JrUmVxdWVzdCBwbGF0Zm9ybVJlcXVlc3Q7CisgICAgcmVxdWVzdC5pbml0aWFsaXpl
UGxhdGZvcm1SZXF1ZXN0KHBsYXRmb3JtUmVxdWVzdCwgZmFsc2UgLyppc0luaXRpYWwqLyk7Cisg
ICAgaWYgKGlzTWFpbkZyYW1lKCkgJiYgIW1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5hY2Nl
cHROYXZpZ2F0aW9uUmVxdWVzdCgKKyAgICAgICAgcGxhdGZvcm1SZXF1ZXN0LCBCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6TmF2aWdhdGlvblR5cGUoYWN0aW9uLnR5cGUoKSkpKSB7CisgICAgICAgIGlm
IChhY3Rpb24udHlwZSgpID09IE5hdmlnYXRpb25UeXBlRm9ybVN1Ym1pdHRlZAorICAgICAgICAg
ICAgfHwgYWN0aW9uLnR5cGUoKSA9PSBOYXZpZ2F0aW9uVHlwZUZvcm1SZXN1Ym1pdHRlZCkKKyAg
ICAgICAgICAgIG1fZnJhbWUtPmxvYWRlcigpLT5yZXNldE11bHRpcGxlRm9ybVN1Ym1pc3Npb25Q
cm90ZWN0aW9uKCk7CisKKyAgICAgICAgaWYgKGFjdGlvbi50eXBlKCkgPT0gTmF2aWdhdGlvblR5
cGVMaW5rQ2xpY2tlZCAmJiB1cmwuaGFzRnJhZ21lbnRJZGVudGlmaWVyKCkpIHsKKyAgICAgICAg
ICAgIFJlc291cmNlUmVxdWVzdCBlbXB0eVJlcXVlc3Q7CisgICAgICAgICAgICBtX2ZyYW1lLT5s
b2FkZXIoKS0+YWN0aXZlRG9jdW1lbnRMb2FkZXIoKS0+c2V0TGFzdENoZWNrZWRSZXF1ZXN0KGVt
cHR5UmVxdWVzdCk7CisgICAgICAgIH0KKyAgICAgICAgZGVjaXNpb24gPSBQb2xpY3lJZ25vcmU7
CisgICAgfQorCisgICAgLy8gSWYgd2UgYWJvcnQgaGVyZSwgZGlzcGF0Y2hEaWRDYW5jZWxDbGll
bnRSZWRpcmVjdCB3aWxsIG5vdCBiZSBjYWxsZWQuCisgICAgLy8gU28gY2FsbCBpdCBieSBoYW5k
LgorICAgIGlmIChkZWNpc2lvbiA9PSBQb2xpY3lJZ25vcmUpCisgICAgICAgIGRpc3BhdGNoRGlk
Q2FuY2VsQ2xpZW50UmVkaXJlY3QoKTsKKworICAgIChtX2ZyYW1lLT5sb2FkZXIoKS0+cG9saWN5
Q2hlY2tlcigpLT4qZnVuY3Rpb24pKGRlY2lzaW9uKTsKKworICAgIGlmIChtX3dlYlBhZ2VQcml2
YXRlLT5tX2R1bXBSZW5kZXJUcmVlKQorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBS
ZW5kZXJUcmVlLT5kaWREZWNpZGVQb2xpY3lGb3JOYXZpZ2F0aW9uQWN0aW9uKGFjdGlvbiwgcmVx
dWVzdCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkZWxheVBvbGlj
eUNoZWNrVW50aWxGcmFnbWVudEV4aXN0cyhjb25zdCBTdHJpbmcmIGZyYWdtZW50LCBGcmFtZVBv
bGljeUZ1bmN0aW9uIGZ1bmN0aW9uKQoreworICAgIEFTU0VSVChpc01haW5GcmFtZSgpKTsKKwor
ICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5sb2FkU3RhdGUoKSA8IFdlYlBhZ2VQcml2YXRlOjpG
aW5pc2hlZCAmJiAhbV9mcmFtZS0+ZG9jdW1lbnQoKS0+ZmluZEFuY2hvcihmcmFnbWVudCkpIHsK
KyAgICAgICAgLy8gVGVsbCB0aGUgY2xpZW50IHdlIG5lZWQgbW9yZSBkYXRhLCBpbiBjYXNlIHRo
ZSBmcmFnbWVudCBleGlzdHMgYnV0IGlzIGJlaW5nIGhlbGQgYmFjay4KKyAgICAgICAgbV93ZWJQ
YWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5lZWRNb3JlRGF0YSgpOworICAgICAgICBtX3BlbmRpbmdG
cmFnbWVudFNjcm9sbFBvbGljeUZ1bmN0aW9uID0gZnVuY3Rpb247CisgICAgICAgIG1fcGVuZGlu
Z0ZyYWdtZW50U2Nyb2xsID0gZnJhZ21lbnQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICAobV9mcmFtZS0+bG9hZGVyKCktPnBvbGljeUNoZWNrZXIoKS0+KmZ1bmN0aW9uKShQb2xpY3lV
c2UpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y2FuY2VsUG9saWN5
Q2hlY2soKQoreworICAgIG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsUG9saWN5RnVuY3Rpb24gPSAw
OworICAgIG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsID0gU3RyaW5nKCk7Cit9CisKK3ZvaWQgRnJh
bWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpkb1BlbmRpbmdGcmFnbWVudFNjcm9sbCgpCit7Cisg
ICAgaWYgKG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsLmlzTnVsbCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICAvLyBNYWtlIHN1cmUgdG8gY2xlYXIgdGhlIHBlbmRpbmcgbWVtYmVycyBmaXJzdCB0
byBhdm9pZCByZWN1cnNpb24uCisgICAgU3RyaW5nIGZyYWdtZW50ID0gbV9wZW5kaW5nRnJhZ21l
bnRTY3JvbGw7CisgICAgbV9wZW5kaW5nRnJhZ21lbnRTY3JvbGwgPSBTdHJpbmcoKTsKKworICAg
IEZyYW1lUG9saWN5RnVuY3Rpb24gZnVuY3Rpb24gPSBtX3BlbmRpbmdGcmFnbWVudFNjcm9sbFBv
bGljeUZ1bmN0aW9uOworICAgIG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsUG9saWN5RnVuY3Rpb24g
PSAwOworCisgICAgZGVsYXlQb2xpY3lDaGVja1VudGlsRnJhZ21lbnRFeGlzdHMoZnJhZ21lbnQs
IGZ1bmN0aW9uKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3Bh
dGNoRGVjaWRlUG9saWN5Rm9yTmV3V2luZG93QWN0aW9uKEZyYW1lUG9saWN5RnVuY3Rpb24gZnVu
Y3Rpb24sIGNvbnN0IE5hdmlnYXRpb25BY3Rpb24mLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmIHJl
cXVlc3QsIFBhc3NSZWZQdHI8Rm9ybVN0YXRlPiwgY29uc3QgU3RyaW5nJiBmcmFtZU5hbWUpCit7
CisgICAgaWYgKHJlcXVlc3QuaXNSZXF1ZXN0ZWRCeVBsdWdpbigpICYmIFNjcmlwdENvbnRyb2xs
ZXI6OnByb2Nlc3NpbmdVc2VyR2VzdHVyZSgpICYmICFtX3dlYlBhZ2VQcml2YXRlLT5tX3BsdWdp
bk1heU9wZW5OZXdUYWIpCisgICAgICAgIChtX2ZyYW1lLT5sb2FkZXIoKS0+cG9saWN5Q2hlY2tl
cigpLT4qZnVuY3Rpb24pKFBvbGljeUlnbm9yZSk7CisKKyAgICAvLyBBIG5ldyB3aW5kb3cgY2Fu
IG5ldmVyIGJlIGEgZnJhZ21lbnQgc2Nyb2xsLgorICAgIFBvbGljeUFjdGlvbiBkZWNpc2lvbiA9
IGRlY2lkZVBvbGljeUZvckV4dGVybmFsTG9hZChyZXF1ZXN0LCBmYWxzZSk7CisgICAgKG1fZnJh
bWUtPmxvYWRlcigpLT5wb2xpY3lDaGVja2VyKCktPipmdW5jdGlvbikoZGVjaXNpb24pOworfQor
Cit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y29tbWl0dGVkTG9hZChEb2N1bWVu
dExvYWRlciogbG9hZGVyLCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKQoreworICAgIC8v
IFRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBjb2RlIG1heSBzZWVtLi4uYSBiaXQgb2RkLiBJdCdzIHN0
cnVjdHVyZWQgd2l0aCB0d28gY2hlY2tzIG9uIHRoZSBzdGF0ZQorICAgIC8vIG9mIG1fcGx1Z2lu
VmlldyBiZWNhdXNlIGl0J3MgYWN0dWFsbHkgcmVjZWl2ZWREYXRhIHRoYXQgbWF5IGNhdXNlIHRo
ZSByZXF1ZXN0IHRvIHJlLWRpcmVjdCBkYXRhCisgICAgLy8gdG8gYSBQbHVnaW5WaWV3LiBUaGlz
IGlzIGJlY2F1c2UgcmVjZWl2ZWREYXRhIG1heSBkZWNpZGUgdG8gY3JlYXRlIGEgUGx1Z2luRG9j
dW1lbnQgY29udGFpbmluZworICAgIC8vIGEgUGx1Z2luVmlldy4gVGhlIFBsdWdpblZpZXcgd2ls
bCByZXF1ZXN0IHRoYXQgdGhlIG1haW4gcmVzb3VyY2UgZm9yIHRoZSBmcmFtZSBiZSByZWRpcmVj
dGVkCisgICAgLy8gdG8gdGhlIFBsdWdpblZpZXcuIFNvIGFmdGVyIHJlY2VpdmVkRGF0YSBoYXMg
YmVlbiBjYWxsZWQsIHRoaXMgY29kZSBuZWVkcyB0byBjaGVjayB3aGV0aGVyCisgICAgLy8gcmUt
ZGlyZWN0aW9uIHRvIGEgUGx1Z2luVmlldyBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHBhc3MgdGhl
IHNhbWUgZGF0YSBvbiB0byB0aGUgUGx1Z2luVmlldy4KKyAgICAvLyBUaGVyZWFmdGVyLCBhbGwg
ZGF0YSB3aWxsIGJlIHJlLWRpcmVjdGVkIHRvIHRoZSBQbHVnaW5WaWV3OyBpLmUuLCBubyBhZGRp
dGlvbmFsIGRhdGEgd2lsbCBnbworICAgIC8vIHRvIHJlY2VpdmVkRGF0YS4KKworICAgIGlmICgh
bV9wbHVnaW5WaWV3KSB7CisgICAgICAgIGNvbnN0IFN0cmluZyYgdGV4dEVuY29kaW5nID0gbG9h
ZGVyLT5yZXNwb25zZSgpLnRleHRFbmNvZGluZ05hbWUoKTsKKyAgICAgICAgcmVjZWl2ZWREYXRh
KGRhdGEsIGxlbmd0aCwgdGV4dEVuY29kaW5nKTsKKyAgICB9CisKKyAgICBpZiAobV9wbHVnaW5W
aWV3KSB7CisgICAgICAgIGlmICghbV9oYXNTZW50UmVzcG9uc2VUb1BsdWdpbikgeworICAgICAg
ICAgICAgbV9wbHVnaW5WaWV3LT5kaWRSZWNlaXZlUmVzcG9uc2UobG9hZGVyLT5yZXNwb25zZSgp
KTsKKyAgICAgICAgICAgIG1faGFzU2VudFJlc3BvbnNlVG9QbHVnaW4gPSB0cnVlOworICAgICAg
ICB9CisKKyAgICAgICAgaWYgKCFtX3BsdWdpblZpZXcpCisgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgbV9wbHVnaW5WaWV3LT5kaWRSZWNlaXZlRGF0YShkYXRhLCBsZW5ndGgpOworICAg
IH0KK30KKworUGFzc1JlZlB0cjxXaWRnZXQ+IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6
Y3JlYXRlUGx1Z2luKGNvbnN0IEludFNpemUmIHBsdWdpblNpemUsCisgICAgSFRNTFBsdWdJbkVs
ZW1lbnQqIGVsZW1lbnQsIGNvbnN0IEtVUkwmIHVybCwgY29uc3QgVmVjdG9yPFN0cmluZz4mIHBh
cmFtTmFtZXMsCisgICAgY29uc3QgVmVjdG9yPFN0cmluZz4mIHBhcmFtVmFsdWVzLCBjb25zdCBT
dHJpbmcmIG1pbWVUeXBlSW4sIGJvb2wgbG9hZE1hbnVhbGx5KQoreworICAgIFN0cmluZyBtaW1l
VHlwZShtaW1lVHlwZUluKTsKKyAgICBpZiAobWltZVR5cGUuaXNFbXB0eSgpKSB7CisgICAgICAg
IG1pbWVUeXBlID0gTUlNRVR5cGVSZWdpc3RyeTo6Z2V0TUlNRVR5cGVGb3JQYXRoKHVybC5wYXRo
KCkpOworICAgICAgICBtaW1lVHlwZSA9IEJsYWNrQmVycnk6OldlYktpdDo6V2ViU2V0dGluZ3M6
OmdldE5vcm1hbGl6ZWRNSU1FVHlwZShtaW1lVHlwZSk7CisgICAgICAgIGlmIChtaW1lVHlwZSAh
PSAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKQorICAgICAgICAgICAgbWltZVR5cGUg
PSBtaW1lVHlwZUluOworICAgIH0KKworICAgIGlmIChtaW1lVHlwZSA9PSAiYXBwbGljYXRpb24v
eC1zaG9ja3dhdmUtZmxhc2giIHx8IG1pbWVUeXBlID09ICJhcHBsaWNhdGlvbi9qbmV4dC1zY3Jp
cHRhYmxlLXBsdWdpbiIpIHsKKyAgICAgICAgUmVmUHRyPFBsdWdpblZpZXc+IHBsdWdpblZpZXcg
PSBQbHVnaW5WaWV3OjpjcmVhdGUobV9mcmFtZSwgcGx1Z2luU2l6ZSwgZWxlbWVudCwgdXJsLCBw
YXJhbU5hbWVzLCBwYXJhbVZhbHVlcywgbWltZVR5cGUsIGxvYWRNYW51YWxseSk7CisgICAgICAg
IHJldHVybiBwbHVnaW5WaWV3OworICAgIH0KKyAgICAvLyBJZiBpdCdzIG5vdCB0aGUgcGx1Z2lu
IHR5cGUgd2Ugc3VwcG9ydCwgdHJ5IGxvYWQgZGlyZWN0bHkgZnJvbSBicm93c2VyLgorICAgIGlm
IChtX2ZyYW1lLT5sb2FkZXIoKSAmJiBtX2ZyYW1lLT5sb2FkZXIoKS0+c3ViZnJhbWVMb2FkZXIo
KSAmJiAhdXJsLmlzTnVsbCgpKQorICAgICAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+c3ViZnJhbWVM
b2FkZXIoKS0+cmVxdWVzdEZyYW1lKGVsZW1lbnQsIHVybCwgU3RyaW5nKCkpOworCisgICAgcmV0
dXJuIDA7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpyZWRpcmVjdERh
dGFUb1BsdWdpbihXaWRnZXQqIHBsdWdpbldpZGdldCkKK3sKKyAgICBBU1NFUlQoIW1fcGx1Z2lu
Vmlldyk7CisgICAgbV9wbHVnaW5WaWV3ID0gc3RhdGljX2Nhc3Q8UGx1Z2luVmlldyo+KHBsdWdp
bldpZGdldCk7CisgICAgbV9oYXNTZW50UmVzcG9uc2VUb1BsdWdpbiA9IGZhbHNlOworfQorCit2
b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6cmVjZWl2ZWREYXRhKGNvbnN0IGNoYXIq
IGRhdGEsIGludCBsZW5ndGgsIGNvbnN0IFN0cmluZyYgdGV4dEVuY29kaW5nKQoreworICAgIGlm
ICghbV9mcmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fY2FuY2VsTG9hZE9uTmV4
dERhdGEpIHsKKyAgICAgICAgbV9mcmFtZS0+bG9hZGVyKCktPmFjdGl2ZURvY3VtZW50TG9hZGVy
KCktPnN0b3BMb2FkaW5nKCk7CisgICAgICAgIG1fZnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExv
YWRlcigpLT53cml0ZXIoKS0+ZW5kKCk7CisgICAgICAgIG1fY2FuY2VsTG9hZE9uTmV4dERhdGEg
PSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFNldCB0aGUgZW5jb2Rp
bmcuIFRoaXMgb25seSBuZWVkcyB0byBiZSBkb25lIG9uY2UsIGJ1dCBpdCdzIGhhcm1sZXNzIHRv
IGRvIGl0IGFnYWluIGxhdGVyLgorICAgIFN0cmluZyBlbmNvZGluZyA9IG1fZnJhbWUtPmxvYWRl
cigpLT5kb2N1bWVudExvYWRlcigpLT5vdmVycmlkZUVuY29kaW5nKCk7CisgICAgYm9vbCB1c2Vy
Q2hvc2VuID0gIWVuY29kaW5nLmlzTnVsbCgpOworICAgIGlmIChlbmNvZGluZy5pc051bGwoKSkK
KyAgICAgICAgZW5jb2RpbmcgPSB0ZXh0RW5jb2Rpbmc7CisgICAgbV9mcmFtZS0+bG9hZGVyKCkt
PmRvY3VtZW50TG9hZGVyKCktPndyaXRlcigpLT5zZXRFbmNvZGluZyhlbmNvZGluZywgdXNlckNo
b3Nlbik7CisgICAgbV9mcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCktPndyaXRlcigp
LT5hZGREYXRhKGRhdGEsIGxlbmd0aCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFj
a0JlcnJ5OjpmaW5pc2hlZExvYWRpbmcoRG9jdW1lbnRMb2FkZXIqIGxvYWRlcikKK3sKKyAgICBp
ZiAobV9wbHVnaW5WaWV3KSB7CisgICAgICAgIG1fcGx1Z2luVmlldy0+ZGlkRmluaXNoTG9hZGlu
ZygpOworICAgICAgICBtX3BsdWdpblZpZXcgPSAwOworICAgICAgICBtX2hhc1NlbnRSZXNwb25z
ZVRvUGx1Z2luID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGVsbGluZyB0aGUg
ZnJhbWUgd2UgcmVjZWl2ZWQgc29tZSBkYXRhIGFuZCBwYXNzaW5nIDAgYXMgdGhlIGRhdGEgaXMg
b3VyCisgICAgICAgIC8vIHdheSB0byBnZXQgd29yayBkb25lIHRoYXQgaXMgbm9ybWFsbHkgZG9u
ZSB3aGVuIHRoZSBmaXJzdCBiaXQgb2YgZGF0YSBpcworICAgICAgICAvLyByZWNlaXZlZCwgZXZl
biBmb3IgdGhlIGNhc2Ugb2YgYSBkb2N1bWVudCB3aXRoIG5vIGRhdGEgKGxpa2UgYWJvdXQ6Ymxh
bmspCisgICAgICAgIGNvbW1pdHRlZExvYWQobG9hZGVyLCAwLCAwKTsKKworICAgICAgICBpZiAo
IW1fZnJhbWUtPmRvY3VtZW50KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorfQorCitQ
YXNzUmVmUHRyPERvY3VtZW50TG9hZGVyPiBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmNy
ZWF0ZURvY3VtZW50TG9hZGVyKGNvbnN0IFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCwgY29uc3Qg
U3Vic3RpdHV0ZURhdGEmIHN1YnN0aXR1dGVEYXRhKQoreworICAgIC8vIE1ha2UgYSBjb3B5IG9m
IHRoZSByZXF1ZXN0IHdpdGggdGhlIHRva2VuIGZyb20gdGhlIG9yaWdpbmFsIHJlcXVlc3QgZm9y
IHRoaXMgZnJhbWUKKyAgICAvLyAodW5sZXNzIGl0IGFscmVhZHkgaGFzIGEgdG9rZW4sIGluIHdo
aWNoIGNhc2UgdGhlIHJlcXVlc3QgY2FtZSBmcm9tIHRoZSBjbGllbnQpCisgICAgUmVzb3VyY2VS
ZXF1ZXN0IG5ld1JlcXVlc3QocmVxdWVzdCk7CisgICAgaWYgKG1fZnJhbWUgJiYgbV9mcmFtZS0+
bG9hZGVyKCkgJiYgbV9mcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCkpIHsKKyAgICAg
ICAgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiBvcmlnaW5hbFJlcXVlc3QgPSBtX2ZyYW1lLT5sb2Fk
ZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKS0+b3JpZ2luYWxSZXF1ZXN0KCk7CisgICAgICAgIGlmIChy
ZXF1ZXN0LnRva2VuKCkuaXNOdWxsKCkgJiYgIW9yaWdpbmFsUmVxdWVzdC50b2tlbigpLmlzTnVs
bCgpKQorICAgICAgICAgICAgbmV3UmVxdWVzdC5zZXRUb2tlbihvcmlnaW5hbFJlcXVlc3QudG9r
ZW4oKSk7CisgICAgfQorCisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHNo
YXJlZC4KKyAgICBSZWZQdHI8RG9jdW1lbnRMb2FkZXI+IGxvYWRlciA9IERvY3VtZW50TG9hZGVy
OjpjcmVhdGUobmV3UmVxdWVzdCwgc3Vic3RpdHV0ZURhdGEpOworICAgIGlmIChzdWJzdGl0dXRl
RGF0YS5pc1ZhbGlkKCkpCisgICAgICAgIGxvYWRlci0+c2V0RGVmZXJNYWluUmVzb3VyY2VEYXRh
TG9hZChmYWxzZSk7CisgICAgcmV0dXJuIGxvYWRlci5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgRnJh
bWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpmcmFtZUxvYWRlckRlc3Ryb3llZCgpCit7CisgICAg
ZGVsZXRlIHRoaXM7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojp0cmFu
c2l0aW9uVG9Db21taXR0ZWRGb3JOZXdQYWdlKCkKK3sKKyAgICBtX2NhbmNlbExvYWRPbk5leHRE
YXRhID0gZmFsc2U7CisKKyAgICAvLyBJbiBGcmFtZTo6Y3JlYXRlVmlldywgRnJhbWUncyBGcmFt
ZVZpZXcgb2JqZWN0IGlzIHNldCB0byAwIGFuZCAgcmVjcmVhdGVkLgorICAgIC8vIFRoaXMgb3Bl
cmF0aW9uIGlzIG5vdCBhdG9taWMsIGFuZCBhbiBhdHRlbXB0IHRvIGJsaXQgY29udGVudHMgbWln
aHQgaGFwcGVuCisgICAgLy8gaW4gdGhlIGJhY2tpbmcgc3RvcmUgZnJvbSBhbm90aGVyIHRocmVh
ZCAoc2VlIEJhY2tpbmdTdG9yZVByaXZhdGU6OmJsaXRDb250ZW50cyBtZXRob2QpLAorICAgIC8v
IHNvIHdlIHN1c3BlbmQgYW5kIHJlc3VtZSBzY3JlZW4gdXBkYXRlIHRvIG1ha2Ugc3VyZSB3ZSBk
byBub3QgZ2V0IGEgaW52YWxpZCBGcmFtZVZpZXcKKyAgICAvLyBzdGF0ZS4KKyAgICBCYWNraW5n
U3RvcmVDbGllbnQqIGJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lID0gbV93ZWJQYWdlUHJpdmF0
ZS0+YmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUobV9mcmFtZSk7CisgICAgaWYgKGJhY2tpbmdT
dG9yZUNsaWVudEZvckZyYW1lKQorICAgICAgICBiYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZS0+
YmFja2luZ1N0b3JlKCktPmQtPnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCk7
CisKKyAgICAvLyBXZSBhcmUgbmF2aWdhdGluZyBhd2F5IGZyb20gdGhpcyBkb2N1bWVudCwgc28g
Y2xlYW4gdXAgYW55IGZvb3RwcmludCB3ZSBtaWdodCBoYXZlLgorICAgIGlmIChtX2ZyYW1lLT5k
b2N1bWVudCgpKQorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5jbGVhckRvY3VtZW50RGF0YSht
X2ZyYW1lLT5kb2N1bWVudCgpKTsKKworICAgIENvbG9yIGJhY2tncm91bmRDb2xvcihtX3dlYlBh
Z2VQcml2YXRlLT5tX3dlYlNldHRpbmdzLT5iYWNrZ3JvdW5kQ29sb3IoKSk7CisKKyAgICBtX2Zy
YW1lLT5jcmVhdGVWaWV3KG1fd2ViUGFnZVByaXZhdGUtPnZpZXdwb3J0U2l6ZSgpLCAgICAgLyp2
aWV3cG9ydCovCisgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IsICAgICAg
ICAgICAgICAgICAgLypiYWNrZ3JvdW5kIGNvbG9yKi8KKyAgICAgICAgICAgICAgICAgICAgICAg
IGJhY2tncm91bmRDb2xvci5oYXNBbHBoYSgpLCAgICAgICAvKmlzIHRyYW5zcGFyZW50Ki8KKyAg
ICAgICAgICAgICAgICAgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPmFjdHVhbFZpc2libGVTaXpl
KCksLypmaXhlZCByZXBvcnRlZCBzaXplKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fd2Vi
UGFnZVByaXZhdGUtPmZpeGVkTGF5b3V0U2l6ZSgpLCAgLypmaXhlZCBsYXlvdXQgc2l6ZSovCisg
ICAgICAgICAgICAgICAgICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT51c2VGaXhlZExheW91dCgp
LCAgIC8qdXNlIGZpeGVkIGxheW91dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgU2Nyb2xs
YmFyQWx3YXlzT2ZmLCAgICAgICAgICAgICAgIC8qaG9yIG1vZGUqLworICAgICAgICAgICAgICAg
ICAgICAgICAgdHJ1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbG9jayB0aGUgbW9k
ZSovCisgICAgICAgICAgICAgICAgICAgICAgICBTY3JvbGxiYXJBbHdheXNPZmYsICAgICAgICAg
ICAgICAgLyp2ZXIgbW9kZSovCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgLypsb2NrIHRoZSBtb2RlKi8KKworICAgIGlmIChiYWNraW5n
U3RvcmVDbGllbnRGb3JGcmFtZSkKKyAgICAgICAgYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUt
PmJhY2tpbmdTdG9yZSgpLT5kLT5yZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKEJh
Y2tpbmdTdG9yZTo6Tm9uZSk7CisgICAgbV9mcmFtZS0+dmlldygpLT51cGRhdGVDYW5IYXZlU2Ny
b2xsYmFycygpOworCisgICAgaWYgKGlzTWFpbkZyYW1lKCkpIHsKKyAgICAgICAgLy8gU2luY2Ug
dGhlIG1haW5mcmFtZSBoYXMgYSB0aWxlZCBiYWNraW5nc3RvcmUgcmVxdWVzdCB0byByZWNlaXZl
IGFsbCB1cGRhdGUKKyAgICAgICAgLy8gcmVjdHMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCB3aGlj
aCBqdXN0IHNlbmRzIHVwZGF0ZSByZWN0cyBmb3IgY3VycmVudGx5CisgICAgICAgIC8vIHZpc2li
bGUgdmlld3BvcnQuCisgICAgICAgIG1fZnJhbWUtPnZpZXcoKS0+c2V0UGFpbnRzRW50aXJlQ29u
dGVudHModHJ1ZSk7CisgICAgfQorfQorCitTdHJpbmcgRnJhbWVMb2FkZXJDbGllbnRCbGFja0Jl
cnJ5Ojp1c2VyQWdlbnQoY29uc3QgS1VSTCYpCit7CisgICAgcmV0dXJuIG1fd2ViUGFnZVByaXZh
dGUtPm1fd2ViU2V0dGluZ3MtPnVzZXJBZ2VudFN0cmluZygpOworfQorCitib29sIEZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y2FuSGFuZGxlUmVxdWVzdChjb25zdCBSZXNvdXJjZVJlcXVl
c3QmKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBTdHViLgorICAgIHJldHVybiB0cnVlOworfQor
Citib29sIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y2FuU2hvd01JTUVUeXBlKGNvbnN0
IFN0cmluZyYgbWltZVR5cGVJbikgY29uc3QKK3sKKyAgICAvLyBHZXQgbm9ybWFsaXplZCB0eXBl
LgorICAgIFN0cmluZyBtaW1lVHlwZSA9IEJsYWNrQmVycnk6OldlYktpdDo6V2ViU2V0dGluZ3M6
OmdldE5vcm1hbGl6ZWRNSU1FVHlwZShtaW1lVHlwZUluKTsKKworICAgIC8vIEZJWE1FOiBTZWVt
cyBubyBvdGhlciBwb3J0IGNoZWNrcyBlbXB0eSBNSU1FIHR5cGUgaW4gdGhpcyBmdW5jdGlvbi4g
U2hvdWxkIHdlIGRvIHRoYXQ/CisgICAgcmV0dXJuIE1JTUVUeXBlUmVnaXN0cnk6OmlzU3VwcG9y
dGVkSW1hZ2VNSU1FVHlwZShtaW1lVHlwZSkgfHwgTUlNRVR5cGVSZWdpc3RyeTo6aXNTdXBwb3J0
ZWROb25JbWFnZU1JTUVUeXBlKG1pbWVUeXBlKQorICAgICAgICB8fCBNSU1FVHlwZVJlZ2lzdHJ5
Ojppc1N1cHBvcnRlZE1lZGlhTUlNRVR5cGUobWltZVR5cGUpIHx8IEJsYWNrQmVycnk6OldlYktp
dDo6V2ViU2V0dGluZ3M6OmlzU3VwcG9ydGVkT2JqZWN0TUlNRVR5cGUobWltZVR5cGUpCisgICAg
ICAgIHx8IChtaW1lVHlwZSA9PSAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTsKK30K
KworYm9vbCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmNhblNob3dNSU1FVHlwZUFzSFRN
TChjb25zdCBTdHJpbmcmKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBTdHViLgorICAgIHJldHVy
biB0cnVlOworfQorCisKK2Jvb2wgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojppc01haW5G
cmFtZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZnJhbWUgPT0gbV93ZWJQYWdlUHJpdmF0ZS0+
bV9tYWluRnJhbWU7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNw
YXRjaERpZFN0YXJ0UHJvdmlzaW9uYWxMb2FkKCkKK3sKKyAgICBpZiAoaXNNYWluRnJhbWUoKSkK
KyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+c2V0TG9hZFN0YXRlKFdlYlBhZ2VQcml2YXRlOjpQ
cm92aXNpb25hbCk7CisKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJl
ZSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZS0+ZGlkU3RhcnRQ
cm92aXNpb25hbExvYWRGb3JGcmFtZShtX2ZyYW1lKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNs
aWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkUmVjZWl2ZVJlc3BvbnNlKERvY3VtZW50TG9hZGVy
KiwgdW5zaWduZWQgbG9uZyBpZGVudGlmaWVyLCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNw
b25zZSkKK3sKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZSkKKyAg
ICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZS0+ZGlkUmVjZWl2ZVJlc3Bv
bnNlRm9yRnJhbWUobV9mcmFtZSwgcmVzcG9uc2UpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xp
ZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRSZWNlaXZlVGl0bGUoY29uc3QgU3RyaW5nV2l0aERp
cmVjdGlvbiYgdGl0bGUpCit7CisgICAgaWYgKGlzTWFpbkZyYW1lKCkpCisgICAgICAgIG1fd2Vi
UGFnZVByaXZhdGUtPm1fY2xpZW50LT5zZXRQYWdlVGl0bGUodGl0bGUuc3RyaW5nKCkuY2hhcmFj
dGVycygpLCB0aXRsZS5zdHJpbmcoKS5sZW5ndGgoKSk7CisKKyAgICBpZiAobV93ZWJQYWdlUHJp
dmF0ZS0+bV9kdW1wUmVuZGVyVHJlZSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1w
UmVuZGVyVHJlZS0+ZGlkUmVjZWl2ZVRpdGxlRm9yRnJhbWUodGl0bGUuc3RyaW5nKCksIG1fZnJh
bWUpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6c2V0VGl0bGUoY29u
c3QgU3RyaW5nV2l0aERpcmVjdGlvbiYgLyp0aXRsZSovLCBjb25zdCBLVVJMJiAvKnVybCovKQor
eworICAgIC8vIFVzZWQgYnkgQXBwbGUgV2ViS2l0IHRvIHVwZGF0ZSB0aGUgdGl0bGUgb2YgYW4g
ZXhpc3RpbmcgaGlzdG9yeSBpdGVtLgorICAgIC8vIFF0V2ViS2l0IGRvZXNuJ3QgYWNjb21vZGF0
ZSB0aGlzIG9uIGhpc3RvcnkgaXRlbXMuIElmIGl0IGV2ZXIgZG9lcywKKyAgICAvLyBpdCBzaG91
bGQgYmUgcHJpdmF0ZUJyb3dzaW5nLWF3YXJlLiBGb3Igbm93LCB3ZSBhcmUganVzdCBwYXNzaW5n
CisgICAgLy8gZ2xvYmFsaGlzdG9yeSBsYXlvdXQgdGVzdHMuCisgICAgLy8gRklYTUU6IFVzZSBk
aXJlY3Rpb24gb2YgdGl0bGUuCisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBGcmFt
ZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkQ29tbWl0TG9hZCgpCit7CisgICAg
Ly8gRklYTUU6IERvIHdlIG5lZWQgdG8gZmluZCBhIHJlcGxhY2VtZW50IGZvciBtX2ZyYW1lLT5k
b2N1bWVudCgpLT5zZXRFeHRyYUxheW91dERlbGF5KDI1MCk7PworCisgICAgU2VjdXJpdHlPcmln
aW4qIHNlY3VyaXR5T3JpZ2luID0gbV9mcmFtZS0+ZG9jdW1lbnQoKS0+c2VjdXJpdHlPcmlnaW4o
KTsKKyAgICBCbGFja0JlcnJ5OjpXZWJLaXQ6OldlYlNldHRpbmdzKiB3ZWJTZXR0aW5ncyA9IG1f
d2ViUGFnZVByaXZhdGUtPm1fd2ViU2V0dGluZ3M7CisKKyAgICAvLyBXaGl0ZWxpc3QgYWxsIGtu
b3duIHByb3RvY29scyBpZiBCcm93c2VyRmllbGQyIHJlcXVpcmVzIHVucmVzdHJpY3RlZCByZXF1
ZXN0cy4KKyAgICBpZiAod2ViU2V0dGluZ3MtPmFsbG93Q3Jvc3NTaXRlUmVxdWVzdHMoKSAmJiAh
c2VjdXJpdHlPcmlnaW4tPnByb3RvY29sKCkuaXNFbXB0eSgpKSB7CisgICAgICAgIFNlY3VyaXR5
UG9saWN5OjphZGRPcmlnaW5BY2Nlc3NXaGl0ZWxpc3RFbnRyeSgqc2VjdXJpdHlPcmlnaW4sIFN0
cmluZygiYWJvdXQiKSwgZW1wdHlTdHJpbmcoKSwgdHJ1ZSk7CisgICAgICAgIFNlY3VyaXR5UG9s
aWN5OjphZGRPcmlnaW5BY2Nlc3NXaGl0ZWxpc3RFbnRyeSgqc2VjdXJpdHlPcmlnaW4sIFN0cmlu
ZygiZGF0YSIpLCBlbXB0eVN0cmluZygpLCB0cnVlKTsKKyAgICAgICAgU2VjdXJpdHlQb2xpY3k6
OmFkZE9yaWdpbkFjY2Vzc1doaXRlbGlzdEVudHJ5KCpzZWN1cml0eU9yaWdpbiwgU3RyaW5nKCJm
aWxlIiksIGVtcHR5U3RyaW5nKCksIHRydWUpOworICAgICAgICBTZWN1cml0eVBvbGljeTo6YWRk
T3JpZ2luQWNjZXNzV2hpdGVsaXN0RW50cnkoKnNlY3VyaXR5T3JpZ2luLCBTdHJpbmcoImh0dHAi
KSwgZW1wdHlTdHJpbmcoKSwgdHJ1ZSk7CisgICAgICAgIFNlY3VyaXR5UG9saWN5OjphZGRPcmln
aW5BY2Nlc3NXaGl0ZWxpc3RFbnRyeSgqc2VjdXJpdHlPcmlnaW4sIFN0cmluZygiaHR0cHMiKSwg
ZW1wdHlTdHJpbmcoKSwgdHJ1ZSk7CisgICAgICAgIFNlY3VyaXR5UG9saWN5OjphZGRPcmlnaW5B
Y2Nlc3NXaGl0ZWxpc3RFbnRyeSgqc2VjdXJpdHlPcmlnaW4sIFN0cmluZygiamF2YXNjcmlwdCIp
LCBlbXB0eVN0cmluZygpLCB0cnVlKTsKKyAgICAgICAgU2VjdXJpdHlQb2xpY3k6OmFkZE9yaWdp
bkFjY2Vzc1doaXRlbGlzdEVudHJ5KCpzZWN1cml0eU9yaWdpbiwgU3RyaW5nKCJsb2NhbCIpLCBl
bXB0eVN0cmluZygpLCB0cnVlKTsKKyAgICAgICAgU2VjdXJpdHlQb2xpY3k6OmFkZE9yaWdpbkFj
Y2Vzc1doaXRlbGlzdEVudHJ5KCpzZWN1cml0eU9yaWdpbiwgU3RyaW5nKCJtYWlsdG8iKSwgZW1w
dHlTdHJpbmcoKSwgdHJ1ZSk7CisgICAgICAgIFNlY3VyaXR5UG9saWN5OjphZGRPcmlnaW5BY2Nl
c3NXaGl0ZWxpc3RFbnRyeSgqc2VjdXJpdHlPcmlnaW4sIFN0cmluZygicGF0dGVybiIpLCBlbXB0
eVN0cmluZygpLCB0cnVlKTsKKyAgICAgICAgU2VjdXJpdHlQb2xpY3k6OmFkZE9yaWdpbkFjY2Vz
c1doaXRlbGlzdEVudHJ5KCpzZWN1cml0eU9yaWdpbiwgU3RyaW5nKCJydGNwIiksIGVtcHR5U3Ry
aW5nKCksIHRydWUpOworICAgICAgICBTZWN1cml0eVBvbGljeTo6YWRkT3JpZ2luQWNjZXNzV2hp
dGVsaXN0RW50cnkoKnNlY3VyaXR5T3JpZ2luLCBTdHJpbmcoInJ0cCIpLCBlbXB0eVN0cmluZygp
LCB0cnVlKTsKKyAgICAgICAgU2VjdXJpdHlQb2xpY3k6OmFkZE9yaWdpbkFjY2Vzc1doaXRlbGlz
dEVudHJ5KCpzZWN1cml0eU9yaWdpbiwgU3RyaW5nKCJydHNwIiksIGVtcHR5U3RyaW5nKCksIHRy
dWUpOworICAgICAgICBTZWN1cml0eVBvbGljeTo6YWRkT3JpZ2luQWNjZXNzV2hpdGVsaXN0RW50
cnkoKnNlY3VyaXR5T3JpZ2luLCBTdHJpbmcoInNtcyIpLCBlbXB0eVN0cmluZygpLCB0cnVlKTsK
KyAgICAgICAgU2VjdXJpdHlQb2xpY3k6OmFkZE9yaWdpbkFjY2Vzc1doaXRlbGlzdEVudHJ5KCpz
ZWN1cml0eU9yaWdpbiwgU3RyaW5nKCJ0ZWwiKSwgZW1wdHlTdHJpbmcoKSwgdHJ1ZSk7CisKKyAg
ICAgICAgLy8gV2UgYWxzbyB3YW50IHRvIGJlIGFibGUgdG8gaGFuZGxlIHVua25vd24gcHJvdG9j
b2xzIGluIHRoZSBjbGllbnQuCisgICAgICAgIHNlY3VyaXR5T3JpZ2luLT5ncmFudFVuaXZlcnNh
bEFjY2VzcygpOworICAgIH0KKworICAgIGlmIChpc01haW5GcmFtZSgpKSB7CisgICAgICAgIG1f
d2ViUGFnZVByaXZhdGUtPnNldExvYWRTdGF0ZShXZWJQYWdlUHJpdmF0ZTo6Q29tbWl0dGVkKTsK
KworICAgICAgICBTdHJpbmcgb3JpZ2luYWxVcmwgPSBtX2ZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1l
bnRMb2FkZXIoKS0+b3JpZ2luYWxSZXF1ZXN0KCkudXJsKCkuc3RyaW5nKCk7CisgICAgICAgIFN0
cmluZyB1cmwgPSBtX2ZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKS0+cmVxdWVzdCgp
LnVybCgpLnN0cmluZygpOworICAgICAgICBTdHJpbmcgdG9rZW4gPSBtX2ZyYW1lLT5sb2FkZXIo
KS0+ZG9jdW1lbnRMb2FkZXIoKS0+cmVxdWVzdCgpLnRva2VuKCk7CisKKyAgICAgICAgLy8gTm90
aWZ5IHRoZSBjbGllbnQgdGhhdCB0aGUgbG9hZCBzdWNjZWVkZWQgb3IgZmFpbGVkIChpZiBpdCBm
YWlsZWQsIHRoaXMKKyAgICAgICAgLy8gaXMgYWN0dWFsbHkgY29tbWl0dGluZyB0aGUgZXJyb3Ig
cGFnZSwgd2hpY2ggd2FzIHNldCB0aHJvdWdoCisgICAgICAgIC8vIFN1YnN0aXR1dGVEYXRhIGlu
IGRpc3BhdGNoRGlkRmFpbFByb3Zpc2lvbmFsTG9hZCkKKyAgICAgICAgaWYgKG1fbG9hZGluZ0Vy
cm9yUGFnZSkgeworICAgICAgICAgICAgbV9sb2FkaW5nRXJyb3JQYWdlID0gZmFsc2U7CisgICAg
ICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+bm90aWZ5TG9hZEZhaWxlZEJlZm9y
ZUNvbW1pdCgKKyAgICAgICAgICAgICAgICBvcmlnaW5hbFVybC5jaGFyYWN0ZXJzKCksIG9yaWdp
bmFsVXJsLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICB1cmwuY2hhcmFjdGVycygpLCB1
cmwubGVuZ3RoKCksIHRva2VuLmNoYXJhY3RlcnMoKSwgdG9rZW4ubGVuZ3RoKCkpOworICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlm
eUxvYWRDb21taXR0ZWQoCisgICAgICAgICAgICAgICAgb3JpZ2luYWxVcmwuY2hhcmFjdGVycygp
LCBvcmlnaW5hbFVybC5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgdXJsLmNoYXJhY3Rl
cnMoKSwgdXJsLmxlbmd0aCgpLCB0b2tlbi5jaGFyYWN0ZXJzKCksIHRva2VuLmxlbmd0aCgpKTsK
KyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5k
ZXJUcmVlKQorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlLT5kaWRD
b21taXRMb2FkRm9yRnJhbWUobV9mcmFtZSk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5OjpkaXNwYXRjaERpZEhhbmRsZU9ubG9hZEV2ZW50cygpCit7CisgICAgbV93ZWJQ
YWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlmeURvY3VtZW50T25Mb2FkKCk7CisgICAgaWYgKG1f
d2ViUGFnZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUpCisgICAgICAgIG1fd2ViUGFnZVByaXZh
dGUtPm1fZHVtcFJlbmRlclRyZWUtPmRpZEhhbmRsZU9ubG9hZEV2ZW50c0ZvckZyYW1lKG1fZnJh
bWUpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRG
aW5pc2hMb2FkKCkKK3sKKyAgICBkaWRGaW5pc2hPckZhaWxMb2FkaW5nKFJlc291cmNlRXJyb3Io
KSk7CisKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZSkKKyAgICAg
ICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZS0+ZGlkRmluaXNoTG9hZEZvckZy
YW1lKG1fZnJhbWUpOworCisgICAgaWYgKCFpc01haW5GcmFtZSgpIHx8IG1fd2ViUGFnZVByaXZh
dGUtPm1fd2ViU2V0dGluZ3MtPmlzRW1haWxNb2RlKCkKKyAgICAgICAgfHwgIW1fZnJhbWUtPmRv
Y3VtZW50KCkgfHwgIW1fZnJhbWUtPmRvY3VtZW50KCktPmhlYWQoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgSFRNTEhlYWRFbGVtZW50KiBoZWFkRWxlbWVudCA9IG1fZnJhbWUtPmRvY3VtZW50
KCktPmhlYWQoKTsKKyAgICAvLyBGSVhNRTogSGFuZGxlIE5PU0NSSVBUIHNwZWNpYWwgY2FzZT8K
KworICAgIC8vIFByb2Nlc3MgZG9jdW1lbnQgbWV0YWRhdGEuCisgICAgUmVmUHRyPE5vZGVMaXN0
PiBub2RlTGlzdCA9IGhlYWRFbGVtZW50LT5nZXRFbGVtZW50c0J5VGFnTmFtZShIVE1MTmFtZXM6
Om1ldGFUYWcubG9jYWxOYW1lKCkpOworICAgIHVuc2lnbmVkIGludCBzaXplID0gbm9kZUxpc3Qt
Pmxlbmd0aCgpOworICAgIFNjb3BlQXJyYXk8V2ViU3RyaW5nPiBoZWFkZXJzOworCisgICAgLy8g
VGhpcyBtYXkgYWxsb2NhdGUgbW9yZSBzcGFjZSB0aGFuIG5lZWRlZCBzaW5jZSBub3QgYWxsIG1l
dGEgZWxlbWVudHMgd2lsbCBiZSBodHRwLWVxdWl2LgorICAgIGhlYWRlcnMucmVzZXQobmV3IFdl
YlN0cmluZ1syICogc2l6ZV0pOworICAgIHVuc2lnbmVkIGhlYWRlcnNMZW5ndGggPSAwOworCisg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBIVE1MTWV0
YUVsZW1lbnQqIG1ldGFFbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTE1ldGFFbGVtZW50Kj4obm9k
ZUxpc3QtPml0ZW0oaSkpOworICAgICAgICBpZiAoV1RGOjplcXVhbElnbm9yaW5nQ2FzZShtZXRh
RWxlbWVudC0+bmFtZSgpLCAiYXBwbGUtbW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIpCisgICAgICAg
ICAgICAmJiBXVEY6OmVxdWFsSWdub3JpbmdDYXNlKG1ldGFFbGVtZW50LT5jb250ZW50KCkuc3Ry
aXBXaGl0ZVNwYWNlKCksICJ5ZXMiKSkKKyAgICAgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1f
Y2xpZW50LT5zZXRXZWJBcHBDYXBhYmxlKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAg
U3RyaW5nIGh0dHBFcXVpdiA9IG1ldGFFbGVtZW50LT5odHRwRXF1aXYoKS5zdHJpcFdoaXRlU3Bh
Y2UoKTsKKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gbWV0YUVsZW1lbnQtPmNvbnRlbnQo
KS5zdHJpcFdoaXRlU3BhY2UoKTsKKworICAgICAgICAgICAgaWYgKCFodHRwRXF1aXYuaXNOdWxs
KCkgJiYgIWNvbnRlbnQuaXNOdWxsKCkpIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJzW2hlYWRl
cnNMZW5ndGgrK10gPSBodHRwRXF1aXY7CisgICAgICAgICAgICAgICAgaGVhZGVyc1toZWFkZXJz
TGVuZ3RoKytdID0gY29udGVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwor
ICAgIGlmIChoZWFkZXJzTGVuZ3RoID4gMCkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9j
bGllbnQtPnNldE1ldGFIZWFkZXJzKGhlYWRlcnMsIGhlYWRlcnNMZW5ndGgpOworCisgICAgbm9k
ZUxpc3QgPSBoZWFkRWxlbWVudC0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoSFRNTE5hbWVzOjpsaW5r
VGFnLmxvY2FsTmFtZSgpKTsKKyAgICBzaXplID0gbm9kZUxpc3QtPmxlbmd0aCgpOworCisgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBIVE1MTGlua0Vs
ZW1lbnQqIGxpbmtFbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTExpbmtFbGVtZW50Kj4obm9kZUxp
c3QtPml0ZW0oaSkpOworICAgICAgICBTdHJpbmcgaHJlZiA9IGxpbmtFbGVtZW50LT5ocmVmKCku
c3RyaW5nKCk7CisgICAgICAgIGlmICghaHJlZi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIFN0
cmluZyB0aXRsZSA9IGxpbmtFbGVtZW50LT50aXRsZSgpOworCisgICAgICAgICAgICBpZiAoV1RG
OjplcXVhbElnbm9yaW5nQ2FzZShsaW5rRWxlbWVudC0+cmVsKCksICJhcHBsZS10b3VjaC1pY29u
IikpCisgICAgICAgICAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPnNldExhcmdl
SWNvbihocmVmLmxhdGluMSgpLmRhdGEoKSk7CisgICAgICAgICAgICBlbHNlIGlmIChXVEY6OmVx
dWFsSWdub3JpbmdDYXNlKGxpbmtFbGVtZW50LT5yZWwoKSwgInNlYXJjaCIpKSB7CisgICAgICAg
ICAgICAgICAgaWYgKFdURjo6ZXF1YWxJZ25vcmluZ0Nhc2UobGlua0VsZW1lbnQtPnR5cGUoKSwg
ImFwcGxpY2F0aW9uL29wZW5zZWFyY2hkZXNjcmlwdGlvbit4bWwiKSkKKyAgICAgICAgICAgICAg
ICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPnNldFNlYXJjaFByb3ZpZGVyRGV0YWls
cyh0aXRsZS51dGY4KCkuZGF0YSgpLCBocmVmLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICAgICAg
fSBlbHNlIGlmIChXVEY6OmVxdWFsSWdub3JpbmdDYXNlKGxpbmtFbGVtZW50LT5yZWwoKSwgImFs
dGVybmF0ZSIpCisgICAgICAgICAgICAgICAgJiYgKFdURjo6ZXF1YWxJZ25vcmluZ0Nhc2UobGlu
a0VsZW1lbnQtPnR5cGUoKSwgImFwcGxpY2F0aW9uL3Jzcyt4bWwiKQorICAgICAgICAgICAgICAg
IHx8IFdURjo6ZXF1YWxJZ25vcmluZ0Nhc2UobGlua0VsZW1lbnQtPnR5cGUoKSwgImFwcGxpY2F0
aW9uL2F0b20reG1sIikpKQorICAgICAgICAgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xp
ZW50LT5zZXRBbHRlcm5hdGVGZWVkRGV0YWlscyh0aXRsZS51dGY4KCkuZGF0YSgpLCBocmVmLnV0
ZjgoKS5kYXRhKCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xp
ZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRGaW5pc2hEb2N1bWVudExvYWQoKQoreworICAgIGlm
IChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlKQorICAgICAgICBtX3dlYlBhZ2VQ
cml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlLT5kaWRGaW5pc2hEb2N1bWVudExvYWRGb3JGcmFtZSht
X2ZyYW1lKTsKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCisKK3ZvaWQgRnJhbWVMb2FkZXJD
bGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZEZhaWxMb2FkKGNvbnN0IFJlc291cmNlRXJyb3Im
IGVycm9yKQoreworICAgIGRpZEZpbmlzaE9yRmFpbExvYWRpbmcoZXJyb3IpOworICAgIGlmICht
X3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlKQorICAgICAgICBtX3dlYlBhZ2VQcml2
YXRlLT5tX2R1bXBSZW5kZXJUcmVlLT5kaWRGYWlsTG9hZEZvckZyYW1lKG1fZnJhbWUpOworfQor
Cit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlkRmluaXNoT3JGYWlsTG9hZGlu
Zyhjb25zdCBSZXNvdXJjZUVycm9yJiBlcnJvcikKK3sKKyAgICAvLyBGSVhNRTogRG8gd2UgbmVl
ZCB0byBmaW5kIGEgcmVwbGFjZW1lbnQgZm9yIG1fZnJhbWUtPmRvY3VtZW50KCktPnNldEV4dHJh
TGF5b3V0RGVsYXkoMCk7PworCisgICAgLy8gSWYgd2UgaGF2ZSBmaW5pc2hlZCBsb2FkaW5nIGEg
cGFnZSB0aHJvdWdoIGhpc3RvcnkgbmF2aWdhdGlvbiwgYW55CisgICAgLy8gYXR0ZW1wdCB0byBn
byBiYWNrIHRvIHRoYXQgcGFnZSB0aHJvdWdoIGFuIGF1dG9tYXRpYyByZWRpcmVjdCBzaG91bGQg
YmUKKyAgICAvLyBkZW5pZWQgdG8gYXZvaWQgcmVkaXJlY3QgbG9vcHMuIFNvIHNhdmUgdGhlIGhp
c3RvcnkgbmF2aWdhdGlvbiB1cmxzIHRvCisgICAgLy8gY2hlY2sgbGF0ZXIuIChJZiB0aGlzIHdh
cyBub3QgYSBoaXN0b3J5IG5hdmlnYXRpb24sCisgICAgLy8gbV9oaXN0b3J5TmF2aWdhdGlvblNv
dXJjZVVSTHMgd2lsbCBiZSBlbXB0eSwgYW5kIHdlIHNob3VsZCBzYXZlIHRoYXQKKyAgICAvLyB0
b28uKQorICAgIG1fcmVkaXJlY3RVUkxzVG9Ta2lwRHVlVG9IaXN0b3J5TmF2aWdhdGlvbi5zd2Fw
KG1faGlzdG9yeU5hdmlnYXRpb25Tb3VyY2VVUkxzKTsKKworICAgIC8vIEhpc3RvcnkgbmF2aWdh
dGlvbiBpcyBmaW5pc2hlZCBzbyBjbGVhciB0aGUgaGlzdG9yeSBuYXZpZ2F0aW9uIHVybC4KKyAg
ICBtX2hpc3RvcnlOYXZpZ2F0aW9uU291cmNlVVJMcy5jbGVhcigpOworCisgICAgaWYgKGlzTWFp
bkZyYW1lKCkpIHsKKyAgICAgICAgbV9sb2FkRXJyb3IgPSBlcnJvcjsKKyAgICAgICAgbV93ZWJQ
YWdlUHJpdmF0ZS0+c2V0TG9hZFN0YXRlKGVycm9yLmlzTnVsbCgpID8gV2ViUGFnZVByaXZhdGU6
OkZpbmlzaGVkIDogV2ViUGFnZVByaXZhdGU6OkZhaWxlZCk7CisgICAgfQorfQorCit2b2lkIEZy
YW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRGYWlsUHJvdmlzaW9uYWxMb2Fk
KGNvbnN0IFJlc291cmNlRXJyb3ImIGVycm9yKQoreworICAgIGlmIChpc01haW5GcmFtZSgpKSB7
CisgICAgICAgIG1fbG9hZEVycm9yID0gZXJyb3I7CisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUt
PnNldExvYWRTdGF0ZShXZWJQYWdlUHJpdmF0ZTo6RmFpbGVkKTsKKworICAgICAgICBpZiAoZXJy
b3IuZG9tYWluKCkgPT0gUmVzb3VyY2VFcnJvcjo6cGxhdGZvcm1FcnJvckRvbWFpbgorICAgICAg
ICAgICAgICAgICYmIChlcnJvci5lcnJvckNvZGUoKSA9PSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
RmlsdGVyU3RyZWFtOjpTdGF0dXNFcnJvckFscmVhZHlIYW5kbGVkKSkgeworICAgICAgICAgICAg
Ly8gRXJyb3IgaGFzIGFscmVhZHkgYmVlbiBkaXNwbGF5ZWQgYnkgY2xpZW50LgorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVycm9yLmRvbWFpbigpLmlzRW1w
dHkoKSAmJiAhZXJyb3IuZXJyb3JDb2RlKCkgJiYgZXJyb3IuZmFpbGluZ1VSTCgpLmlzRW1wdHko
KSAmJiBlcnJvci5sb2NhbGl6ZWREZXNjcmlwdGlvbigpLmlzRW1wdHkoKSkgeworICAgICAgICAg
ICAgLy8gRG9uJ3QgdHJ5IHRvIGRpc3BsYXkgZW1wdHkgZXJyb3JzIHJldHVybmVkIGZyb20gdGhl
IHVuaW1wbGVtZW50ZWQgZXJyb3IgZnVuY3Rpb25zIGluIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tC
ZXJyeSAtIHRoZXJlJ3Mgbm90aGluZyB0byBkaXNwbGF5IGFueXdheS4KKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1
bXBSZW5kZXJUcmVlKQorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVl
LT5kaWRGYWlsUHJvdmlzaW9uYWxMb2FkRm9yRnJhbWUobV9mcmFtZSk7CisKKyAgICBpZiAoIWlz
TWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFN0cmluZyBlcnJvclBhZ2UgPSBt
X3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+Z2V0RXJyb3JQYWdlKGVycm9yLmVycm9yQ29kZSgp
CisgICAgICAgICAgICAsIGVycm9yLmxvY2FsaXplZERlc2NyaXB0aW9uKCkuaXNFbXB0eSgpID8g
IiIgOiBlcnJvci5sb2NhbGl6ZWREZXNjcmlwdGlvbigpLnV0ZjgoKS5kYXRhKCkKKyAgICAgICAg
ICAgICwgZXJyb3IuZmFpbGluZ1VSTCgpLmlzRW1wdHkoKSA/ICIiIDogZXJyb3IuZmFpbGluZ1VS
TCgpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgLy8gTWFrZSBzdXJlIHdlJ3JlIHN0aWxsIGluIHRo
ZSBwcm92aXNpb25hbExvYWQgc3RhdGUgLSBnZXRFcnJvclBhZ2UgcnVucyBhCisgICAgLy8gbmVz
dGVkIGV2ZW50IGxvb3Agd2hpbGUgaXQncyB3YWl0aW5nIGZvciBjbGllbnQgcmVzb3VyY2VzIHRv
IGxvYWQgc28KKyAgICAvLyB0aGVyZSdzIGEgc21hbGwgd2luZG93IGZvciB0aGUgdXNlciB0byBo
aXQgc3RvcC4KKyAgICBpZiAobV9mcmFtZS0+bG9hZGVyKCktPnByb3Zpc2lvbmFsRG9jdW1lbnRM
b2FkZXIoKSkgeworICAgICAgICBTdWJzdGl0dXRlRGF0YSBlcnJvckRhdGEodXRmOEJ1ZmZlcihl
cnJvclBhZ2UpLCAidGV4dC9odG1sIiwgInV0Zi04IiwgS1VSTChLVVJMKCksIGVycm9yLmZhaWxp
bmdVUkwoKSkpOworCisgICAgICAgIFJlc291cmNlUmVxdWVzdCBvcmlnaW5hbFJlcXVlc3QgPSBt
X2ZyYW1lLT5sb2FkZXIoKS0+cHJvdmlzaW9uYWxEb2N1bWVudExvYWRlcigpLT5vcmlnaW5hbFJl
cXVlc3QoKTsKKworICAgICAgICAvLyBMb2FkaW5nIHVzaW5nIFN1YnN0aXR1dGVEYXRhIHdpbGwg
cmVwbGFjZSB0aGUgb3JpZ2luYWwgcmVxdWVzdCB3aXRoIG91cgorICAgICAgICAvLyBlcnJvciBk
YXRhLiBUaGlzIG11c3QgYmUgZG9uZSB3aXRoaW4gZGlzcGF0Y2hEaWRGYWlsUHJvdmlzaW9uYWxM
b2FkLAorICAgICAgICAvLyBhbmQgZG8gTk9UIGNhbGwgc3RvcEFsbExvYWRlcnMgZmlyc3QsIGJl
Y2F1c2UgdGhlIGxvYWRlciBjaGVja3MgdGhlCisgICAgICAgIC8vIHByb3Zpc2lvbmFsRG9jdW1l
bnRMb2FkZXIgdG8gZGVjaWRlIHRoZSBsb2FkIHR5cGU7IGlmIGNhbGxlZCBhbnkgb3RoZXIKKyAg
ICAgICAgLy8gd2F5LCB0aGUgZXJyb3IgcGFnZSBpcyBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBo
aXN0b3J5IGluc3RlYWQgb2YKKyAgICAgICAgLy8gcmVwbGFjaW5nIHRoZSBmYWlsZWQgbG9hZC4K
KyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgdGhpcyBjb21lcyBmcm9tIGEgYmFjay9mb3J3YXJk
IG5hdmlnYXRpb24sIHdlIG5lZWQgdG8gc2F2ZSB0aGUgY3VycmVudCB2aWV3c3RhdGUKKyAgICAg
ICAgLy8gdG8gb3JpZ2luYWwgaGlzdG9yeWl0ZW0sIGFuZCBwcmV2ZW50IHRoZSByZXN0b3JlIG9m
IHZpZXcgc3RhdGUgdG8gdGhlIGVycm9yIHBhZ2UuCisKKyAgICAgICAgaWYgKGlzQmFja0Zvcndh
cmRMb2FkVHlwZShtX2ZyYW1lLT5sb2FkZXIoKS0+bG9hZFR5cGUoKSkpIHsKKyAgICAgICAgICAg
IG1fZnJhbWUtPmxvYWRlcigpLT5oaXN0b3J5KCktPnNhdmVTY3JvbGxQb3NpdGlvbkFuZFZpZXdT
dGF0ZVRvSXRlbShtX2ZyYW1lLT5sb2FkZXIoKS0+aGlzdG9yeSgpLT5jdXJyZW50SXRlbSgpKTsK
KyAgICAgICAgICAgIEFTU0VSVChtX2ZyYW1lLT5sb2FkZXIoKS0+aGlzdG9yeSgpLT5wcm92aXNp
b25hbEl0ZW0oKSk7CisgICAgICAgICAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+aGlzdG9yeSgpLT5w
cm92aXNpb25hbEl0ZW0oKS0+dmlld1N0YXRlKCkuc2hvdWxkU2F2ZVZpZXdTdGF0ZSA9IGZhbHNl
OworICAgICAgICB9CisgICAgICAgIG1fbG9hZGluZ0Vycm9yUGFnZSA9IHRydWU7CisgICAgICAg
IG1fZnJhbWUtPmxvYWRlcigpLT5sb2FkKG9yaWdpbmFsUmVxdWVzdCwgZXJyb3JEYXRhLCBmYWxz
ZSk7CisgICAgfQorfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0
Y2hXaWxsU3VibWl0Rm9ybShGcmFtZVBvbGljeUZ1bmN0aW9uIGZ1bmN0aW9uLCBQYXNzUmVmUHRy
PEZvcm1TdGF0ZT4pCit7CisgICAgLy8gRklYTUU6IFN0dWIuCisgICAgKG1fZnJhbWUtPmxvYWRl
cigpLT5wb2xpY3lDaGVja2VyKCktPipmdW5jdGlvbikoUG9saWN5VXNlKTsKK30KKworUGFzc1Jl
ZlB0cjxGcmFtZT4gRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpjcmVhdGVGcmFtZShjb25z
dCBLVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgbmFtZQorICAgICwgSFRNTEZyYW1lT3duZXJFbGVt
ZW50KiBvd25lckVsZW1lbnQsIGNvbnN0IFN0cmluZyYgcmVmZXJyZXIsIGJvb2wgYWxsb3dzU2Ny
b2xsaW5nLCBpbnQgbWFyZ2luV2lkdGgsIGludCBtYXJnaW5IZWlnaHQpCit7CisgICAgaWYgKCFt
X3dlYlBhZ2VQcml2YXRlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChtX2NoaWxkRnJh
bWVDcmVhdGlvblN1cHByZXNzZWQpCisgICAgICAgIHJldHVybiAwOworCisgICAgRnJhbWVMb2Fk
ZXJDbGllbnRCbGFja0JlcnJ5KiBmcmFtZUxvYWRlckNsaWVudCA9IG5ldyBGcmFtZUxvYWRlckNs
aWVudEJsYWNrQmVycnkoKTsKKyAgICBSZWZQdHI8RnJhbWU+IGNoaWxkRnJhbWUgPSBGcmFtZTo6
Y3JlYXRlKG1fZnJhbWUtPnBhZ2UoKSwgb3duZXJFbGVtZW50LCBmcmFtZUxvYWRlckNsaWVudCk7
CisgICAgZnJhbWVMb2FkZXJDbGllbnQtPnNldEZyYW1lKGNoaWxkRnJhbWUuZ2V0KCksIG1fd2Vi
UGFnZVByaXZhdGUpOworCisgICAgLy8gSW5pdGlhbGl6ZSBGcmFtZVZpZXcuCisgICAgUmVmUHRy
PEZyYW1lVmlldz4gZnJhbWVWaWV3ID0gRnJhbWVWaWV3OjpjcmVhdGUoY2hpbGRGcmFtZS5nZXQo
KSk7CisgICAgY2hpbGRGcmFtZS0+c2V0VmlldyhmcmFtZVZpZXcuZ2V0KCkpOworICAgIGlmICgh
YWxsb3dzU2Nyb2xsaW5nKQorICAgICAgICBmcmFtZVZpZXctPnNldFNjcm9sbGJhck1vZGVzKFNj
cm9sbGJhckFsd2F5c09mZiwgU2Nyb2xsYmFyQWx3YXlzT2ZmKTsKKyAgICBpZiAobWFyZ2luV2lk
dGggIT0gLTEpCisgICAgICAgIGZyYW1lVmlldy0+c2V0TWFyZ2luV2lkdGgobWFyZ2luV2lkdGgp
OworICAgIGlmIChtYXJnaW5IZWlnaHQgIT0gLTEpCisgICAgICAgIGZyYW1lVmlldy0+c2V0TWFy
Z2luSGVpZ2h0KG1hcmdpbkhlaWdodCk7CisKKyAgICBjaGlsZEZyYW1lLT50cmVlKCktPnNldE5h
bWUobmFtZSk7CisgICAgbV9mcmFtZS0+dHJlZSgpLT5hcHBlbmRDaGlsZChjaGlsZEZyYW1lKTsK
KyAgICBjaGlsZEZyYW1lLT5pbml0KCk7CisKKyAgICBpZiAoIWNoaWxkRnJhbWUtPnRyZWUoKS0+
cGFyZW50KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgQmFja2luZ1N0b3JlQ2xpZW50Ojpj
cmVhdGUoY2hpbGRGcmFtZS5nZXQoKSwgbV9mcmFtZSwgbV93ZWJQYWdlUHJpdmF0ZS0+bV93ZWJQ
YWdlKTsKKworICAgIG1fZnJhbWUtPmxvYWRlcigpLT5sb2FkVVJMSW50b0NoaWxkRnJhbWUodXJs
LCByZWZlcnJlciwgY2hpbGRGcmFtZS5nZXQoKSk7CisKKyAgICBpZiAoIWNoaWxkRnJhbWUtPnRy
ZWUoKS0+cGFyZW50KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGNoaWxkRnJh
bWUucmVsZWFzZSgpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlk
VHJhbnNmZXJDaGlsZEZyYW1lVG9OZXdEb2N1bWVudChQYWdlKiAvKm9sZFBhZ2UqLykKK3sKKyAg
ICBQYWdlKiBuZXdQYWdlID0gbV9mcmFtZS0+cGFnZSgpOworICAgIG1fd2ViUGFnZVByaXZhdGUg
PSBzdGF0aWNfY2FzdDxDaHJvbWVDbGllbnRCbGFja0JlcnJ5Kj4obmV3UGFnZS0+Y2hyb21lKCkt
PmNsaWVudCgpKS0+d2ViUGFnZVByaXZhdGUoKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVu
dEJsYWNrQmVycnk6OnRyYW5zZmVyTG9hZGluZ1Jlc291cmNlRnJvbVBhZ2UoUmVzb3VyY2VMb2Fk
ZXIqLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmLCBQYWdlKikKK3sKKyAgICBub3RJbXBsZW1lbnRl
ZCgpOworfQorCitPYmplY3RDb250ZW50VHlwZSBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6
Om9iamVjdENvbnRlbnRUeXBlKGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiBtaW1lVHlw
ZUluLCBib29sIHNob3VsZFByZWZlclBsdWdJbnNGb3JJbWFnZXMpCit7CisgICAgU3RyaW5nIG1p
bWVUeXBlID0gbWltZVR5cGVJbjsKKyAgICBpZiAobWltZVR5cGUuaXNFbXB0eSgpKQorICAgICAg
ICBtaW1lVHlwZSA9IE1JTUVUeXBlUmVnaXN0cnk6OmdldE1JTUVUeXBlRm9yUGF0aCh1cmwucGF0
aCgpKTsKKworICAgIC8vIEdldCBtYXBwZWQgdHlwZS4KKyAgICBtaW1lVHlwZSA9IEJsYWNrQmVy
cnk6OldlYktpdDo6V2ViU2V0dGluZ3M6OmdldE5vcm1hbGl6ZWRNSU1FVHlwZShtaW1lVHlwZSk7
CisKKyAgICBPYmplY3RDb250ZW50VHlwZSBkZWZhdWx0VHlwZSA9IEZyYW1lTG9hZGVyOjpkZWZh
dWx0T2JqZWN0Q29udGVudFR5cGUodXJsLCBtaW1lVHlwZSwgc2hvdWxkUHJlZmVyUGx1Z0luc0Zv
ckltYWdlcyk7CisgICAgaWYgKGRlZmF1bHRUeXBlICE9IE9iamVjdENvbnRlbnROb25lKQorICAg
ICAgICByZXR1cm4gZGVmYXVsdFR5cGU7CisKKyAgICBpZiAoQmxhY2tCZXJyeTo6V2ViS2l0OjpX
ZWJTZXR0aW5nczo6aXNTdXBwb3J0ZWRPYmplY3RNSU1FVHlwZShtaW1lVHlwZSkpCisgICAgICAg
IHJldHVybiBPYmplY3RDb250ZW50T3RoZXJQbHVnaW47CisKKyAgICByZXR1cm4gT2JqZWN0Q29u
dGVudE5vbmU7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRj
aFdpbGxDbG9zZSgpCit7CisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9pbnB1dEhhbmRsZXItPmZy
YW1lVW5sb2FkZWQobV9mcmFtZSk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0Jl
cnJ5OjpzZXRNYWluRG9jdW1lbnRFcnJvcihEb2N1bWVudExvYWRlciosIGNvbnN0IFJlc291cmNl
RXJyb3ImIGVycm9yKQoreworICAgIGlmICghbV9wbHVnaW5WaWV3KQorICAgICAgICByZXR1cm47
CisKKyAgICBtX3BsdWdpblZpZXctPmRpZEZhaWwoZXJyb3IpOworICAgIG1fcGx1Z2luVmlldyA9
IDA7CisgICAgbV9oYXNTZW50UmVzcG9uc2VUb1BsdWdpbiA9IGZhbHNlOworfQorCit2b2lkIEZy
YW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6cG9zdFByb2dyZXNzU3RhcnRlZE5vdGlmaWNhdGlv
bigpCit7CisgICAgaWYgKCFpc01haW5GcmFtZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAv
LyBOZXcgbG9hZCBzdGFydGVkLCBzbyBjbGVhciB0aGUgZXJyb3IuCisgICAgbV9sb2FkRXJyb3Ig
PSBSZXNvdXJjZUVycm9yKCk7CisgICAgbV9zZW50UmVhZHlUb1JlbmRlciA9IGZhbHNlOworICAg
IG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5ub3RpZnlMb2FkU3RhcnRlZCgpOworfQorCit2
b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6cG9zdFByb2dyZXNzRXN0aW1hdGVDaGFu
Z2VkTm90aWZpY2F0aW9uKCkKK3sKKyAgICBpZiAoIWlzTWFpbkZyYW1lKCkgfHwgIW1fZnJhbWUt
PnBhZ2UoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGll
bnQtPm5vdGlmeUxvYWRQcm9ncmVzcyhtX2ZyYW1lLT5wYWdlKCktPnByb2dyZXNzKCktPmVzdGlt
YXRlZFByb2dyZXNzKCkgKiAxMDApOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tC
ZXJyeTo6ZGlzcGF0Y2hEaWRGaXJzdFZpc3VhbGx5Tm9uRW1wdHlMYXlvdXQoKQoreworICAgIGlm
ICghaXNNYWluRnJhbWUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiZGlzcGF0Y2hE
aWRGaXJzdFZpc3VhbGx5Tm9uRW1wdHlMYXlvdXQiKTsKKworICAgIHJlYWR5VG9SZW5kZXIodHJ1
ZSk7CisKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkbid0IGJlIGdldHRpbmcgaGVyZSBpZiB3ZSBh
cmUgbm90IGluIHRoZSBDb21taXR0ZWQgc3RhdGUgYnV0IHdlIGFyZQorICAgIC8vIHNvIHdlIGNh
biBub3QgYXNzZXJ0IG9uIHRoYXQgcmlnaHQgbm93LiBCdXQgd2Ugb25seSB3YW50IHRvIGRvIHRo
aXMgb24gbG9hZC4KKyAgICAvLyBSSU0gQnVnICM1NTUKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0
ZS0+bG9hZFN0YXRlKCkgPT0gV2ViUGFnZVByaXZhdGU6OkNvbW1pdHRlZCkgeworICAgICAgICBt
X3dlYlBhZ2VQcml2YXRlLT56b29tVG9Jbml0aWFsU2NhbGVPbkxvYWQoKTsgLy8gU2V0IHRoZSBw
cm9wZXIgem9vbSBsZXZlbCBmaXJzdC4KKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9iYWNr
aW5nU3RvcmUtPmQtPmNsZWFyVmlzaWJsZVpvb20oKTsgLy8gQ2xlYXIgdGhlIHZpc2libGUgem9v
bSBzaW5jZSB3ZSdyZSBleHBsaWNpdGx5IHJlbmRlcmluZytibGl0dGluZyBiZWxvdy4KKyAgICAg
ICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9iYWNraW5nU3RvcmUtPmQtPnJlbmRlclZpc2libGVDb250
ZW50cygpOworICAgIH0KKworICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5ub3RpZnlG
aXJzdFZpc3VhbGx5Tm9uRW1wdHlMYXlvdXQoKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVu
dEJsYWNrQmVycnk6OnBvc3RQcm9ncmVzc0ZpbmlzaGVkTm90aWZpY2F0aW9uKCkKK3sKKyAgICBp
ZiAoIWlzTWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEVtcHR5IHBhZ2Vz
IHdpbGwgbmV2ZXIgaGF2ZSBjYWxsZWQKKyAgICAvLyBkaXNwYXRjaERpZEZpcnN0VmlzdWFsbHlO
b25FbXB0eUxheW91dCwgc2luY2UgdGhleSdyZSB2aXN1YWxseSBlbXB0eSwgc28KKyAgICAvLyB3
ZSBtYXkgbmVlZCB0byBjYWxsIHJlYWR5VG9SZW5kZXIgbm93LgorICAgIHJlYWR5VG9SZW5kZXIo
ZmFsc2UpOworCisgICAgLy8gRklYTUU6IFNlbmQgdXAgYSByZWFsIHN0YXR1cyBjb2RlLgorICAg
IG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5ub3RpZnlMb2FkRmluaXNoZWQobV9sb2FkRXJy
b3IuaXNOdWxsKCkgPyAwIDogLTEpOworCisgICAgLy8gTm90aWZ5IHBsdWdpbnMgdGhhdCBhcmUg
d2FpdGluZyBmb3IgdGhlIHBhZ2UgdG8gZnVsbHkgbG9hZCBiZWZvcmUgc3RhcnRpbmcgdGhhdAor
ICAgIC8vIHRoZSBsb2FkIGhhcyBjb21wbGV0ZWQuCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bm90
aWZ5UGFnZU9uTG9hZCgpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6
ZGlzcGF0Y2hEaWRDbGVhcldpbmRvd09iamVjdEluV29ybGQoRE9NV3JhcHBlcldvcmxkKiB3b3Js
ZCkKK3sKKyAgICBpZiAod29ybGQgIT0gbWFpblRocmVhZE5vcm1hbFdvcmxkKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIC8vIFByb3ZpZGUgdGhlIGV4dGVuc2lvbiBvYmplY3QgZmlyc3QgaW4g
Y2FzZSB0aGUgY2xpZW50IG9yIG90aGVycyB3YW50IHRvIHVzZSBpdAorICAgIC8vIEZJWE1FOiBD
b25kaXRpb25hbGx5IGF0dGFjaCBleHRlbnNpb24gb2JqZWN0IGJhc2VkIG9uIHNvbWUgZmxhZyBv
ciB3aGV0aGVyIG9yIG5vdCB3ZQorICAgIC8vIGFyZSBicm93c2VyIG9yIHNvbWV0aGluZyBlbHNl
LgorICAgIGF0dGFjaEV4dGVuc2lvbk9iamVjdFRvRnJhbWUobV9mcmFtZSwgbV93ZWJQYWdlUHJp
dmF0ZS0+bV9jbGllbnQpOworCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlm
eVdpbmRvd09iamVjdENsZWFyZWQoKTsKKworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1
bXBSZW5kZXJUcmVlKSB7CisgICAgICAgIEpTR2xvYmFsQ29udGV4dFJlZiBjb250ZXh0ID0gdG9H
bG9iYWxSZWYobV9mcmFtZS0+c2NyaXB0KCktPmdsb2JhbE9iamVjdChtYWluVGhyZWFkTm9ybWFs
V29ybGQoKSktPmdsb2JhbEV4ZWMoKSk7CisgICAgICAgIEpTT2JqZWN0UmVmIHdpbmRvd09iamVj
dCA9IHRvUmVmKG1fZnJhbWUtPnNjcmlwdCgpLT5nbG9iYWxPYmplY3QobWFpblRocmVhZE5vcm1h
bFdvcmxkKCkpKTsKKyAgICAgICAgQVNTRVJUKHdpbmRvd09iamVjdCk7CisgICAgICAgIG1fd2Vi
UGFnZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUtPmRpZENsZWFyV2luZG93T2JqZWN0SW5Xb3Js
ZCh3b3JsZCwgY29udGV4dCwgd2luZG93T2JqZWN0KTsKKyAgICB9Cit9CisKK2Jvb2wgRnJhbWVM
b2FkZXJDbGllbnRCbGFja0JlcnJ5OjpzaG91bGRHb1RvSGlzdG9yeUl0ZW0oSGlzdG9yeUl0ZW0q
KSBjb25zdAoreworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEZyYW1lTG9hZGVyQ2xpZW50
QmxhY2tCZXJyeTo6c2hvdWxkU3RvcExvYWRpbmdGb3JIaXN0b3J5SXRlbShIaXN0b3J5SXRlbSop
IGNvbnN0Cit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5OjppbnZhbGlkYXRlQmFja0ZvcndhcmRMaXN0KCkgY29uc3QKK3sKKyAgICBub3Rp
ZnlCYWNrRm9yd2FyZExpc3RDaGFuZ2VkKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5Ojpub3RpZnlCYWNrRm9yd2FyZExpc3RDaGFuZ2VkKCkgY29uc3QKK3sKKyAgICBC
YWNrRm9yd2FyZExpc3RJbXBsKiBiYWNrRm9yd2FyZExpc3QgPSBzdGF0aWNfY2FzdDxCYWNrRm9y
d2FyZExpc3RJbXBsKj4obV93ZWJQYWdlUHJpdmF0ZS0+bV9wYWdlLT5iYWNrRm9yd2FyZCgpLT5j
bGllbnQoKSk7CisgICAgQVNTRVJUKGJhY2tGb3J3YXJkTGlzdCk7CisKKyAgICB1bnNpZ25lZCBs
aXN0U2l6ZSA9IGJhY2tGb3J3YXJkTGlzdC0+ZW50cmllcygpLnNpemUoKTsKKyAgICB1bnNpZ25l
ZCBjdXJyZW50SW5kZXggPSBiYWNrRm9yd2FyZExpc3QtPmJhY2tMaXN0Q291bnQoKTsKKyAgICBt
X3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+cmVzZXRCYWNrRm9yd2FyZExpc3QobGlzdFNpemUs
IGN1cnJlbnRJbmRleCk7Cit9CisKK0ZyYW1lKiBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6
OmRpc3BhdGNoQ3JlYXRlUGFnZShjb25zdCBOYXZpZ2F0aW9uQWN0aW9uJiBuYXZpZ2F0aW9uKQor
eworICAgIEJsYWNrQmVycnk6OldlYktpdDo6V2ViUGFnZSogd2ViUGFnZSA9IG1fd2ViUGFnZVBy
aXZhdGUtPm1fY2xpZW50LT5jcmVhdGVXaW5kb3coMCwgMCwgLTEsIC0xLCBCbGFja0JlcnJ5OjpX
ZWJLaXQ6OldlYlBhZ2VDbGllbnQ6OkZsYWdXaW5kb3dEZWZhdWx0LCBuYXZpZ2F0aW9uLnVybCgp
LnN0cmluZygpLCBXZWJTdHJpbmcoKSk7CisgICAgaWYgKCF3ZWJQYWdlKQorICAgICAgICByZXR1
cm4gMDsKKworICAgIHJldHVybiB3ZWJQYWdlLT5kLT5tX3BhZ2UtPm1haW5GcmFtZSgpOworfQor
Cit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGV0YWNoZWRGcm9tUGFyZW50Migp
Cit7CisgICAgQmFja2luZ1N0b3JlQ2xpZW50KiBiYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZSA9
IG1fd2ViUGFnZVByaXZhdGUtPmJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKG1fZnJhbWUpOwor
ICAgIGlmIChiYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZSkgeworICAgICAgICBkZWxldGUgYmFj
a2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWU7CisgICAgICAgIGJhY2tpbmdTdG9yZUNsaWVudEZvckZy
YW1lID0gMDsKKyAgICB9CisKKyAgICBpZiAobV9mcmFtZS0+ZG9jdW1lbnQoKSkKKyAgICAgICAg
bV93ZWJQYWdlUHJpdmF0ZS0+Y2xlYXJEb2N1bWVudERhdGEobV9mcmFtZS0+ZG9jdW1lbnQoKSk7
CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2lucHV0SGFuZGxlci0+ZnJhbWVVbmxvYWRlZCht
X2ZyYW1lKTsKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+bm90aWZ5RnJhbWVEZXRh
Y2hlZChtX2ZyYW1lKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRp
c3BhdGNoV2lsbFNlbmRSZXF1ZXN0KERvY3VtZW50TG9hZGVyKiBkb2NMb2FkZXIsIGxvbmcgdW5z
aWduZWQgaW50LCBSZXNvdXJjZVJlcXVlc3QmIHJlcXVlc3QsIGNvbnN0IFJlc291cmNlUmVzcG9u
c2UmKQoreworICAgIC8vIElmIHRoZSByZXF1ZXN0IGlzIGJlaW5nIGxvYWRlZCBieSB0aGUgcHJv
dmlzaW9uYWwgZG9jdW1lbnQgbG9hZGVyLCB0aGVuCisgICAgLy8gaXQgaXMgYSBuZXcgdG9wIGxl
dmVsIHJlcXVlc3Qgd2hpY2ggaGFzIG5vdCBiZWVuIGNvbW1pdGVkLgorICAgIGJvb2wgaXNNYWlu
UmVzb3VyY2VMb2FkID0gZG9jTG9hZGVyICYmIGRvY0xvYWRlciA9PSBkb2NMb2FkZXItPmZyYW1l
TG9hZGVyKCktPnByb3Zpc2lvbmFsRG9jdW1lbnRMb2FkZXIoKTsKKworICAgIC8vIEFueSBwcm9j
ZXNzaW5nIHdoaWNoIGlzIGRvbmUgZm9yIGFsbCBsb2FkcyAoYm90aCBtYWluIGFuZCBzdWJyZXNv
dXJjZSkgc2hvdWxkIGdvIGhlcmUuCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtS
ZXF1ZXN0IHBsYXRmb3JtUmVxdWVzdDsKKyAgICByZXF1ZXN0LmluaXRpYWxpemVQbGF0Zm9ybVJl
cXVlc3QocGxhdGZvcm1SZXF1ZXN0LCBmYWxzZSAvKmlzSW5pdGlhbCovKTsKKyAgICBtX3dlYlBh
Z2VQcml2YXRlLT5tX2NsaWVudC0+cG9wdWxhdGVDdXN0b21IZWFkZXJzKHBsYXRmb3JtUmVxdWVz
dCk7CisgICAgY29uc3QgQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpIZWFk
ZXJMaXN0JiBoZWFkZXJMaXN0cyA9IHBsYXRmb3JtUmVxdWVzdC5nZXRIZWFkZXJMaXN0UmVmKCk7
CisgICAgZm9yIChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkhlYWRlckxp
c3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaGVhZGVyTGlzdHMuYmVnaW4oKTsgaXQgIT0gaGVhZGVy
TGlzdHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaGVhZGVyU3RyaW5nID0g
aXQtPmZpcnN0OworICAgICAgICBzdGQ6OnN0cmluZyBoZWFkZXJWYWx1ZVN0cmluZyA9IGl0LT5z
ZWNvbmQ7CisgICAgICAgIHJlcXVlc3Quc2V0SFRUUEhlYWRlckZpZWxkKFN0cmluZyhoZWFkZXJT
dHJpbmcuY19zdHIoKSksIFN0cmluZyhoZWFkZXJWYWx1ZVN0cmluZy5jX3N0cigpKSk7CisgICAg
fQorICAgIGlmIChjb29raWVzRW5hYmxlZCgpKSB7CisgICAgICAgIFN0cmluZyBjb29raWVQYWly
cyA9IGNvb2tpZU1hbmFnZXIoKS5nZXRDb29raWUocmVxdWVzdC51cmwoKSwgV2l0aEh0dHBPbmx5
Q29va2llcyk7CisgICAgICAgIGlmICghY29va2llUGFpcnMuaXNFbXB0eSgpKSB7CisgICAgICAg
ICAgICAvLyBXZSBvbmx5IG1vZGlmeSB0aGUgV2ViQ29yZSByZXF1ZXN0IHRvIG1ha2UgdGhlIGNv
b2tpZXMgdmlzaWJsZSBpbiBpbnNwZWN0b3IuCisgICAgICAgICAgICByZXF1ZXN0LnNldEhUVFBI
ZWFkZXJGaWVsZChTdHJpbmcoIkNvb2tpZSIpLCBjb29raWVQYWlycyk7CisgICAgICAgIH0KKyAg
ICB9CisgICAgaWYgKCFpc01haW5SZXNvdXJjZUxvYWQpIHsKKyAgICAgICAgLy8gRG8gbm90aGlu
ZyBmb3Igbm93LgorICAgICAgICAvLyBBbnkgcHJvY2Vzc2luZyB3aGljaCBpcyBkb25lIG9ubHkg
Zm9yIHN1YnJlc291cmNlcyBzaG91bGQgZ28gaGVyZS4KKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIC8vIEFsbCBwcm9jZXNzaW5nIGJleW9uZCB0aGlzIHBvaW50IGlzIGRvbmUgb25seSBm
b3IgbWFpbiByZXNvdXJjZSBsb2Fkcy4KKworICAgIGlmIChtX2NsaWVudFJlZGlyZWN0SXNQZW5k
aW5nICYmIGlzTWFpbkZyYW1lKCkpIHsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsVXJsID0gbV9m
cmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCkuc3RyaW5nKCk7CisgICAgICAgIFN0cmluZyBmaW5hbFVy
bCA9IHJlcXVlc3QudXJsKCkuc3RyaW5nKCk7CisKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+
bV9jbGllbnQtPm5vdGlmeUNsaWVudFJlZGlyZWN0KG9yaWdpbmFsVXJsLmNoYXJhY3RlcnMoKSwg
b3JpZ2luYWxVcmwubGVuZ3RoKCksCisgICAgICAgICAgICBmaW5hbFVybC5jaGFyYWN0ZXJzKCks
IGZpbmFsVXJsLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogVXBkYXRlIHRoZSBy
ZXF1ZXN0IHR5cGUuIFNlZSBQUiAjMTE5NzkyLgorICAgIGlmIChkb2NMb2FkZXItPmZyYW1lTG9h
ZGVyKCktPmlzTG9hZGluZ01haW5GcmFtZSgpKQorICAgICAgICByZXF1ZXN0LnNldFRhcmdldFR5
cGUoUmVzb3VyY2VSZXF1ZXN0OjpUYXJnZXRJc01haW5GcmFtZSk7CisgICAgZWxzZQorICAgICAg
ICByZXF1ZXN0LnNldFRhcmdldFR5cGUoUmVzb3VyY2VSZXF1ZXN0OjpUYXJnZXRJc1N1YmZyYW1l
KTsKKworICAgIEZyYW1lTG9hZGVyKiBsb2FkZXIgPSBtX2ZyYW1lLT5sb2FkZXIoKTsKKyAgICBB
U1NFUlQobG9hZGVyKTsKKyAgICBpZiAoaXNCYWNrRm9yd2FyZExvYWRUeXBlKGxvYWRlci0+bG9h
ZFR5cGUoKSkpIHsKKyAgICAgICAgLy8gRG8gbm90IHVzZSB0aGUgcGFzc2VkIERvY3VtZW50TG9h
ZGVyIGJlY2F1c2UgaXQgaXMgdGhlIGxvYWRlciB0aGF0CisgICAgICAgIC8vIHdpbGwgYmUgdXNl
ZCBmb3IgdGhlIG5ldyByZXF1ZXN0ICh0aGUgREVTVElOQVRJT04gb2YgdGhlIGhpc3RvcnkKKyAg
ICAgICAgLy8gbmF2aWdhdGlvbiAtIHdlIHdhbnQgdG8gdXNlIHRoZSBjdXJyZW50IERvY3VtZW50
TG9hZGVyIHRvIHJlY29yZCB0aGUKKyAgICAgICAgLy8gU09VUkNFKS4KKyAgICAgICAgRG9jdW1l
bnRMb2FkZXIqIGRvY0xvYWRlciA9IG1fZnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigp
OworICAgICAgICBBU1NFUlQoZG9jTG9hZGVyKTsKKyAgICAgICAgbV9oaXN0b3J5TmF2aWdhdGlv
blNvdXJjZVVSTHMuYWRkKGRvY0xvYWRlci0+dXJsKCkpOworICAgICAgICBtX2hpc3RvcnlOYXZp
Z2F0aW9uU291cmNlVVJMcy5hZGQoZG9jTG9hZGVyLT5vcmlnaW5hbFVSTCgpKTsKKyAgICB9Cit9
CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpsb2FkSWNvbkV4dGVybmFsbHko
Y29uc3QgU3RyaW5nJiBvcmlnaW5hbFBhZ2VVcmwsIGNvbnN0IFN0cmluZyYgZmluYWxQYWdlVXJs
LCBjb25zdCBTdHJpbmcmIGljb25VcmwpCit7CisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGll
bnQtPnNldEljb25Gb3JVcmwob3JpZ2luYWxQYWdlVXJsLnV0ZjgoKS5kYXRhKCksIGZpbmFsUGFn
ZVVybC51dGY4KCkuZGF0YSgpLCBpY29uVXJsLnV0ZjgoKS5kYXRhKCkpOworfQorCit2b2lkIEZy
YW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6c2F2ZVZpZXdTdGF0ZVRvSXRlbShIaXN0b3J5SXRl
bSogaXRlbSkKK3sKKyAgICBpZiAoIWlzTWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIEFTU0VSVChpdGVtKTsKKyAgICBIaXN0b3J5SXRlbVZpZXdTdGF0ZSYgdmlld1N0YXRlID0g
aXRlbS0+dmlld1N0YXRlKCk7CisgICAgaWYgKHZpZXdTdGF0ZS5zaG91bGRTYXZlVmlld1N0YXRl
KSB7CisgICAgICAgIHZpZXdTdGF0ZS5vcmllbnRhdGlvbiA9IG1fd2ViUGFnZVByaXZhdGUtPm1h
aW5GcmFtZSgpLT5vcmllbnRhdGlvbigpOworICAgICAgICB2aWV3U3RhdGUuaXNab29tVG9GaXRT
Y2FsZSA9IG1fd2ViUGFnZVByaXZhdGUtPmN1cnJlbnRTY2FsZSgpID09IG1fd2ViUGFnZVByaXZh
dGUtPnpvb21Ub0ZpdFNjYWxlKCk7CisgICAgICAgIHZpZXdTdGF0ZS5zY2FsZSA9IG1fd2ViUGFn
ZVByaXZhdGUtPmN1cnJlbnRTY2FsZSgpOworICAgICAgICB2aWV3U3RhdGUuc2hvdWxkUmVmbG93
QmxvY2sgPSBtX3dlYlBhZ2VQcml2YXRlLT5tX3Nob3VsZFJlZmxvd0Jsb2NrOworICAgIH0KK30K
Kwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OnJlc3RvcmVWaWV3U3RhdGUoKQor
eworICAgIGlmICghaXNNYWluRnJhbWUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgSGlzdG9y
eUl0ZW0qIGN1cnJlbnRJdGVtID0gbV9mcmFtZS0+bG9hZGVyKCktPmhpc3RvcnkoKS0+Y3VycmVu
dEl0ZW0oKTsKKyAgICBBU1NFUlQoY3VycmVudEl0ZW0pOworCisgICAgaWYgKCFjdXJyZW50SXRl
bSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gV2ViUGFnZVByaXZhdGUgaXMgbWVzc2luZyB1
cCBGcmFtZVZpZXc6Ondhc1Njcm9sbGVkQnlVc2VyKCkgYnkgc2VuZGluZworICAgIC8vIHNjcm9s
bCBldmVudHMgdGhhdCBsb29rIGxpa2UgdGhleSB3ZXJlIHVzZXIgZ2VuZXJhdGVkIGFsbCB0aGUg
dGltZS4KKyAgICAvLworICAgIC8vIEV2ZW4gaWYgdGhlIHVzZXIgZGlkIG5vdCBzY3JvbGwsIEZy
YW1lVmlldyBpcyBnb25uYSB0aGluayB0aGV5IGRpZC4KKyAgICAvLyBTbyB3ZSB1c2Ugb3VyIG93
biBib29ra2VlcGluZyBjb2RlIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciB3ZSB3ZXJlCisgICAg
Ly8gYWN0dWFsbHkgc2Nyb2xsZWQgYnkgdGhlIHVzZXIgZHVyaW5nIGxvYWQuCisgICAgLy8KKyAg
ICAvLyBJZiB0aGUgdXNlciBkaWQgc2Nyb2xsIHRob3VnaCwgYWxsIGFyZSBnb2luZyB0byBiZSBp
biBhZ3JlZW1lbnQgYWJvdXQKKyAgICAvLyB0aGF0LCBhbmQgdGhlIHdvcnN0IHRoaW5nIHRoYXQg
Y291bGQgaGFwcGVuIGlzIHRoYXQKKyAgICAvLyBIaXN0b3J5Q29udHJvbGxlcjo6cmVzdG9yZVNj
cm9sbFBvc2l0aW9uQW5kVmlld1N0YXRlIGNhbGxzCisgICAgLy8gc2V0U2Nyb2xsUG9zaXRpb24g
d2l0aCB0aGUgdGhlIHNhbWUgcG9pbnQsIHdoaWNoIGlzIGEgTk9PUC4KKyAgICBJbnRTaXplIGNv
bnRlbnRzU2l6ZSA9IGN1cnJlbnRJdGVtLT5jb250ZW50c1NpemUoKTsKKyAgICBJbnRQb2ludCBz
Y3JvbGxQb3NpdGlvbiA9IGN1cnJlbnRJdGVtLT5zY3JvbGxQb2ludCgpOworICAgIGlmIChtX3dl
YlBhZ2VQcml2YXRlLT5tX3VzZXJQZXJmb3JtZWRNYW51YWxTY3JvbGwpCisgICAgICAgIHNjcm9s
bFBvc2l0aW9uID0gbV93ZWJQYWdlUHJpdmF0ZS0+c2Nyb2xsUG9zaXRpb24oKTsKKworICAgIC8v
IFdlIG5lZWQgdG8gcmVzZXQgdGhpcyB2YXJpYWJsZSBhZnRlciB0aGUgdmlldyBzdGF0ZSBoYXMg
YmVlbiByZXN0b3JlZC4KKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2RpZFJlc3RvcmVGcm9tUGFn
ZUNhY2hlID0gZmFsc2U7CisgICAgSGlzdG9yeUl0ZW1WaWV3U3RhdGUmIHZpZXdTdGF0ZSA9IGN1
cnJlbnRJdGVtLT52aWV3U3RhdGUoKTsKKworICAgIC8vIEFsc28sIHRyeSB0byBrZWVwIHRoZSB1
c2VycyB6b29tIGlmIGFueS4KKyAgICBkb3VibGUgc2NhbGUgPSB2aWV3U3RhdGUuc2NhbGU7Cisg
ICAgYm9vbCBzaG91bGRSZWZsb3dCbG9jayA9IHZpZXdTdGF0ZS5zaG91bGRSZWZsb3dCbG9jazsK
KyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV91c2VyUGVyZm9ybWVkTWFudWFsWm9vbSkgewor
ICAgICAgICBzY2FsZSA9IG1fd2ViUGFnZVByaXZhdGUtPmN1cnJlbnRTY2FsZSgpOworICAgICAg
ICBzaG91bGRSZWZsb3dCbG9jayA9IG1fd2ViUGFnZVByaXZhdGUtPm1fc2hvdWxkUmVmbG93Qmxv
Y2s7CisgICAgfQorCisgICAgYm9vbCBzY3JvbGxDaGFuZ2VkID0gc2Nyb2xsUG9zaXRpb24gIT0g
bV93ZWJQYWdlUHJpdmF0ZS0+c2Nyb2xsUG9zaXRpb24oKTsKKyAgICBib29sIHNjYWxlQ2hhbmdl
ZCA9IHNjYWxlICE9IG1fd2ViUGFnZVByaXZhdGUtPmN1cnJlbnRTY2FsZSgpOworICAgIGJvb2wg
cmVmbG93Q2hhbmdlZCA9IHNob3VsZFJlZmxvd0Jsb2NrICE9IG1fd2ViUGFnZVByaXZhdGUtPm1f
c2hvdWxkUmVmbG93QmxvY2s7CisgICAgYm9vbCBvcmllbnRhdGlvbkNoYW5nZWQgPSB2aWV3U3Rh
dGUub3JpZW50YXRpb24gJSAxODAgIT0gbV93ZWJQYWdlUHJpdmF0ZS0+bWFpbkZyYW1lKCktPm9y
aWVudGF0aW9uKCkgJSAxODA7CisKKyAgICBpZiAoIXNjcm9sbENoYW5nZWQgJiYgIXNjYWxlQ2hh
bmdlZCAmJiAhcmVmbG93Q2hhbmdlZCAmJiAhb3JpZW50YXRpb25DaGFuZ2VkKQorICAgICAgICBy
ZXR1cm47CisKKyAgICAvLyBXaGVuIHJvdGF0ZSBoYXBwZW5zLCBvbmx5IHpvb20gd2hlbiBwcmV2
aW91cyBwYWdlIHdhcyB6b29tVG9GaXRTY2FsZSwgb3RoZXJ3aXNlIGtlZXAgb2xkIHNjYWxlLgor
ICAgIGlmIChvcmllbnRhdGlvbkNoYW5nZWQgJiYgdmlld1N0YXRlLmlzWm9vbVRvRml0U2NhbGUp
CisgICAgICAgIHNjYWxlID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46
OndpZHRoKCkgKiBzY2FsZSAvIHN0YXRpY19jYXN0PGRvdWJsZT4oQmxhY2tCZXJyeTo6UGxhdGZv
cm06OkdyYXBoaWNzOjpTY3JlZW46OmhlaWdodCgpKTsKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5t
X2JhY2tpbmdTdG9yZS0+ZC0+c3VzcGVuZFNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoKTsg
Ly8gZG9uJ3QgZmxhc2ggY2hlY2tlcmJvYXJkIGZvciB0aGUgc2V0U2Nyb2xsUG9zaXRpb24gY2Fs
bAorICAgIG1fZnJhbWUtPnZpZXcoKS0+c2V0Q29udGVudHNTaXplRnJvbUhpc3RvcnkoY29udGVu
dHNTaXplKTsKKworICAgIC8vIEhlcmUgd2UgbmVlZCB0byBzZXQgc2Nyb2xsIHBvc2l0aW9uIHdo
YXQgd2UgYXNrZWQgZm9yLgorICAgIC8vIFNvIHdlIHVzZSBTY3JvbGxWaWV3OjpzZXRDYW5PdmVy
c2Nyb2xsKHRydWUpLgorICAgIGJvb2wgb2xkQ2FuT3ZlcnNjcm9sbCA9IG1fZnJhbWUtPnZpZXco
KS0+Y2FuT3ZlclNjcm9sbCgpOworICAgIG1fZnJhbWUtPnZpZXcoKS0+c2V0Q2FuT3ZlcnNjcm9s
bCh0cnVlKTsKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5zZXRTY3JvbGxQb3NpdGlvbihzY3JvbGxQ
b3NpdGlvbik7CisgICAgbV9mcmFtZS0+dmlldygpLT5zZXRDYW5PdmVyc2Nyb2xsKG9sZENhbk92
ZXJzY3JvbGwpOworCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9zaG91bGRSZWZsb3dCbG9jayA9
IHZpZXdTdGF0ZS5zaG91bGRSZWZsb3dCbG9jazsKKworICAgIC8vIFdpbGwgcmVzdG9yZSB1cGRh
dGVzIHRvIGJhY2tpbmdzdG9yZSBndWFyYW50ZWVkIQorICAgIGlmICghbV93ZWJQYWdlUHJpdmF0
ZS0+em9vbUFib3V0UG9pbnQoc2NhbGUsIG1fZnJhbWUtPnZpZXcoKS0+c2Nyb2xsUG9zaXRpb24o
KSwgdHJ1ZSAvKiBlbmZvcmNlU2NhbGVDbGFtcGluZyAqLywgdHJ1ZSAvKmZvcmNlUmVuZGVyaW5n
Ki8sIHRydWUgLyppc1Jlc3RvcmluZ1pvb21MZXZlbCovKSkgeworICAgICAgICAvLyBJZiB3ZSdy
ZSBhbHJlYWR5IGF0IHRoYXQgc2NhbGUsIHRoZW4gd2Ugc2hvdWxkIHN0aWxsIGZvcmNlIHJlbmRl
cmluZyBzaW5jZQorICAgICAgICAvLyBvdXIgc2Nyb2xsIHBvc2l0aW9uIGNoYW5nZWQuCisgICAg
ICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fYmFja2luZ1N0b3JlLT5kLT5yZW5kZXJWaXNpYmxlQ29u
dGVudHMoKTsKKworICAgICAgICAvLyBXZSBuZWVkIHRvIG5vdGlmeSB0aGUgY2xpZW50IG9mIHRo
ZSBzY3JvbGwgcG9zaXRpb24gYW5kIGNvbnRlbnQgc2l6ZSBjaGFuZ2UocykgYWJvdmUgZXZlbiBp
ZiB3ZSBkaWRuJ3Qgc2NhbGUuCisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm5vdGlmeVRyYW5z
Zm9ybWVkQ29udGVudHNTaXplQ2hhbmdlZCgpOworICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5u
b3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQoKTsKKyAgICB9Cit9CisKK1BvbGljeUFjdGlv
biBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRlY2lkZVBvbGljeUZvckV4dGVybmFsTG9h
ZChjb25zdCBSZXNvdXJjZVJlcXVlc3QmIHJlcXVlc3QsIGJvb2wgaXNGcmFnbWVudFNjcm9sbCkK
K3sKKyAgICBjb25zdCBLVVJMJiB1cmwgPSByZXF1ZXN0LnVybCgpOworICAgIFN0cmluZyBwYXR0
ZXJuID0gbV93ZWJQYWdlUHJpdmF0ZS0+ZmluZFBhdHRlcm5TdHJpbmdGb3JVcmwodXJsKTsKKyAg
ICBpZiAoIXBhdHRlcm4uaXNFbXB0eSgpKSB7CisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1f
Y2xpZW50LT5oYW5kbGVTdHJpbmdQYXR0ZXJuKHBhdHRlcm4uY2hhcmFjdGVycygpLCBwYXR0ZXJu
Lmxlbmd0aCgpKTsKKyAgICAgICAgcmV0dXJuIFBvbGljeUlnbm9yZTsKKyAgICB9CisKKyAgICBp
ZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV93ZWJTZXR0aW5ncy0+YXJlTGlua3NIYW5kbGVkRXh0ZXJu
YWxseSgpCisgICAgICAgICAgICAmJiBpc01haW5GcmFtZSgpCisgICAgICAgICAgICAmJiAhcmVx
dWVzdC5tdXN0SGFuZGxlSW50ZXJuYWxseSgpCisgICAgICAgICAgICAmJiAhaXNGcmFnbWVudFNj
cm9sbCkgeworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3QgcGxh
dGZvcm1SZXF1ZXN0OworICAgICAgICByZXF1ZXN0LmluaXRpYWxpemVQbGF0Zm9ybVJlcXVlc3Qo
cGxhdGZvcm1SZXF1ZXN0KTsKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPmhh
bmRsZUV4dGVybmFsTGluayhwbGF0Zm9ybVJlcXVlc3QsIHJlcXVlc3QuYW5jaG9yVGV4dCgpLmNo
YXJhY3RlcnMoKSwgcmVxdWVzdC5hbmNob3JUZXh0KCkubGVuZ3RoKCksIG1fY2xpZW50UmVkaXJl
Y3RJc1BlbmRpbmcpOworICAgICAgICByZXR1cm4gUG9saWN5SWdub3JlOworICAgIH0KKworICAg
IHJldHVybiBQb2xpY3lVc2U7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5
Ojp3aWxsRGVmZXJMb2FkaW5nKCkKK3sKKyAgICBtX2RlZmVycmVkSm9ic1RpbWVyLT5zdG9wKCk7
CisKKyAgICBpZiAoIWlzTWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fd2Vi
UGFnZVByaXZhdGUtPndpbGxEZWZlckxvYWRpbmcoKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNs
aWVudEJsYWNrQmVycnk6OmRpZFJlc3VtZUxvYWRpbmcoKQoreworICAgIGlmICghbV9kZWZlcnJl
ZE1hbnVhbFNjcmlwdC5pc051bGwoKSkKKyAgICAgICAgbV9kZWZlcnJlZEpvYnNUaW1lci0+c3Rh
cnRPbmVTaG90KDApOworCisgICAgaWYgKCFpc01haW5GcmFtZSgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5kaWRSZXN1bWVMb2FkaW5nKCk7Cit9CisKK3ZvaWQg
RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpzZXREZWZlcnJlZE1hbnVhbFNjcmlwdChjb25z
dCBLVVJMJiBzY3JpcHQpCit7CisgICAgQVNTRVJUKCFtX2RlZmVycmVkSm9ic1RpbWVyLT5pc0Fj
dGl2ZSgpKTsKKyAgICBtX2RlZmVycmVkTWFudWFsU2NyaXB0ID0gc2NyaXB0OworfQorCit2b2lk
IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGVmZXJyZWRKb2JzVGltZXJGaXJlZChUaW1l
cjxGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk+KikKK3sKKyAgICBBU1NFUlQoIW1fZnJhbWUt
PnBhZ2UoKS0+ZGVmZXJzTG9hZGluZygpKTsKKworICAgIGlmICghbV9kZWZlcnJlZE1hbnVhbFNj
cmlwdC5pc051bGwoKSkgeworICAgICAgICAvLyBFeGVjdXRpbmcgdGhlIHNjcmlwdCB3aWxsIHNl
dCBkZWZlcnJlZCBsb2FkaW5nLCB3aGljaCBjb3VsZCB0cmlnZ2VyIHRoaXMgdGltZXIgYWdhaW4g
aWYgYSBzY3JpcHQgaXMgc2V0LiBTbyBjbGVhciB0aGUgc2NyaXB0IGZpcnN0LgorICAgICAgICBL
VVJMIHNjcmlwdCA9IG1fZGVmZXJyZWRNYW51YWxTY3JpcHQ7CisgICAgICAgIG1fZGVmZXJyZWRN
YW51YWxTY3JpcHQgPSBLVVJMKCk7CisKKyAgICAgICAgbV9mcmFtZS0+c2NyaXB0KCktPmV4ZWN1
dGVJZkphdmFTY3JpcHRVUkwoc2NyaXB0KTsKKyAgICB9CisKKyAgICBBU1NFUlQoIW1fZnJhbWUt
PnBhZ2UoKS0+ZGVmZXJzTG9hZGluZygpKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJs
YWNrQmVycnk6OnJlYWR5VG9SZW5kZXIoYm9vbCBwYWdlSXNWaXN1YWxseU5vbkVtcHR5KQorewor
ICAgIC8vIE9ubHkgc2VuZCB0aGUgbm90aWZpY2F0aW9uIG9uY2UuCisgICAgaWYgKCFtX3NlbnRS
ZWFkeVRvUmVuZGVyKSB7CisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5ub3Rp
ZnlMb2FkUmVhZHlUb1JlbmRlcihwYWdlSXNWaXN1YWxseU5vbkVtcHR5KTsKKyAgICAgICAgbV9z
ZW50UmVhZHlUb1JlbmRlciA9IHRydWU7CisgICAgfQorfQorCitQYXNzUmVmUHRyPEZyYW1lTmV0
d29ya2luZ0NvbnRleHQ+IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y3JlYXRlTmV0d29y
a2luZ0NvbnRleHQoKQoreworICAgIHJldHVybiBGcmFtZU5ldHdvcmtpbmdDb250ZXh0QmxhY2tC
ZXJyeTo6Y3JlYXRlKG1fZnJhbWUpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tC
ZXJyeTo6YXV0aGVudGljYXRpb25DaGFsbGVuZ2UoY29uc3QgU3RyaW5nJiByZWFsbSwgU3RyaW5n
JiB1c2VybmFtZSwgU3RyaW5nJiBwYXNzd29yZCkKK3sKKyAgICBXZWJTdHJpbmcgd2ViUGFnZVVz
ZXJuYW1lOworICAgIFdlYlN0cmluZyB3ZWJQYWdlUGFzc3dvcmQ7CisKKyAgICBtX3dlYlBhZ2VQ
cml2YXRlLT5tX2NsaWVudC0+YXV0aGVudGljYXRpb25DaGFsbGVuZ2UocmVhbG0uY2hhcmFjdGVy
cygpLCByZWFsbS5sZW5ndGgoKSwgd2ViUGFnZVVzZXJuYW1lLCB3ZWJQYWdlUGFzc3dvcmQpOwor
CisgICAgdXNlcm5hbWUgPSB3ZWJQYWdlVXNlcm5hbWU7CisgICAgcGFzc3dvcmQgPSB3ZWJQYWdl
UGFzc3dvcmQ7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpzdGFydERv
d25sb2FkKGNvbnN0IFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCwgY29uc3QgU3RyaW5nJiAvKnN1
Z2dlc3RlZE5hbWUqLykKK3sKKyAgICAvLyBGSVhNRTogdXNlIHRoZSBzdWdnZXN0ZWROYW1lPwor
ICAgIG1fd2ViUGFnZVByaXZhdGUtPmxvYWQocmVxdWVzdC51cmwoKS5zdHJpbmcoKS51dGY4KCku
ZGF0YSgpLCAwLCAiR0VUIiwgQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpV
c2VQcm90b2NvbENhY2hlUG9saWN5LCAwLCAwLCAwLCAwLCBmYWxzZSwgZmFsc2UsIHRydWUsICIi
KTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRvd25sb2FkKFJlc291
cmNlSGFuZGxlKiBoYW5kbGUsIGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIGNvbnN0IFJlc291cmNl
UmVxdWVzdCYsIGNvbnN0IFJlc291cmNlUmVzcG9uc2UmIHIpCit7CisgICAgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkZpbHRlclN0cmVhbSogc3RyZWFtID0gTmV0d29ya01hbmFnZXI6Omluc3RhbmNl
KCktPnN0cmVhbUZvckhhbmRsZShoYW5kbGUpOworICAgIEFTU0VSVChzdHJlYW0pOworCisgICAg
bV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPmRvd25sb2FkUmVxdWVzdGVkKHN0cmVhbSwgci5z
dWdnZXN0ZWRGaWxlbmFtZSgpKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVy
cnk6OmRpc3BhdGNoRGlkUmVjZWl2ZUljb24oKQoreworICAgIFN0cmluZyB1cmwgPSBtX2ZyYW1l
LT5kb2N1bWVudCgpLT51cmwoKS5zdHJpbmcoKTsKKyAgICBJbWFnZSogaW1nID0gaWNvbkRhdGFi
YXNlKCkuc3luY2hyb25vdXNJY29uRm9yUGFnZVVSTCh1cmwsIEludFNpemUoMTAsIDEwKSk7Cisg
ICAgaWYgKCFpbWcgfHwgIWltZy0+ZGF0YSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBOYXRp
dmVJbWFnZVNraWEqIGJpdG1hcCA9IGltZy0+bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsK
KyAgICBpZiAoIWJpdG1hcCkKKyAgICAgICAgcmV0dXJuOworICAgIGJpdG1hcC0+bG9ja1BpeGVs
cygpOworICAgIFN0cmluZyBpY29uVXJsID0gaWNvbkRhdGFiYXNlKCkuc3luY2hyb25vdXNJY29u
VVJMRm9yUGFnZVVSTCh1cmwpOworICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5zZXRG
YXZpY29uKGltZy0+d2lkdGgoKSwgaW1nLT5oZWlnaHQoKSwgKHVuc2lnbmVkIGNoYXIqKWJpdG1h
cC0+Z2V0UGl4ZWxzKCksIGljb25VcmwudXRmOCgpLmRhdGEoKSk7CisgICAgYml0bWFwLT51bmxv
Y2tQaXhlbHMoKTsKK30KKworYm9vbCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmNhbkNh
Y2hlUGFnZSgpIGNvbnN0Cit7CisgICAgLy8gV2Ugd29uJ3QgY2FjaGUgcGFnZXMgY29udGFpbmlu
ZyB2aWRlbyBvciBhdWRpby4KKyAgICBBU1NFUlQobV9mcmFtZS0+ZG9jdW1lbnQoKSk7CisgICAg
UmVmUHRyPE5vZGVMaXN0PiBub2RlTGlzdCA9IG1fZnJhbWUtPmRvY3VtZW50KCktPmdldEVsZW1l
bnRzQnlUYWdOYW1lKEhUTUxOYW1lczo6dmlkZW9UYWcubG9jYWxOYW1lKCkpOworICAgIGlmIChu
b2RlTGlzdC5nZXQoKS0+bGVuZ3RoKCkgPiAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
bm9kZUxpc3QgPSBtX2ZyYW1lLT5kb2N1bWVudCgpLT5nZXRFbGVtZW50c0J5VGFnTmFtZShIVE1M
TmFtZXM6OmF1ZGlvVGFnLmxvY2FsTmFtZSgpKTsKKyAgICBpZiAobm9kZUxpc3QuZ2V0KCktPmxl
bmd0aCgpID4gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVGhlIG11bHRpcGFy
dCBvZiAibXVsdGlwYXJ0L3gtbWl4ZWQtcmVwbGFjZSIgb25seSBzdXBwb3J0cyBpbWFnZSwgY29y
cmVjdD8KKyAgICAvLyBGSVhNRTogRG8gd2UgaGF2ZSBhIGJldHRlciBwbGFjZSB0byBoYW5kbGUg
dGhpcyBjYXNlPworICAgIG5vZGVMaXN0ID0gbV9mcmFtZS0+ZG9jdW1lbnQoKS0+Z2V0RWxlbWVu
dHNCeVRhZ05hbWUoSFRNTE5hbWVzOjppbWdUYWcubG9jYWxOYW1lKCkpOworICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBub2RlTGlzdC5nZXQoKS0+bGVuZ3RoKCk7ICsraSkgeworICAgICAg
ICBIVE1MSW1hZ2VFbGVtZW50KiBub2RlID0gc3RhdGljX2Nhc3Q8SFRNTEltYWdlRWxlbWVudCo+
KG5vZGVMaXN0LmdldCgpLT5pdGVtKGkpKTsKKyAgICAgICAgQ2FjaGVkSW1hZ2UqIGNhY2hlZGlt
YWdlID0gbm9kZSA/IG5vZGUtPmNhY2hlZEltYWdlKCkgOiAwOworICAgICAgICBpZiAoY2FjaGVk
aW1hZ2UgJiYgY2FjaGVkaW1hZ2UtPnJlc3BvbnNlKCkuaXNNdWx0aXBhcnRQYXlsb2FkKCkpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2
b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6cHJvdmlzaW9uYWxMb2FkU3RhcnRlZCgp
Cit7CisgICAgLy8gV2Ugd291bGQgbGlrZSB0byBoaWRlIHRoZSB2aXJ0dWFsIGtleWJvYXJkIGJl
Zm9yZSBpdCBuYXZpZ2F0ZXMgdG8gYW5vdGhlciBwYWdlCisgICAgLy8gc28gdGhhdCB0aGUgc2Ny
b2xsIG9mZnNldCB3aXRob3V0IGtleWJvYXJkIHNob3duIHdpbGwgYmUgc2F2ZWQgaW4gdGhlIGhp
c3RvcnkgaXRlbS4KKyAgICAvLyBUaGVuIHdoZW4gdGhlIHVzZXIgbmF2aWdhdGVzIGJhY2ssIGl0
IHdpbGwgc2Nyb2xsIHRvIHRoZSByaWdodCBwb3NpdGlvbi4KKyAgICBpZiAoaXNNYWluRnJhbWUo
KSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+c2hvd1ZpcnR1YWxLZXlib2FyZChmYWxzZSk7
Cit9CisKKy8vIFdlIGRvbid0IG5lZWQgdG8gcHJvdmlkZSB0aGUgZXJyb3IgbWVzc2FnZSBzdHJp
bmcsIHRoYXQgd2lsbCBiZSBoYW5kbGVkIGluIEJyb3dzZXJFcnJvclBhZ2UgYWNjb3JkaW5nIHRv
IHRoZSBlcnJvciBjb2RlLgorUmVzb3VyY2VFcnJvciBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVy
cnk6OmNhbm5vdFNob3dVUkxFcnJvcihjb25zdCBSZXNvdXJjZVJlcXVlc3QmIHJlcXVlc3QpCit7
CisgICAgLy8gRklYTUU6IFdoeSBhcmUgd2Ugbm90IHBhc3NpbmcgdGhlIGRvbWFpbiB0byB0aGUg
UmVzb3VyY2VFcnJvcj8gU2VlIFBSICMxMTk3ODkuCisgICAgcmV0dXJuIFJlc291cmNlRXJyb3Io
U3RyaW5nKCksIFdlYktpdEVycm9yQ2Fubm90U2hvd1VSTCwgcmVxdWVzdC51cmwoKS5zdHJpbmco
KSwgU3RyaW5nKCkpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlk
UmVzdG9yZUZyb21QYWdlQ2FjaGUoKQoreworICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fZGlkUmVz
dG9yZUZyb21QYWdlQ2FjaGUgPSB0cnVlOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50Qmxh
Y2tCZXJyeTo6ZGlzcGF0Y2hXaWxsVXBkYXRlQXBwbGljYXRpb25DYWNoZShjb25zdCBSZXNvdXJj
ZVJlcXVlc3QmKQoreworICAgIEFTU0VSVChpc01haW5GcmFtZSgpKTsKKyAgICBpZiAoIWlzTWFp
bkZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xp
ZW50LT5ub3RpZnlXaWxsVXBkYXRlQXBwbGljYXRpb25DYWNoZSgpOworfQorCit2b2lkIEZyYW1l
TG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRMb2FkRnJvbUFwcGxpY2F0aW9uQ2Fj
aGUoY29uc3QgUmVzb3VyY2VSZXF1ZXN0JikKK3sKKyAgICBBU1NFUlQoaXNNYWluRnJhbWUoKSk7
CisgICAgaWYgKCFpc01haW5GcmFtZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3dlYlBh
Z2VQcml2YXRlLT5tX2NsaWVudC0+bm90aWZ5RGlkTG9hZEZyb21BcHBsaWNhdGlvbkNhY2hlKCk7
Cit9CisKK30gLy8gV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5
L1dlYkNvcmVTdXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeS5oIGIvU291cmNlL1dl
YktpdC9ibGFja2JlcnJ5L1dlYkNvcmVTdXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJy
eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjZlYzZmZWUzOTA3MzczNjNjNGI1Mzc4Njk0YzY5MTA2NmNhNWNkMTEK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViQ29yZVN1cHBv
cnQvRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5LmgKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9u
IExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
CisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo
b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExl
c3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0
byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lm
bmRlZiBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnlfaAorI2RlZmluZSBGcmFtZUxvYWRlckNs
aWVudEJsYWNrQmVycnlfaAorCisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRl
ICJGb3JtU3RhdGUuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkZyYW1lTG9hZGVy
Q2xpZW50LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJXaWRnZXQu
aCIKKworbmFtZXNwYWNlIEJsYWNrQmVycnkgeworbmFtZXNwYWNlIFdlYktpdCB7CitjbGFzcyBX
ZWJQYWdlUHJpdmF0ZTsKK30KK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBGcmFt
ZU5ldHdvcmtpbmdDb250ZXh0OworY2xhc3MgR2VvbG9jYXRpb247CitjbGFzcyBIVE1MRm9ybUVs
ZW1lbnQ7CisKK2NsYXNzIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeSA6IHB1YmxpYyBGcmFt
ZUxvYWRlckNsaWVudCB7CitwdWJsaWM6CisgICAgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5
KCk7CisgICAgfkZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeSgpOworCisgICAgdm9pZCBzZXRG
cmFtZShGcmFtZSogZnJhbWUsIEJsYWNrQmVycnk6OldlYktpdDo6V2ViUGFnZVByaXZhdGUqIHdl
YlBhZ2VQcml2YXRlKSB7IG1fZnJhbWUgPSBmcmFtZTsgbV93ZWJQYWdlUHJpdmF0ZSA9IHdlYlBh
Z2VQcml2YXRlOyB9CisKKyAgICBpbnQgcGxheWVySWQoKSBjb25zdDsKKyAgICBib29sIGNvb2tp
ZXNFbmFibGVkKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgZnJhbWVMb2FkZXJEZXN0cm95
ZWQoKTsKKyAgICB2aXJ0dWFsIGJvb2wgaGFzV2ViVmlldygpIGNvbnN0IHsgcmV0dXJuIHRydWU7
IH0KKyAgICB2aXJ0dWFsIHZvaWQgbWFrZVJlcHJlc2VudGF0aW9uKERvY3VtZW50TG9hZGVyKikg
eyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGZvcmNlTGF5b3V0KCkgeyBu
b3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGZvcmNlTGF5b3V0Rm9yTm9uSFRN
TCgpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRDb3BpZXNPblNj
cm9sbCgpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBkZXRhY2hlZEZy
b21QYXJlbnQyKCk7CisgICAgdmlydHVhbCB2b2lkIGRldGFjaGVkRnJvbVBhcmVudDMoKSB7IG5v
dEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgYXNzaWduSWRlbnRpZmllclRvSW5p
dGlhbFJlcXVlc3QobG9uZyB1bnNpZ25lZCBpbnQsIERvY3VtZW50TG9hZGVyKiwgY29uc3QgUmVz
b3VyY2VSZXF1ZXN0JikgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGRp
c3BhdGNoV2lsbFNlbmRSZXF1ZXN0KERvY3VtZW50TG9hZGVyKiwgbG9uZyB1bnNpZ25lZCBpbnQs
IFJlc291cmNlUmVxdWVzdCYsIGNvbnN0IFJlc291cmNlUmVzcG9uc2UmKTsKKyAgICB2aXJ0dWFs
IGJvb2wgc2hvdWxkVXNlQ3JlZGVudGlhbFN0b3JhZ2UoRG9jdW1lbnRMb2FkZXIqLCBsb25nIHVu
c2lnbmVkIGludCkgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0
dWFsIHZvaWQgZGlzcGF0Y2hEaWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2UoRG9jdW1l
bnRMb2FkZXIqLCBsb25nIHVuc2lnbmVkIGludCwgY29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVu
Z2UmKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRD
YW5jZWxBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShEb2N1bWVudExvYWRlciosIGxvbmcgdW5zaWdu
ZWQgaW50LCBjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpIHsgbm90SW1wbGVtZW50ZWQo
KTsgfQorICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZFJlY2VpdmVSZXNwb25zZShEb2N1bWVu
dExvYWRlciosIGxvbmcgdW5zaWduZWQgaW50LCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJik7Cisg
ICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkUmVjZWl2ZUNvbnRlbnRMZW5ndGgoRG9jdW1lbnRM
b2FkZXIqLCBsb25nIHVuc2lnbmVkIGludCwgaW50KSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAg
ICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRGaW5pc2hMb2FkaW5nKERvY3VtZW50TG9hZGVyKiwg
bG9uZyB1bnNpZ25lZCBpbnQpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9p
ZCBkaXNwYXRjaERpZEZhaWxMb2FkaW5nKERvY3VtZW50TG9hZGVyKiwgbG9uZyB1bnNpZ25lZCBp
bnQsIGNvbnN0IFJlc291cmNlRXJyb3ImKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0
dWFsIGJvb2wgZGlzcGF0Y2hEaWRMb2FkUmVzb3VyY2VGcm9tTWVtb3J5Q2FjaGUoRG9jdW1lbnRM
b2FkZXIqLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmLCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiwg
aW50KSB7IG5vdEltcGxlbWVudGVkKCk7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgdm9p
ZCBkaXNwYXRjaERpZEhhbmRsZU9ubG9hZEV2ZW50cygpOworICAgIHZpcnR1YWwgdm9pZCBkaXNw
YXRjaERpZFJlY2VpdmVTZXJ2ZXJSZWRpcmVjdEZvclByb3Zpc2lvbmFsTG9hZCgpIHsgbm90SW1w
bGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZENhbmNlbENsaWVudFJl
ZGlyZWN0KCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoV2lsbFBlcmZvcm1DbGllbnRSZWRp
cmVjdChjb25zdCBLVVJMJiwgZG91YmxlLCBkb3VibGUpOworICAgIHZpcnR1YWwgdm9pZCBkaXNw
YXRjaERpZENoYW5nZUxvY2F0aW9uV2l0aGluUGFnZSgpOworICAgIHZpcnR1YWwgdm9pZCBkaXNw
YXRjaERpZFB1c2hTdGF0ZVdpdGhpblBhZ2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hE
aWRSZXBsYWNlU3RhdGVXaXRoaW5QYWdlKCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlk
UG9wU3RhdGVXaXRoaW5QYWdlKCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoV2lsbENsb3Nl
KCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkUmVjZWl2ZUljb24oKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZGlzcGF0Y2hEaWRTdGFydFByb3Zpc2lvbmFsTG9hZCgpOworICAgIHZpcnR1YWwg
dm9pZCBkaXNwYXRjaERpZFJlY2VpdmVUaXRsZShjb25zdCBTdHJpbmdXaXRoRGlyZWN0aW9uJik7
CisgICAgdmlydHVhbCB2b2lkIHNldFRpdGxlKGNvbnN0IFN0cmluZ1dpdGhEaXJlY3Rpb24mIHRp
dGxlLCBjb25zdCBLVVJMJik7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkQ29tbWl0TG9h
ZCgpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZEZhaWxQcm92aXNpb25hbExvYWQoY29u
c3QgUmVzb3VyY2VFcnJvciYpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZEZhaWxMb2Fk
KGNvbnN0IFJlc291cmNlRXJyb3ImKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRGaW5p
c2hEb2N1bWVudExvYWQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRGaW5pc2hMb2Fk
KCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkRmlyc3RMYXlvdXQoKSB7IG5vdEltcGxl
bWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRGaXJzdFZpc3VhbGx5Tm9u
RW1wdHlMYXlvdXQoKTsKKyAgICB2aXJ0dWFsIEZyYW1lKiBkaXNwYXRjaENyZWF0ZVBhZ2UoY29u
c3QgTmF2aWdhdGlvbkFjdGlvbiYpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaFNob3coKSB7
IG5vdEltcGxlbWVudGVkKCk7IH0KKworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERlY2lkZVBv
bGljeUZvclJlc3BvbnNlKEZyYW1lUG9saWN5RnVuY3Rpb24sIGNvbnN0IFJlc291cmNlUmVzcG9u
c2UmLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hE
ZWNpZGVQb2xpY3lGb3JOZXdXaW5kb3dBY3Rpb24oRnJhbWVQb2xpY3lGdW5jdGlvbiwgY29uc3Qg
TmF2aWdhdGlvbkFjdGlvbiYsIGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIFBhc3NSZWZQdHI8Rm9y
bVN0YXRlPiwgY29uc3QgU3RyaW5nJiBmcmFtZU5hbWUpOworICAgIHZpcnR1YWwgdm9pZCBkaXNw
YXRjaERlY2lkZVBvbGljeUZvck5hdmlnYXRpb25BY3Rpb24oRnJhbWVQb2xpY3lGdW5jdGlvbiwg
Y29uc3QgTmF2aWdhdGlvbkFjdGlvbiYsIGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIFBhc3NSZWZQ
dHI8Rm9ybVN0YXRlPik7CisgICAgdmlydHVhbCB2b2lkIGNhbmNlbFBvbGljeUNoZWNrKCk7Cisg
ICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoVW5hYmxlVG9JbXBsZW1lbnRQb2xpY3koY29uc3QgUmVz
b3VyY2VFcnJvciYpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBkaXNw
YXRjaFdpbGxTdWJtaXRGb3JtKEZyYW1lUG9saWN5RnVuY3Rpb24sIFBhc3NSZWZQdHI8Rm9ybVN0
YXRlPik7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkTG9hZE1haW5SZXNvdXJjZShEb2N1
bWVudExvYWRlciopIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCByZXZl
cnRUb1Byb3Zpc2lvbmFsU3RhdGUoRG9jdW1lbnRMb2FkZXIqKSB7IG5vdEltcGxlbWVudGVkKCk7
IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0TWFpbkRvY3VtZW50RXJyb3IoRG9jdW1lbnRMb2FkZXIq
LCBjb25zdCBSZXNvdXJjZUVycm9yJik7CisgICAgdmlydHVhbCB2b2lkIHBvc3RQcm9ncmVzc1N0
YXJ0ZWROb3RpZmljYXRpb24oKTsKKyAgICB2aXJ0dWFsIHZvaWQgcG9zdFByb2dyZXNzRXN0aW1h
dGVDaGFuZ2VkTm90aWZpY2F0aW9uKCk7CisgICAgdmlydHVhbCB2b2lkIHBvc3RQcm9ncmVzc0Zp
bmlzaGVkTm90aWZpY2F0aW9uKCk7CisgICAgdmlydHVhbCB2b2lkIHNldE1haW5GcmFtZURvY3Vt
ZW50UmVhZHkoYm9vbCkgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIHN0
YXJ0RG93bmxvYWQoY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiwgY29uc3QgU3RyaW5nJiBzdWdnZXN0
ZWROYW1lID0gU3RyaW5nKCkpOworICAgIHZpcnR1YWwgdm9pZCB3aWxsQ2hhbmdlVGl0bGUoRG9j
dW1lbnRMb2FkZXIqKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlk
Q2hhbmdlVGl0bGUoRG9jdW1lbnRMb2FkZXIqKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2
aXJ0dWFsIHZvaWQgY29tbWl0dGVkTG9hZChEb2N1bWVudExvYWRlciosIGNvbnN0IGNoYXIqLCBp
bnQpOworICAgIHZpcnR1YWwgdm9pZCBmaW5pc2hlZExvYWRpbmcoRG9jdW1lbnRMb2FkZXIqKTsK
KyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlR2xvYmFsSGlzdG9yeSgpIHsgbm90SW1wbGVtZW50ZWQo
KTsgfQorICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVHbG9iYWxIaXN0b3J5UmVkaXJlY3RMaW5rcygp
IHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgYm9vbCBzaG91bGRHb1RvSGlzdG9y
eUl0ZW0oSGlzdG9yeUl0ZW0qKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkU3RvcExv
YWRpbmdGb3JIaXN0b3J5SXRlbShIaXN0b3J5SXRlbSopIGNvbnN0OworICAgIHZpcnR1YWwgdm9p
ZCBkaXNwYXRjaERpZEFkZEJhY2tGb3J3YXJkSXRlbShIaXN0b3J5SXRlbSopIGNvbnN0OworICAg
IHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZFJlbW92ZUJhY2tGb3J3YXJkSXRlbShIaXN0b3J5SXRl
bSopIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZENoYW5nZUJhY2tGb3J3YXJk
SW5kZXgoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hXaWxsVXBkYXRlQXBwbGlj
YXRpb25DYWNoZShjb25zdCBSZXNvdXJjZVJlcXVlc3QmKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlz
cGF0Y2hEaWRMb2FkRnJvbUFwcGxpY2F0aW9uQ2FjaGUoY29uc3QgUmVzb3VyY2VSZXF1ZXN0Jik7
CisgICAgdmlydHVhbCB2b2lkIGRpZERpc3BsYXlJbnNlY3VyZUNvbnRlbnQoKSB7IG5vdEltcGxl
bWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlkUnVuSW5zZWN1cmVDb250ZW50KFNlY3Vy
aXR5T3JpZ2luKiwgY29uc3QgS1VSTCYpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1
YWwgUmVzb3VyY2VFcnJvciBpbnRlcnJ1cHRlZEZvclBvbGljeUNoYW5nZUVycm9yKGNvbnN0IFJl
c291cmNlUmVxdWVzdCYpIHsgbm90SW1wbGVtZW50ZWQoKTsgcmV0dXJuIFJlc291cmNlRXJyb3Io
ZW1wdHlTdHJpbmcoKSwgMCwgZW1wdHlTdHJpbmcoKSwgZW1wdHlTdHJpbmcoKSk7IH0KKyAgICB2
aXJ0dWFsIFJlc291cmNlRXJyb3IgY2FuY2VsbGVkRXJyb3IoY29uc3QgUmVzb3VyY2VSZXF1ZXN0
JikgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gUmVzb3VyY2VFcnJvcihlbXB0eVN0cmluZygp
LCAwLCBlbXB0eVN0cmluZygpLCBlbXB0eVN0cmluZygpKTsgfQorICAgIHZpcnR1YWwgUmVzb3Vy
Y2VFcnJvciBibG9ja2VkRXJyb3IoY29uc3QgUmVzb3VyY2VSZXF1ZXN0JikgeyBub3RJbXBsZW1l
bnRlZCgpOyByZXR1cm4gUmVzb3VyY2VFcnJvcihlbXB0eVN0cmluZygpLCAwLCBlbXB0eVN0cmlu
ZygpLCBlbXB0eVN0cmluZygpKTsgfQorICAgIHZpcnR1YWwgUmVzb3VyY2VFcnJvciBjYW5ub3RT
aG93VVJMRXJyb3IoY29uc3QgUmVzb3VyY2VSZXF1ZXN0Jik7CisgICAgdmlydHVhbCBSZXNvdXJj
ZUVycm9yIGludGVycnVwdEZvclBvbGljeUNoYW5nZUVycm9yKGNvbnN0IFJlc291cmNlUmVxdWVz
dCYpIHsgbm90SW1wbGVtZW50ZWQoKTsgcmV0dXJuIFJlc291cmNlRXJyb3IoZW1wdHlTdHJpbmco
KSwgMCwgZW1wdHlTdHJpbmcoKSwgZW1wdHlTdHJpbmcoKSk7IH0KKyAgICB2aXJ0dWFsIFJlc291
cmNlRXJyb3IgY2Fubm90U2hvd01JTUVUeXBlRXJyb3IoY29uc3QgUmVzb3VyY2VSZXNwb25zZSYp
IHsgbm90SW1wbGVtZW50ZWQoKTsgcmV0dXJuIFJlc291cmNlRXJyb3IoZW1wdHlTdHJpbmcoKSwg
MCwgZW1wdHlTdHJpbmcoKSwgZW1wdHlTdHJpbmcoKSk7IH0KKyAgICB2aXJ0dWFsIFJlc291cmNl
RXJyb3IgZmlsZURvZXNOb3RFeGlzdEVycm9yKGNvbnN0IFJlc291cmNlUmVzcG9uc2UmKSB7IG5v
dEltcGxlbWVudGVkKCk7IHJldHVybiBSZXNvdXJjZUVycm9yKGVtcHR5U3RyaW5nKCksIDAsIGVt
cHR5U3RyaW5nKCksIGVtcHR5U3RyaW5nKCkpOyB9CisgICAgdmlydHVhbCBSZXNvdXJjZUVycm9y
IHBsdWdpbldpbGxIYW5kbGVMb2FkRXJyb3IoY29uc3QgUmVzb3VyY2VSZXNwb25zZSYpIHsgbm90
SW1wbGVtZW50ZWQoKTsgcmV0dXJuIFJlc291cmNlRXJyb3IoZW1wdHlTdHJpbmcoKSwgMCwgZW1w
dHlTdHJpbmcoKSwgZW1wdHlTdHJpbmcoKSk7IH0KKyAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRmFs
bEJhY2soY29uc3QgUmVzb3VyY2VFcnJvciYpIHsgbm90SW1wbGVtZW50ZWQoKTsgcmV0dXJuIGZh
bHNlOyB9CisgICAgdmlydHVhbCBib29sIGNhbkhhbmRsZVJlcXVlc3QoY29uc3QgUmVzb3VyY2VS
ZXF1ZXN0JikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGNhblNob3dNSU1FVHlwZShjb25zdCBT
dHJpbmcmKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgY2FuU2hvd01JTUVUeXBlQXNIVE1MKGNv
bnN0IFN0cmluZyYpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCByZXByZXNlbnRhdGlvbkV4aXN0
c0ZvclVSTFNjaGVtZShjb25zdCBTdHJpbmcmKSBjb25zdCB7IG5vdEltcGxlbWVudGVkKCk7IHJl
dHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgU3RyaW5nIGdlbmVyYXRlZE1JTUVUeXBlRm9yVVJM
U2NoZW1lKGNvbnN0IFN0cmluZyYpIGNvbnN0IHsgbm90SW1wbGVtZW50ZWQoKTsgcmV0dXJuIFN0
cmluZygpOyB9CisgICAgdmlydHVhbCB2b2lkIGZyYW1lTG9hZENvbXBsZXRlZCgpIHsgbm90SW1w
bGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBzYXZlVmlld1N0YXRlVG9JdGVtKEhpc3Rv
cnlJdGVtKik7CisgICAgdmlydHVhbCB2b2lkIHJlc3RvcmVWaWV3U3RhdGUoKTsKKyAgICB2aXJ0
dWFsIHZvaWQgcHJvdmlzaW9uYWxMb2FkU3RhcnRlZCgpOworICAgIHZpcnR1YWwgdm9pZCBkaWRG
aW5pc2hMb2FkKCkgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIHByZXBh
cmVGb3JEYXRhU291cmNlUmVwbGFjZW1lbnQoKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2
aXJ0dWFsIFBhc3NSZWZQdHI8RG9jdW1lbnRMb2FkZXI+IGNyZWF0ZURvY3VtZW50TG9hZGVyKGNv
bnN0IFJlc291cmNlUmVxdWVzdCYsIGNvbnN0IFN1YnN0aXR1dGVEYXRhJik7CisgICAgdmlydHVh
bCB2b2lkIHNldFRpdGxlKGNvbnN0IFN0cmluZyYsIGNvbnN0IEtVUkwmKSB7IG5vdEltcGxlbWVu
dGVkKCk7IH0KKyAgICB2aXJ0dWFsIFN0cmluZyB1c2VyQWdlbnQoY29uc3QgS1VSTCYpOworICAg
IHZpcnR1YWwgdm9pZCBzYXZlUGxhdGZvcm1EYXRhVG9DYWNoZWRGcmFtZShDYWNoZWRGcmFtZSop
IHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCB0cmFuc2l0aW9uVG9Db21t
aXR0ZWRGcm9tQ2FjaGVkRnJhbWUoQ2FjaGVkRnJhbWUqKSB7IG5vdEltcGxlbWVudGVkKCk7IH0K
KyAgICB2aXJ0dWFsIHZvaWQgdHJhbnNpdGlvblRvQ29tbWl0dGVkRm9yTmV3UGFnZSgpOworICAg
IHZpcnR1YWwgYm9vbCBjYW5DYWNoZVBhZ2UoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlk
U2F2ZVRvUGFnZUNhY2hlKCkgeyB9CisgICAgdmlydHVhbCB2b2lkIGRpZFJlc3RvcmVGcm9tUGFn
ZUNhY2hlKCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkQmVjb21lRnJhbWVzZXQoYm9v
bCkgeyB9CisgICAgdmlydHVhbCB2b2lkIGRvd25sb2FkKFJlc291cmNlSGFuZGxlKiwgY29uc3Qg
UmVzb3VyY2VSZXF1ZXN0JiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiwgY29uc3QgUmVzb3VyY2VS
ZXNwb25zZSYpOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxGcmFtZT4gY3JlYXRlRnJhbWUoY29u
c3QgS1VSTCYsIGNvbnN0IFN0cmluZyYsIEhUTUxGcmFtZU93bmVyRWxlbWVudCosIGNvbnN0IFN0
cmluZyYsIGJvb2wsIGludCwgaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkVHJhbnNmZXJDaGls
ZEZyYW1lVG9OZXdEb2N1bWVudChQYWdlKik7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPFdpZGdl
dD4gY3JlYXRlUGx1Z2luKGNvbnN0IEludFNpemUmLCBIVE1MUGx1Z0luRWxlbWVudCosIGNvbnN0
IEtVUkwmLCBjb25zdCBWZWN0b3I8U3RyaW5nPiYsIGNvbnN0IFZlY3RvcjxTdHJpbmc+JiwgY29u
c3QgU3RyaW5nJiwgYm9vbCk7CisgICAgdmlydHVhbCB2b2lkIHJlZGlyZWN0RGF0YVRvUGx1Z2lu
KFdpZGdldCopOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxXaWRnZXQ+IGNyZWF0ZUphdmFBcHBs
ZXRXaWRnZXQoY29uc3QgSW50U2l6ZSYsIEhUTUxBcHBsZXRFbGVtZW50KiwgY29uc3QgS1VSTCYs
IGNvbnN0IFZlY3RvcjxTdHJpbmc+JiwgY29uc3QgVmVjdG9yPFN0cmluZz4mKSB7IG5vdEltcGxl
bWVudGVkKCk7IHJldHVybiAwOyB9CisKKyAgICB2aXJ0dWFsIE9iamVjdENvbnRlbnRUeXBlIG9i
amVjdENvbnRlbnRUeXBlKGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmIG1pbWVUeXBlLCBib29s
IHNob3VsZFByZWZlclBsdWdJbnNGb3JJbWFnZXMpOworICAgIHZpcnR1YWwgU3RyaW5nIG92ZXJy
aWRlTWVkaWFUeXBlKCkgY29uc3QgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gU3RyaW5nKCk7
IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRDbGVhcldpbmRvd09iamVjdEluV29ybGQo
RE9NV3JhcHBlcldvcmxkKik7CisgICAgdmlydHVhbCB2b2lkIGRvY3VtZW50RWxlbWVudEF2YWls
YWJsZSgpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBkaWRQZXJmb3Jt
Rmlyc3ROYXZpZ2F0aW9uKCkgY29uc3QgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVh
bCB2b2lkIHJlZ2lzdGVyRm9ySWNvbk5vdGlmaWNhdGlvbihib29sKSB7IG5vdEltcGxlbWVudGVk
KCk7IH0KKworICAgIHZpcnR1YWwgYm9vbCBzaG91bGRMb2FkSWNvbkV4dGVybmFsbHkoKSB7IHJl
dHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgdm9pZCBsb2FkSWNvbkV4dGVybmFsbHkoY29uc3Qg
U3RyaW5nJiBvcmlnaW5hbFBhZ2VVcmwsIGNvbnN0IFN0cmluZyYgZmluYWxQYWdlVXJsLCBjb25z
dCBTdHJpbmcmIGljb25VcmwpOworCisgICAgdmlydHVhbCB2b2lkIGRpZERldGVjdFhTUyhjb25z
dCBLVVJMJiwgYm9vbCkgeyB9CisgICAgdmlydHVhbCB2b2lkIHRyYW5zZmVyTG9hZGluZ1Jlc291
cmNlRnJvbVBhZ2UoUmVzb3VyY2VMb2FkZXIqLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmLCBQYWdl
Kik7CisgICAgdmlydHVhbCB2b2lkIGRpZFRyYW5zZmVyQ2hpbGRGcmFtZVRvTmV3RG9jdW1lbnQo
KSB7IG5vdEltcGxlbWVudGVkKCk7IH07CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkQ2hh
bmdlSWNvbnMoSWNvblR5cGUpIHsgbm90SW1wbGVtZW50ZWQoKTsgfTsKKyAgICB2aXJ0dWFsIHZv
aWQgZGlzcGF0Y2hXaWxsU2VuZFN1Ym1pdEV2ZW50KEhUTUxGb3JtRWxlbWVudCopIHsgbm90SW1w
bGVtZW50ZWQoKTsgfTsKKworICAgIHZpcnR1YWwgdm9pZCB3aWxsRGVmZXJMb2FkaW5nKCk7Cisg
ICAgdmlydHVhbCB2b2lkIGRpZFJlc3VtZUxvYWRpbmcoKTsKKyAgICB2aXJ0dWFsIHZvaWQgYXV0
aGVudGljYXRpb25DaGFsbGVuZ2UoY29uc3QgU3RyaW5nJiByZWFsbSwgU3RyaW5nJiB1c2VybmFt
ZSwgU3RyaW5nJiBwYXNzd29yZCk7CisKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8RnJhbWVOZXR3
b3JraW5nQ29udGV4dD4gY3JlYXRlTmV0d29ya2luZ0NvbnRleHQoKTsKKworICAgICAvLyBTY2hl
ZHVsZSBhIHNjcmlwdCB0aGF0IHdhcyBsb2FkZWQgbWFudWFsbHkgYnkgdGhlIHVzZXIgKGVnLiBh
CisgICAgIC8vIGJvb2ttYXJrbGV0KSB3aGlsZSBwYWdlIGxvYWRpbmcgd2FzIGRlZmVycmVkLgor
ICAgIHZvaWQgc2V0RGVmZXJyZWRNYW51YWxTY3JpcHQoY29uc3QgS1VSTCYpOworCisgICAgdm9p
ZCByZWFkeVRvUmVuZGVyKGJvb2wgcGFnZUlzVmlzdWFsbHlOb25FbXB0eSk7CisKKyAgICB2b2lk
IGRvUGVuZGluZ0ZyYWdtZW50U2Nyb2xsKCk7CisKKyAgICAvLyBVc2VkIHRvIHN0b3AgbWVkaWEg
ZmlsZXMgZnJvbSBsb2FkaW5nIGJlY2F1c2Ugd2UgZG9uJ3QgbmVlZCB0byBoYXZlIHRoZSBlbnRp
cmUgZmlsZSBsb2FkZWQgYnkgV2ViS2l0LgorICAgIHZvaWQgc2V0Q2FuY2VsTG9hZE9uTmV4dERh
dGEoKSB7IG1fY2FuY2VsTG9hZE9uTmV4dERhdGEgPSB0cnVlOyB9CisgICAgYm9vbCBzaG91bGRD
YW5jZWxMb2FkT25OZXh0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fY2FuY2VsTG9hZE9uTmV4dERh
dGE7IH0KKworICAgIHZvaWQgc3VwcHJlc3NDaGlsZEZyYW1lQ3JlYXRpb24oKSB7IG1fY2hpbGRG
cmFtZUNyZWF0aW9uU3VwcHJlc3NlZCA9IHRydWU7IH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHJl
Y2VpdmVkRGF0YShjb25zdCBjaGFyKiwgaW50LCBjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lkIGRp
ZEZpbmlzaE9yRmFpbExvYWRpbmcoY29uc3QgUmVzb3VyY2VFcnJvciYpOworICAgIGJvb2wgaXNN
YWluRnJhbWUoKSBjb25zdDsKKworICAgIHZvaWQgaW52YWxpZGF0ZUJhY2tGb3J3YXJkTGlzdCgp
IGNvbnN0OworICAgIHZvaWQgbm90aWZ5QmFja0ZvcndhcmRMaXN0Q2hhbmdlZCgpIGNvbnN0Owor
CisgICAgUG9saWN5QWN0aW9uIGRlY2lkZVBvbGljeUZvckV4dGVybmFsTG9hZChjb25zdCBSZXNv
dXJjZVJlcXVlc3QgJiwgYm9vbCBpc0ZyYWdtZW50U2Nyb2xsKTsKKyAgICB2b2lkIGRlbGF5UG9s
aWN5Q2hlY2tVbnRpbEZyYWdtZW50RXhpc3RzKGNvbnN0IFN0cmluZyYgZnJhZ21lbnQsIEZyYW1l
UG9saWN5RnVuY3Rpb24pOworCisgICAgdm9pZCBkZWZlcnJlZEpvYnNUaW1lckZpcmVkKFRpbWVy
PEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeT4qKTsKKworICAgIEZyYW1lKiBtX2ZyYW1lOwor
ICAgIFJlc291cmNlRXJyb3IgbV9sb2FkRXJyb3I7CisgICAgQmxhY2tCZXJyeTo6V2ViS2l0OjpX
ZWJQYWdlUHJpdmF0ZSogbV93ZWJQYWdlUHJpdmF0ZTsKKworICAgIFRpbWVyPEZyYW1lTG9hZGVy
Q2xpZW50QmxhY2tCZXJyeT4qIG1fZGVmZXJyZWRKb2JzVGltZXI7CisgICAgS1VSTCBtX2RlZmVy
cmVkTWFudWFsU2NyaXB0OworICAgIEdlb2xvY2F0aW9uKiBtX2dlb2xvY2F0aW9uOworICAgIGJv
b2wgbV9zZW50UmVhZHlUb1JlbmRlcjsKKworICAgIEZyYW1lUG9saWN5RnVuY3Rpb24gbV9wZW5k
aW5nRnJhZ21lbnRTY3JvbGxQb2xpY3lGdW5jdGlvbjsKKyAgICBTdHJpbmcgbV9wZW5kaW5nRnJh
Z21lbnRTY3JvbGw7CisKKyAgICBib29sIG1fbG9hZGluZ0Vycm9yUGFnZTsKKyAgICBib29sIG1f
Y2xpZW50UmVkaXJlY3RJc1BlbmRpbmc7CisgICAgYm9vbCBtX2NoaWxkRnJhbWVDcmVhdGlvblN1
cHByZXNzZWQ7CisKKyAgICAvLyBUaGlzIHNldCBpbmNsdWRlcyB0aGUgb3JpZ2luYWwgYW5kIGZp
bmFsIHVybHMgZm9yIHNlcnZlciByZWRpcmVjdHMuCisgICAgSGFzaFNldDxLVVJMPiBtX2hpc3Rv
cnlOYXZpZ2F0aW9uU291cmNlVVJMczsKKyAgICBIYXNoU2V0PEtVUkw+IG1fcmVkaXJlY3RVUkxz
VG9Ta2lwRHVlVG9IaXN0b3J5TmF2aWdhdGlvbjsKKworICAgIC8vIFBsdWdpbiB2aWV3IHRvIHJl
ZGlyZWN0IGRhdGEgdG8uCisgICAgUGx1Z2luVmlldyogbV9wbHVnaW5WaWV3OworICAgIGJvb2wg
bV9oYXNTZW50UmVzcG9uc2VUb1BsdWdpbjsKKworICAgIC8vIFVzZWQgdG8gc3RvcCBtZWRpYSBm
aWxlcyBmcm9tIGxvYWRpbmcgYmVjYXVzZSB3ZSBkb24ndCBuZWVkIHRvIGhhdmUgdGhlIGVudGly
ZSBmaWxlIGxvYWRlZCBieSBXZWJLaXQuCisgICAgYm9vbCBtX2NhbmNlbExvYWRPbk5leHREYXRh
OworfTsKKworfSAvLyBXZWJDb3JlCisKKyNlbmRpZiAvLyBGcmFtZUxvYWRlckNsaWVudEJsYWNr
QmVycnlfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126996</attachid>
            <date>2012-02-14 10:19:03 -0800</date>
            <delta_ts>2012-02-14 11:58:16 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78275-20120214131843.patch</filename>
            <type>text/plain</type>
            <size>67148</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3MTA5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDljM2E2NmRhNThjMjhhYjI5
YzQwMjQ5YzBhNTcwYTg2YTA1N2IwNTIuLjk5YjE5MjRhZDQyMTU2YzBhN2VhZGM5OTA1YmFiNzEz
MDdjYjkyMGMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTItMDItMTAgIEphY2t5IEpp
YW5nICA8emhhamlhbmdAcmltLmNvbT4KKworICAgICAgICBbQmxhY2tCZXJyeV0gVXBzdHJlYW0g
QmxhY2tCZXJyeSBXZWJDb3JlU3VwcG9ydCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkgY2xh
c3MKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc4Mjc1
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW5pdGlh
bCB1cHN0cmVhbSwgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJDb3Jl
U3VwcG9ydC9GcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkuY3BwOiBBZGRlZC4KKyAgICAgICAg
KiBibGFja2JlcnJ5L1dlYkNvcmVTdXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeS5o
OiBBZGRlZC4KKwogMjAxMi0wMi0wOCAgUm9iIEJ1aXMgIDxyYnVpc0ByaW0uY29tPgogCiAgICAg
ICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBEdW1wUmVuZGVyVHJlZUJsYWNrQmVycnkKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRl
ckNsaWVudEJsYWNrQmVycnkuY3BwIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYkNvcmVT
dXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYTkzMmM1
N2RkMGQyYTI0NGVhYWM2YTcwNzVkZmNiOGU5ZWNhOWI4YgotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRlckNsaWVudEJs
YWNrQmVycnkuY3BwCkBAIC0wLDAgKzEsMTI1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl
CisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5LmgiCisKKyNpbmNsdWRlICJCYWNr
Rm9yd2FyZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJCYWNrRm9yd2FyZExpc3RJbXBsLmgiCisj
aW5jbHVkZSAiQmFja2luZ1N0b3JlQ2xpZW50LmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlX3Au
aCIKKyNpbmNsdWRlICJCYXNlNjQuaCIKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2luY2x1
ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUgIkNocm9tZUNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNs
dWRlICJDbGllbnRFeHRlbnNpb24uaCIKKyNpbmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCisjaW5j
bHVkZSAiRHVtcFJlbmRlclRyZWVDbGllbnQuaCIKKyNpbmNsdWRlICJGcmFtZU5ldHdvcmtpbmdD
b250ZXh0QmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhU
TUxGb3JtRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxIZWFkRWxlbWVudC5oIgorI2luY2x1ZGUg
IkhUTUxJbWFnZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MTGlua0VsZW1lbnQuaCIKKyNpbmNs
dWRlICJIVE1MTWVkaWFFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTE1ldGFFbGVtZW50LmgiCisj
aW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTFBsdWdJbkVsZW1lbnQuaCIKKyNp
bmNsdWRlICJIVFRQUGFyc2Vycy5oIgorI2luY2x1ZGUgIkhpc3RvcnlJdGVtLmgiCisjaW5jbHVk
ZSAiSWNvbkRhdGFiYXNlLmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJJbnB1dEhh
bmRsZXIuaCIKKyNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAiTmF0aXZl
SW1hZ2VTa2lhLmgiCisjaW5jbHVkZSAiTmV0d29ya01hbmFnZXIuaCIKKyNpbmNsdWRlICJOb2Rl
TGlzdC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJQbHVnaW5WaWV3LmgiCisjaW5j
bHVkZSAiUHJvZ3Jlc3NUcmFja2VyLmgiCisjaW5jbHVkZSAiU2NvcGVQb2ludGVyLmgiCisjaW5j
bHVkZSAiU2hhcmVkQnVmZmVyLmgiCisjaW5jbHVkZSAiVGV4dEVuY29kaW5nLmgiCisjaW5jbHVk
ZSAiVG91Y2hFdmVudEhhbmRsZXIuaCIKKyNpZiBFTkFCTEUoV0VCRE9NKQorI2luY2x1ZGUgIldl
YkRPTURvY3VtZW50LmgiCisjZW5kaWYKKyNpbmNsdWRlICJXZWJQYWdlQ2xpZW50LmgiCisKKyNp
bmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1Mb2cuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxh
dGZvcm1TY3JlZW4uaD4KKyNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9BUElDYXN0Lmg+CisjaW5j
bHVkZSA8bmV0d29yay9GaWx0ZXJTdHJlYW0uaD4KKyNpbmNsdWRlIDxuZXR3b3JrL05ldHdvcmtS
ZXF1ZXN0Lmg+CisKK3VzaW5nIFdURjo6U3RyaW5nOwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7
Cit1c2luZyBuYW1lc3BhY2UgQmxhY2tCZXJyeTo6V2ViS2l0OworCisvLyBUaGlzIHdhcyBjb3Bp
ZWQgZnJvbSBmaWxlICJXZWJLaXQvU291cmNlL1dlYktpdC9tYWMvTWlzYy9XZWJLaXRFcnJvcnMu
aCIuCitlbnVtIHsKKyAgICBXZWJLaXRFcnJvckNhbm5vdFNob3dNSU1FVHlwZSA9ICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAxMDAsCisgICAgV2ViS2l0RXJyb3JDYW5ub3RTaG93VVJMID0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxLAorICAgIFdlYktpdEVycm9yRnJh
bWVMb2FkSW50ZXJydXB0ZWRCeVBvbGljeUNoYW5nZSA9ICAgICAgICAgICAgIDEwMiwKKyAgICBX
ZWJLaXRFcnJvckNhbm5vdFVzZVJlc3RyaWN0ZWRQb3J0ID0gICAgICAgICAgICAgICAgICAgICAg
ICAxMDMsCisgICAgV2ViS2l0RXJyb3JDYW5ub3RGaW5kUGx1Z0luID0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgMjAwLAorICAgIFdlYktpdEVycm9yQ2Fubm90TG9hZFBsdWdJbiA9ICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMSwKKyAgICBXZWJLaXRFcnJvckphdmFVbmF2
YWlsYWJsZSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDIsCisgICAgV2ViS2l0
RXJyb3JQbHVnaW5XaWxsSGFuZGxlTG9hZCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAz
Cit9OworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJy
eTo6RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5KCkKKyAgICA6IG1fZnJhbWUoMCkKKyAgICAs
IG1fd2ViUGFnZVByaXZhdGUoMCkKKyAgICAsIG1fc2VudFJlYWR5VG9SZW5kZXIoZmFsc2UpCisg
ICAgLCBtX3BlbmRpbmdGcmFnbWVudFNjcm9sbFBvbGljeUZ1bmN0aW9uKDApCisgICAgLCBtX2xv
YWRpbmdFcnJvclBhZ2UoZmFsc2UpCisgICAgLCBtX2NsaWVudFJlZGlyZWN0SXNQZW5kaW5nKGZh
bHNlKQorICAgICwgbV9jaGlsZEZyYW1lQ3JlYXRpb25TdXBwcmVzc2VkKGZhbHNlKQorICAgICwg
bV9wbHVnaW5WaWV3KDApCisgICAgLCBtX2hhc1NlbnRSZXNwb25zZVRvUGx1Z2luKGZhbHNlKQor
ICAgICwgbV9jYW5jZWxMb2FkT25OZXh0RGF0YShmYWxzZSkKK3sKKyAgICBtX2RlZmVycmVkSm9i
c1RpbWVyID0gbmV3IFRpbWVyPEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeT4odGhpcywgJkZy
YW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGVmZXJyZWRKb2JzVGltZXJGaXJlZCk7Cit9CisK
K0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6fkZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJy
eSgpCit7CisgICAgZGVsZXRlIG1fZGVmZXJyZWRKb2JzVGltZXI7CisgICAgbV9kZWZlcnJlZEpv
YnNUaW1lciA9IDA7Cit9CisKK2ludCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OnBsYXll
cklkKCkgY29uc3QKK3sKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZSAmJiBtX3dlYlBhZ2VQcml2
YXRlLT5tX2NsaWVudCkKKyAgICAgICAgcmV0dXJuIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50
LT5nZXRJbnN0YW5jZUlkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgRnJhbWVMb2FkZXJD
bGllbnRCbGFja0JlcnJ5Ojpjb29raWVzRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1f
d2ViUGFnZVByaXZhdGUtPm1fd2ViU2V0dGluZ3MtPmFyZUNvb2tpZXNFbmFibGVkKCk7Cit9CisK
K3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZEFkZEJhY2tGb3J3
YXJkSXRlbShIaXN0b3J5SXRlbSogaXRlbSkgY29uc3QKK3sKKyAgICAvLyBJbmZvcm0gdGhlIGNs
aWVudCB0aGF0IHRoZSBiYWNrL2ZvcndhcmQgbGlzdCBoYXMgY2hhbmdlZC4KKyAgICBpbnZhbGlk
YXRlQmFja0ZvcndhcmRMaXN0KCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0Jl
cnJ5OjpkaXNwYXRjaERpZFJlbW92ZUJhY2tGb3J3YXJkSXRlbShIaXN0b3J5SXRlbSogaXRlbSkg
Y29uc3QKK3sKKyAgICBpbnZhbGlkYXRlQmFja0ZvcndhcmRMaXN0KCk7Cit9CisKK3ZvaWQgRnJh
bWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZENoYW5nZUJhY2tGb3J3YXJkSW5k
ZXgoKSBjb25zdAoreworICAgIGludmFsaWRhdGVCYWNrRm9yd2FyZExpc3QoKTsKK30KKwordm9p
ZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkQ2hhbmdlTG9jYXRpb25X
aXRoaW5QYWdlKCkKK3sKKyAgICBpZiAoIWlzTWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIFN0cmluZyB1cmwgPSBtX2ZyYW1lLT5kb2N1bWVudCgpLT51cmwoKS5zdHJpbmcoKTsK
KyAgICBTdHJpbmcgdG9rZW4gPSBtX2ZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKS0+
cmVxdWVzdCgpLnRva2VuKCk7CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+bm90
aWZ5TG9hZFRvQW5jaG9yKHVybC5jaGFyYWN0ZXJzKCksIHVybC5sZW5ndGgoKSwgdG9rZW4uY2hh
cmFjdGVycygpLCB0b2tlbi5sZW5ndGgoKSk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5OjpkaXNwYXRjaERpZFB1c2hTdGF0ZVdpdGhpblBhZ2UoKQoreworICAgIC8vIEZJ
WE1FOiBBcyBhIHdvcmthcm91bmQgd2UgYWJ1c2UgYW5jaG9yIG5hdmlnYXRpb24gdG8gYWNoaWV2
ZSBoaXN0b3J5IHB1c2guIFNlZSBQUiAjMTE5Nzc5IGZvciBtb3JlIGRldGFpbHMuCisgICAgZGlz
cGF0Y2hEaWRDaGFuZ2VMb2NhdGlvbldpdGhpblBhZ2UoKTsKK30KKwordm9pZCBGcmFtZUxvYWRl
ckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkUmVwbGFjZVN0YXRlV2l0aGluUGFnZSgpCit7
CisgICAgLy8gRklYTUU6IEFzIGEgd29ya2Fyb3VuZCB3ZSBhYnVzZSBhbmNob3IgbmF2aWdhdGlv
biB0byBhY2hpZXZlIGhpc3RvcnkgcmVwbGFjZS4gU2VlIFBSICMxMTk3NzkgZm9yIG1vcmUgZGV0
YWlscy4KKyAgICBkaXNwYXRjaERpZENoYW5nZUxvY2F0aW9uV2l0aGluUGFnZSgpOworfQorCit2
b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRQb3BTdGF0ZVdpdGhp
blBhZ2UoKQoreworICAgIC8vIE5vdCBuZWVkZWQuCit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGll
bnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZENhbmNlbENsaWVudFJlZGlyZWN0KCkKK3sKKyAgICBt
X2NsaWVudFJlZGlyZWN0SXNQZW5kaW5nID0gZmFsc2U7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJD
bGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaFdpbGxQZXJmb3JtQ2xpZW50UmVkaXJlY3QoY29uc3Qg
S1VSTCYsIGRvdWJsZSwgZG91YmxlKQoreworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1
bXBSZW5kZXJUcmVlKQorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVl
LT5kaWREaXNwYXRjaFdpbGxQZXJmb3JtQ2xpZW50UmVkaXJlY3QoKTsKKworICAgIG1fY2xpZW50
UmVkaXJlY3RJc1BlbmRpbmcgPSB0cnVlOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50Qmxh
Y2tCZXJyeTo6ZGlzcGF0Y2hEZWNpZGVQb2xpY3lGb3JSZXNwb25zZShGcmFtZVBvbGljeUZ1bmN0
aW9uIGZ1bmN0aW9uLCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSwgY29uc3QgUmVz
b3VyY2VSZXF1ZXN0JiByZXF1ZXN0KQoreworICAgIC8vIEZJWE1FOiBXaGF0IHNob3VsZCB3ZSBk
byBmb3IgSFRUUCBzdGF0dXMgY29kZSAyMDQgYW5kIDIwNSBhbmQgImFwcGxpY2F0aW9uL3ppcCI/
CisgICAgUG9saWN5QWN0aW9uIHBvbGljeSA9IFBvbGljeUlnbm9yZTsKKworICAgIGlmIChjb250
ZW50RGlzcG9zaXRpb25UeXBlKHJlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZCgiQ29udGVudC1EaXNw
b3NpdGlvbiIpKSA9PSBDb250ZW50RGlzcG9zaXRpb25BdHRhY2htZW50CisgICAgICAgIHx8IHJl
cXVlc3QuZm9yY2VEb3dubG9hZCgpKQorICAgICAgICBwb2xpY3kgPSBQb2xpY3lEb3dubG9hZDsK
KyAgICBlbHNlIGlmIChjYW5TaG93TUlNRVR5cGUocmVzcG9uc2UubWltZVR5cGUoKSkpCisgICAg
ICAgIHBvbGljeSA9IFBvbGljeVVzZTsKKyAgICBlbHNlIGlmICgoUmVzb3VyY2VSZXF1ZXN0OjpU
YXJnZXRJc01haW5GcmFtZSA9PSByZXF1ZXN0LnRhcmdldFR5cGUoKSkKKyAgICAgICAgICAgICAm
JiBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+ZG93bmxvYWRBbGxvd2VkKHJlcXVlc3QudXJs
KCkuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSkpCisgICAgICAgIHBvbGljeSA9IFBvbGljeURvd25s
b2FkOworCisgICAgKG1fZnJhbWUtPmxvYWRlcigpLT5wb2xpY3lDaGVja2VyKCktPipmdW5jdGlv
bikocG9saWN5KTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3Bh
dGNoRGVjaWRlUG9saWN5Rm9yTmF2aWdhdGlvbkFjdGlvbihGcmFtZVBvbGljeUZ1bmN0aW9uIGZ1
bmN0aW9uLCBjb25zdCBOYXZpZ2F0aW9uQWN0aW9uJiBhY3Rpb24sIGNvbnN0IFJlc291cmNlUmVx
dWVzdCYgcmVxdWVzdCwgUGFzc1JlZlB0cjxGb3JtU3RhdGU+KQoreworICAgIFBvbGljeUFjdGlv
biBkZWNpc2lvbiA9IFBvbGljeVVzZTsKKworICAgIGNvbnN0IEtVUkwmIHVybCA9IHJlcXVlc3Qu
dXJsKCk7CisKKyAgICAvLyBGcmFnbWVudCBzY3JvbGxzIG9uIHRoZSBzYW1lIHBhZ2Ugc2hvdWxk
IGFsd2F5cyBiZSBoYW5kbGVkIGludGVybmFsbHkuCisgICAgLy8gKE9ubHkgY291bnQgYXMgYSBm
cmFnbWVudCBzY3JvbGwgaWYgd2UgYXJlIHNjcm9sbGluZyB0byBhICNmcmFnbWVudCB1cmwsIG5v
dCBiYWNrIHRvIHRoZSB0b3AsIGFuZCByZWxvYWRpbmcKKyAgICAvLyB0aGUgc2FtZSB1cmwgaXMg
bm90IGEgZnJhZ21lbnQgc2Nyb2xsIGV2ZW4gaWYgaXQgaGFzIGEgI2ZyYWdtZW50LikKKyAgICBj
b25zdCBLVVJMJiBjdXJyZW50VXJsID0gbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCk7CisgICAg
Ym9vbCBpc0ZyYWdtZW50U2Nyb2xsID0gdXJsLmhhc0ZyYWdtZW50SWRlbnRpZmllcigpICYmIHVy
bCAhPSBjdXJyZW50VXJsICYmIGVxdWFsSWdub3JpbmdGcmFnbWVudElkZW50aWZpZXIoY3VycmVu
dFVybCwgdXJsKTsKKyAgICBpZiAoZGVjaXNpb24gPT0gUG9saWN5VXNlKQorICAgICAgICBkZWNp
c2lvbiA9IGRlY2lkZVBvbGljeUZvckV4dGVybmFsTG9hZChyZXF1ZXN0LCBpc0ZyYWdtZW50U2Ny
b2xsKTsKKworICAgIC8vIExldCB0aGUgY2xpZW50IGhhdmUgYSBjaGFuY2UgdG8gc2F5IHdoZXRo
ZXIgdGhpcyBuYXZpZ2F0aW9uIHNob3VsZAorICAgIC8vIGJlIGlnbm9yZWQgb3Igbm90LgorICAg
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdCBwbGF0Zm9ybVJlcXVlc3Q7Cisg
ICAgcmVxdWVzdC5pbml0aWFsaXplUGxhdGZvcm1SZXF1ZXN0KHBsYXRmb3JtUmVxdWVzdCwgZmFs
c2UgLyppc0luaXRpYWwqLyk7CisgICAgaWYgKGlzTWFpbkZyYW1lKCkgJiYgIW1fd2ViUGFnZVBy
aXZhdGUtPm1fY2xpZW50LT5hY2NlcHROYXZpZ2F0aW9uUmVxdWVzdCgKKyAgICAgICAgcGxhdGZv
cm1SZXF1ZXN0LCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmF2aWdhdGlvblR5cGUoYWN0aW9uLnR5
cGUoKSkpKSB7CisgICAgICAgIGlmIChhY3Rpb24udHlwZSgpID09IE5hdmlnYXRpb25UeXBlRm9y
bVN1Ym1pdHRlZAorICAgICAgICAgICAgfHwgYWN0aW9uLnR5cGUoKSA9PSBOYXZpZ2F0aW9uVHlw
ZUZvcm1SZXN1Ym1pdHRlZCkKKyAgICAgICAgICAgIG1fZnJhbWUtPmxvYWRlcigpLT5yZXNldE11
bHRpcGxlRm9ybVN1Ym1pc3Npb25Qcm90ZWN0aW9uKCk7CisKKyAgICAgICAgaWYgKGFjdGlvbi50
eXBlKCkgPT0gTmF2aWdhdGlvblR5cGVMaW5rQ2xpY2tlZCAmJiB1cmwuaGFzRnJhZ21lbnRJZGVu
dGlmaWVyKCkpIHsKKyAgICAgICAgICAgIFJlc291cmNlUmVxdWVzdCBlbXB0eVJlcXVlc3Q7Cisg
ICAgICAgICAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+YWN0aXZlRG9jdW1lbnRMb2FkZXIoKS0+c2V0
TGFzdENoZWNrZWRSZXF1ZXN0KGVtcHR5UmVxdWVzdCk7CisgICAgICAgIH0KKyAgICAgICAgZGVj
aXNpb24gPSBQb2xpY3lJZ25vcmU7CisgICAgfQorCisgICAgLy8gSWYgd2UgYWJvcnQgaGVyZSwg
ZGlzcGF0Y2hEaWRDYW5jZWxDbGllbnRSZWRpcmVjdCB3aWxsIG5vdCBiZSBjYWxsZWQuCisgICAg
Ly8gU28gY2FsbCBpdCBieSBoYW5kLgorICAgIGlmIChkZWNpc2lvbiA9PSBQb2xpY3lJZ25vcmUp
CisgICAgICAgIGRpc3BhdGNoRGlkQ2FuY2VsQ2xpZW50UmVkaXJlY3QoKTsKKworICAgIChtX2Zy
YW1lLT5sb2FkZXIoKS0+cG9saWN5Q2hlY2tlcigpLT4qZnVuY3Rpb24pKGRlY2lzaW9uKTsKKwor
ICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlKQorICAgICAgICBtX3dl
YlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlLT5kaWREZWNpZGVQb2xpY3lGb3JOYXZpZ2F0
aW9uQWN0aW9uKGFjdGlvbiwgcmVxdWVzdCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5OjpkZWxheVBvbGljeUNoZWNrVW50aWxGcmFnbWVudEV4aXN0cyhjb25zdCBTdHJp
bmcmIGZyYWdtZW50LCBGcmFtZVBvbGljeUZ1bmN0aW9uIGZ1bmN0aW9uKQoreworICAgIEFTU0VS
VChpc01haW5GcmFtZSgpKTsKKworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5sb2FkU3RhdGUo
KSA8IFdlYlBhZ2VQcml2YXRlOjpGaW5pc2hlZCAmJiAhbV9mcmFtZS0+ZG9jdW1lbnQoKS0+Zmlu
ZEFuY2hvcihmcmFnbWVudCkpIHsKKyAgICAgICAgLy8gVGVsbCB0aGUgY2xpZW50IHdlIG5lZWQg
bW9yZSBkYXRhLCBpbiBjYXNlIHRoZSBmcmFnbWVudCBleGlzdHMgYnV0IGlzIGJlaW5nIGhlbGQg
YmFjay4KKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5lZWRNb3JlRGF0YSgp
OworICAgICAgICBtX3BlbmRpbmdGcmFnbWVudFNjcm9sbFBvbGljeUZ1bmN0aW9uID0gZnVuY3Rp
b247CisgICAgICAgIG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsID0gZnJhZ21lbnQ7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICAobV9mcmFtZS0+bG9hZGVyKCktPnBvbGljeUNoZWNrZXIo
KS0+KmZ1bmN0aW9uKShQb2xpY3lVc2UpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50Qmxh
Y2tCZXJyeTo6Y2FuY2VsUG9saWN5Q2hlY2soKQoreworICAgIG1fcGVuZGluZ0ZyYWdtZW50U2Ny
b2xsUG9saWN5RnVuY3Rpb24gPSAwOworICAgIG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsID0gU3Ry
aW5nKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpkb1BlbmRpbmdG
cmFnbWVudFNjcm9sbCgpCit7CisgICAgaWYgKG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsLmlzTnVs
bCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBNYWtlIHN1cmUgdG8gY2xlYXIgdGhlIHBl
bmRpbmcgbWVtYmVycyBmaXJzdCB0byBhdm9pZCByZWN1cnNpb24uCisgICAgU3RyaW5nIGZyYWdt
ZW50ID0gbV9wZW5kaW5nRnJhZ21lbnRTY3JvbGw7CisgICAgbV9wZW5kaW5nRnJhZ21lbnRTY3Jv
bGwgPSBTdHJpbmcoKTsKKworICAgIEZyYW1lUG9saWN5RnVuY3Rpb24gZnVuY3Rpb24gPSBtX3Bl
bmRpbmdGcmFnbWVudFNjcm9sbFBvbGljeUZ1bmN0aW9uOworICAgIG1fcGVuZGluZ0ZyYWdtZW50
U2Nyb2xsUG9saWN5RnVuY3Rpb24gPSAwOworCisgICAgZGVsYXlQb2xpY3lDaGVja1VudGlsRnJh
Z21lbnRFeGlzdHMoZnJhZ21lbnQsIGZ1bmN0aW9uKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNs
aWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGVjaWRlUG9saWN5Rm9yTmV3V2luZG93QWN0aW9uKEZy
YW1lUG9saWN5RnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IE5hdmlnYXRpb25BY3Rpb24mLCBjb25z
dCBSZXNvdXJjZVJlcXVlc3QmIHJlcXVlc3QsIFBhc3NSZWZQdHI8Rm9ybVN0YXRlPiwgY29uc3Qg
U3RyaW5nJiBmcmFtZU5hbWUpCit7CisgICAgaWYgKHJlcXVlc3QuaXNSZXF1ZXN0ZWRCeVBsdWdp
bigpICYmIFNjcmlwdENvbnRyb2xsZXI6OnByb2Nlc3NpbmdVc2VyR2VzdHVyZSgpICYmICFtX3dl
YlBhZ2VQcml2YXRlLT5tX3BsdWdpbk1heU9wZW5OZXdUYWIpCisgICAgICAgIChtX2ZyYW1lLT5s
b2FkZXIoKS0+cG9saWN5Q2hlY2tlcigpLT4qZnVuY3Rpb24pKFBvbGljeUlnbm9yZSk7CisKKyAg
ICAvLyBBIG5ldyB3aW5kb3cgY2FuIG5ldmVyIGJlIGEgZnJhZ21lbnQgc2Nyb2xsLgorICAgIFBv
bGljeUFjdGlvbiBkZWNpc2lvbiA9IGRlY2lkZVBvbGljeUZvckV4dGVybmFsTG9hZChyZXF1ZXN0
LCBmYWxzZSk7CisgICAgKG1fZnJhbWUtPmxvYWRlcigpLT5wb2xpY3lDaGVja2VyKCktPipmdW5j
dGlvbikoZGVjaXNpb24pOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6
Y29tbWl0dGVkTG9hZChEb2N1bWVudExvYWRlciogbG9hZGVyLCBjb25zdCBjaGFyKiBkYXRhLCBp
bnQgbGVuZ3RoKQoreworICAgIC8vIFRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBjb2RlIG1heSBzZWVt
Li4uYSBiaXQgb2RkLiBJdCdzIHN0cnVjdHVyZWQgd2l0aCB0d28gY2hlY2tzIG9uIHRoZSBzdGF0
ZQorICAgIC8vIG9mIG1fcGx1Z2luVmlldyBiZWNhdXNlIGl0J3MgYWN0dWFsbHkgcmVjZWl2ZWRE
YXRhIHRoYXQgbWF5IGNhdXNlIHRoZSByZXF1ZXN0IHRvIHJlLWRpcmVjdCBkYXRhCisgICAgLy8g
dG8gYSBQbHVnaW5WaWV3LiBUaGlzIGlzIGJlY2F1c2UgcmVjZWl2ZWREYXRhIG1heSBkZWNpZGUg
dG8gY3JlYXRlIGEgUGx1Z2luRG9jdW1lbnQgY29udGFpbmluZworICAgIC8vIGEgUGx1Z2luVmll
dy4gVGhlIFBsdWdpblZpZXcgd2lsbCByZXF1ZXN0IHRoYXQgdGhlIG1haW4gcmVzb3VyY2UgZm9y
IHRoZSBmcmFtZSBiZSByZWRpcmVjdGVkCisgICAgLy8gdG8gdGhlIFBsdWdpblZpZXcuIFNvIGFm
dGVyIHJlY2VpdmVkRGF0YSBoYXMgYmVlbiBjYWxsZWQsIHRoaXMgY29kZSBuZWVkcyB0byBjaGVj
ayB3aGV0aGVyCisgICAgLy8gcmUtZGlyZWN0aW9uIHRvIGEgUGx1Z2luVmlldyBoYXMgYmVlbiBy
ZXF1ZXN0ZWQgYW5kIHBhc3MgdGhlIHNhbWUgZGF0YSBvbiB0byB0aGUgUGx1Z2luVmlldy4KKyAg
ICAvLyBUaGVyZWFmdGVyLCBhbGwgZGF0YSB3aWxsIGJlIHJlLWRpcmVjdGVkIHRvIHRoZSBQbHVn
aW5WaWV3OyBpLmUuLCBubyBhZGRpdGlvbmFsIGRhdGEgd2lsbCBnbworICAgIC8vIHRvIHJlY2Vp
dmVkRGF0YS4KKworICAgIGlmICghbV9wbHVnaW5WaWV3KSB7CisgICAgICAgIGNvbnN0IFN0cmlu
ZyYgdGV4dEVuY29kaW5nID0gbG9hZGVyLT5yZXNwb25zZSgpLnRleHRFbmNvZGluZ05hbWUoKTsK
KyAgICAgICAgcmVjZWl2ZWREYXRhKGRhdGEsIGxlbmd0aCwgdGV4dEVuY29kaW5nKTsKKyAgICB9
CisKKyAgICBpZiAobV9wbHVnaW5WaWV3KSB7CisgICAgICAgIGlmICghbV9oYXNTZW50UmVzcG9u
c2VUb1BsdWdpbikgeworICAgICAgICAgICAgbV9wbHVnaW5WaWV3LT5kaWRSZWNlaXZlUmVzcG9u
c2UobG9hZGVyLT5yZXNwb25zZSgpKTsKKyAgICAgICAgICAgIG1faGFzU2VudFJlc3BvbnNlVG9Q
bHVnaW4gPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtX3BsdWdpblZpZXcpCisg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgbV9wbHVnaW5WaWV3LT5kaWRSZWNlaXZlRGF0
YShkYXRhLCBsZW5ndGgpOworICAgIH0KK30KKworUGFzc1JlZlB0cjxXaWRnZXQ+IEZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y3JlYXRlUGx1Z2luKGNvbnN0IEludFNpemUmIHBsdWdpblNp
emUsCisgICAgSFRNTFBsdWdJbkVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IEtVUkwmIHVybCwgY29u
c3QgVmVjdG9yPFN0cmluZz4mIHBhcmFtTmFtZXMsCisgICAgY29uc3QgVmVjdG9yPFN0cmluZz4m
IHBhcmFtVmFsdWVzLCBjb25zdCBTdHJpbmcmIG1pbWVUeXBlSW4sIGJvb2wgbG9hZE1hbnVhbGx5
KQoreworICAgIFN0cmluZyBtaW1lVHlwZShtaW1lVHlwZUluKTsKKyAgICBpZiAobWltZVR5cGUu
aXNFbXB0eSgpKSB7CisgICAgICAgIG1pbWVUeXBlID0gTUlNRVR5cGVSZWdpc3RyeTo6Z2V0TUlN
RVR5cGVGb3JQYXRoKHVybC5wYXRoKCkpOworICAgICAgICBtaW1lVHlwZSA9IEJsYWNrQmVycnk6
OldlYktpdDo6V2ViU2V0dGluZ3M6OmdldE5vcm1hbGl6ZWRNSU1FVHlwZShtaW1lVHlwZSk7Cisg
ICAgICAgIGlmIChtaW1lVHlwZSAhPSAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKQor
ICAgICAgICAgICAgbWltZVR5cGUgPSBtaW1lVHlwZUluOworICAgIH0KKworICAgIGlmIChtaW1l
VHlwZSA9PSAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giIHx8IG1pbWVUeXBlID09ICJh
cHBsaWNhdGlvbi9qbmV4dC1zY3JpcHRhYmxlLXBsdWdpbiIpCisgICAgICAgIHJldHVybiBQbHVn
aW5WaWV3OjpjcmVhdGUobV9mcmFtZSwgcGx1Z2luU2l6ZSwgZWxlbWVudCwgdXJsLCBwYXJhbU5h
bWVzLCBwYXJhbVZhbHVlcywgbWltZVR5cGUsIGxvYWRNYW51YWxseSk7CisKKyAgICAvLyBJZiBp
dCdzIG5vdCB0aGUgcGx1Z2luIHR5cGUgd2Ugc3VwcG9ydCwgdHJ5IGxvYWQgZGlyZWN0bHkgZnJv
bSBicm93c2VyLgorICAgIGlmIChtX2ZyYW1lLT5sb2FkZXIoKSAmJiBtX2ZyYW1lLT5sb2FkZXIo
KS0+c3ViZnJhbWVMb2FkZXIoKSAmJiAhdXJsLmlzTnVsbCgpKQorICAgICAgICBtX2ZyYW1lLT5s
b2FkZXIoKS0+c3ViZnJhbWVMb2FkZXIoKS0+cmVxdWVzdEZyYW1lKGVsZW1lbnQsIHVybCwgU3Ry
aW5nKCkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFj
a0JlcnJ5OjpyZWRpcmVjdERhdGFUb1BsdWdpbihXaWRnZXQqIHBsdWdpbldpZGdldCkKK3sKKyAg
ICBBU1NFUlQoIW1fcGx1Z2luVmlldyk7CisgICAgbV9wbHVnaW5WaWV3ID0gc3RhdGljX2Nhc3Q8
UGx1Z2luVmlldyo+KHBsdWdpbldpZGdldCk7CisgICAgbV9oYXNTZW50UmVzcG9uc2VUb1BsdWdp
biA9IGZhbHNlOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6cmVjZWl2
ZWREYXRhKGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgsIGNvbnN0IFN0cmluZyYgdGV4dEVu
Y29kaW5nKQoreworICAgIGlmICghbV9mcmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYg
KG1fY2FuY2VsTG9hZE9uTmV4dERhdGEpIHsKKyAgICAgICAgbV9mcmFtZS0+bG9hZGVyKCktPmFj
dGl2ZURvY3VtZW50TG9hZGVyKCktPnN0b3BMb2FkaW5nKCk7CisgICAgICAgIG1fZnJhbWUtPmxv
YWRlcigpLT5kb2N1bWVudExvYWRlcigpLT53cml0ZXIoKS0+ZW5kKCk7CisgICAgICAgIG1fY2Fu
Y2VsTG9hZE9uTmV4dERhdGEgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IC8vIFNldCB0aGUgZW5jb2RpbmcuIFRoaXMgb25seSBuZWVkcyB0byBiZSBkb25lIG9uY2UsIGJ1
dCBpdCdzIGhhcm1sZXNzIHRvIGRvIGl0IGFnYWluIGxhdGVyLgorICAgIFN0cmluZyBlbmNvZGlu
ZyA9IG1fZnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigpLT5vdmVycmlkZUVuY29kaW5n
KCk7CisgICAgYm9vbCB1c2VyQ2hvc2VuID0gIWVuY29kaW5nLmlzTnVsbCgpOworICAgIGlmIChl
bmNvZGluZy5pc051bGwoKSkKKyAgICAgICAgZW5jb2RpbmcgPSB0ZXh0RW5jb2Rpbmc7CisgICAg
bV9mcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCktPndyaXRlcigpLT5zZXRFbmNvZGlu
ZyhlbmNvZGluZywgdXNlckNob3Nlbik7CisgICAgbV9mcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50
TG9hZGVyKCktPndyaXRlcigpLT5hZGREYXRhKGRhdGEsIGxlbmd0aCk7Cit9CisKK3ZvaWQgRnJh
bWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpmaW5pc2hlZExvYWRpbmcoRG9jdW1lbnRMb2FkZXIq
IGxvYWRlcikKK3sKKyAgICBpZiAobV9wbHVnaW5WaWV3KSB7CisgICAgICAgIG1fcGx1Z2luVmll
dy0+ZGlkRmluaXNoTG9hZGluZygpOworICAgICAgICBtX3BsdWdpblZpZXcgPSAwOworICAgICAg
ICBtX2hhc1NlbnRSZXNwb25zZVRvUGx1Z2luID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgLy8gVGVsbGluZyB0aGUgZnJhbWUgd2UgcmVjZWl2ZWQgc29tZSBkYXRhIGFuZCBwYXNzaW5n
IDAgYXMgdGhlIGRhdGEgaXMgb3VyCisgICAgICAgIC8vIHdheSB0byBnZXQgd29yayBkb25lIHRo
YXQgaXMgbm9ybWFsbHkgZG9uZSB3aGVuIHRoZSBmaXJzdCBiaXQgb2YgZGF0YSBpcworICAgICAg
ICAvLyByZWNlaXZlZCwgZXZlbiBmb3IgdGhlIGNhc2Ugb2YgYSBkb2N1bWVudCB3aXRoIG5vIGRh
dGEgKGxpa2UgYWJvdXQ6YmxhbmspLgorICAgICAgICBjb21taXR0ZWRMb2FkKGxvYWRlciwgMCwg
MCk7CisgICAgfQorfQorCitQYXNzUmVmUHRyPERvY3VtZW50TG9hZGVyPiBGcmFtZUxvYWRlckNs
aWVudEJsYWNrQmVycnk6OmNyZWF0ZURvY3VtZW50TG9hZGVyKGNvbnN0IFJlc291cmNlUmVxdWVz
dCYgcmVxdWVzdCwgY29uc3QgU3Vic3RpdHV0ZURhdGEmIHN1YnN0aXR1dGVEYXRhKQoreworICAg
IC8vIE1ha2UgYSBjb3B5IG9mIHRoZSByZXF1ZXN0IHdpdGggdGhlIHRva2VuIGZyb20gdGhlIG9y
aWdpbmFsIHJlcXVlc3QgZm9yIHRoaXMgZnJhbWUKKyAgICAvLyAodW5sZXNzIGl0IGFscmVhZHkg
aGFzIGEgdG9rZW4sIGluIHdoaWNoIGNhc2UgdGhlIHJlcXVlc3QgY2FtZSBmcm9tIHRoZSBjbGll
bnQpLgorICAgIFJlc291cmNlUmVxdWVzdCBuZXdSZXF1ZXN0KHJlcXVlc3QpOworICAgIGlmICht
X2ZyYW1lICYmIG1fZnJhbWUtPmxvYWRlcigpICYmIG1fZnJhbWUtPmxvYWRlcigpLT5kb2N1bWVu
dExvYWRlcigpKSB7CisgICAgICAgIGNvbnN0IFJlc291cmNlUmVxdWVzdCYgb3JpZ2luYWxSZXF1
ZXN0ID0gbV9mcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCktPm9yaWdpbmFsUmVxdWVz
dCgpOworICAgICAgICBpZiAocmVxdWVzdC50b2tlbigpLmlzTnVsbCgpICYmICFvcmlnaW5hbFJl
cXVlc3QudG9rZW4oKS5pc051bGwoKSkKKyAgICAgICAgICAgIG5ld1JlcXVlc3Quc2V0VG9rZW4o
b3JpZ2luYWxSZXF1ZXN0LnRva2VuKCkpOworICAgIH0KKworICAgIC8vIEZJWE1FOiBUaGlzIHNo
b3VsZCBwcm9iYWJseSBiZSBzaGFyZWQuCisgICAgUmVmUHRyPERvY3VtZW50TG9hZGVyPiBsb2Fk
ZXIgPSBEb2N1bWVudExvYWRlcjo6Y3JlYXRlKG5ld1JlcXVlc3QsIHN1YnN0aXR1dGVEYXRhKTsK
KyAgICBpZiAoc3Vic3RpdHV0ZURhdGEuaXNWYWxpZCgpKQorICAgICAgICBsb2FkZXItPnNldERl
ZmVyTWFpblJlc291cmNlRGF0YUxvYWQoZmFsc2UpOworICAgIHJldHVybiBsb2FkZXIucmVsZWFz
ZSgpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZnJhbWVMb2FkZXJE
ZXN0cm95ZWQoKQoreworICAgIGRlbGV0ZSB0aGlzOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xp
ZW50QmxhY2tCZXJyeTo6dHJhbnNpdGlvblRvQ29tbWl0dGVkRm9yTmV3UGFnZSgpCit7CisgICAg
bV9jYW5jZWxMb2FkT25OZXh0RGF0YSA9IGZhbHNlOworCisgICAgLy8gSW4gRnJhbWU6OmNyZWF0
ZVZpZXcsIEZyYW1lJ3MgRnJhbWVWaWV3IG9iamVjdCBpcyBzZXQgdG8gMCBhbmQgIHJlY3JlYXRl
ZC4KKyAgICAvLyBUaGlzIG9wZXJhdGlvbiBpcyBub3QgYXRvbWljLCBhbmQgYW4gYXR0ZW1wdCB0
byBibGl0IGNvbnRlbnRzIG1pZ2h0IGhhcHBlbgorICAgIC8vIGluIHRoZSBiYWNraW5nIHN0b3Jl
IGZyb20gYW5vdGhlciB0aHJlYWQgKHNlZSBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0Q29udGVu
dHMgbWV0aG9kKSwKKyAgICAvLyBzbyB3ZSBzdXNwZW5kIGFuZCByZXN1bWUgc2NyZWVuIHVwZGF0
ZSB0byBtYWtlIHN1cmUgd2UgZG8gbm90IGdldCBhIGludmFsaWQgRnJhbWVWaWV3CisgICAgLy8g
c3RhdGUuCisgICAgQmFja2luZ1N0b3JlQ2xpZW50KiBiYWNraW5nU3RvcmVDbGllbnRGb3JGcmFt
ZSA9IG1fd2ViUGFnZVByaXZhdGUtPmJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKG1fZnJhbWUp
OworICAgIGlmIChiYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZSkKKyAgICAgICAgYmFja2luZ1N0
b3JlQ2xpZW50Rm9yRnJhbWUtPmJhY2tpbmdTdG9yZSgpLT5kLT5zdXNwZW5kU2NyZWVuQW5kQmFj
a2luZ1N0b3JlVXBkYXRlcygpOworCisgICAgLy8gV2UgYXJlIG5hdmlnYXRpbmcgYXdheSBmcm9t
IHRoaXMgZG9jdW1lbnQsIHNvIGNsZWFuIHVwIGFueSBmb290cHJpbnQgd2UgbWlnaHQgaGF2ZS4K
KyAgICBpZiAobV9mcmFtZS0+ZG9jdW1lbnQoKSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+
Y2xlYXJEb2N1bWVudERhdGEobV9mcmFtZS0+ZG9jdW1lbnQoKSk7CisKKyAgICBDb2xvciBiYWNr
Z3JvdW5kQ29sb3IobV93ZWJQYWdlUHJpdmF0ZS0+bV93ZWJTZXR0aW5ncy0+YmFja2dyb3VuZENv
bG9yKCkpOworCisgICAgbV9mcmFtZS0+Y3JlYXRlVmlldyhtX3dlYlBhZ2VQcml2YXRlLT52aWV3
cG9ydFNpemUoKSwgICAgICAvKnZpZXdwb3J0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJh
Y2tncm91bmRDb2xvciwgICAgICAgICAgICAgICAgICAgICAgIC8qYmFja2dyb3VuZCBjb2xvciov
CisgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IuaGFzQWxwaGEoKSwgICAg
ICAgICAgICAvKmlzIHRyYW5zcGFyZW50Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fd2Vi
UGFnZVByaXZhdGUtPmFjdHVhbFZpc2libGVTaXplKCksIC8qZml4ZWQgcmVwb3J0ZWQgc2l6ZSov
CisgICAgICAgICAgICAgICAgICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5maXhlZExheW91dFNp
emUoKSwgICAvKmZpeGVkIGxheW91dCBzaXplKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1f
d2ViUGFnZVByaXZhdGUtPnVzZUZpeGVkTGF5b3V0KCksICAgIC8qdXNlIGZpeGVkIGxheW91dCAq
LworICAgICAgICAgICAgICAgICAgICAgICAgU2Nyb2xsYmFyQWx3YXlzT2ZmLCAgICAgICAgICAg
ICAgICAgICAgLypob3IgbW9kZSovCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxvY2sgdGhlIG1vZGUqLworICAgICAgICAg
ICAgICAgICAgICAgICAgU2Nyb2xsYmFyQWx3YXlzT2ZmLCAgICAgICAgICAgICAgICAgICAgLyp2
ZXIgbW9kZSovCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAvKmxvY2sgdGhlIG1vZGUqLworCisgICAgaWYgKGJhY2tpbmdTdG9y
ZUNsaWVudEZvckZyYW1lKQorICAgICAgICBiYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZS0+YmFj
a2luZ1N0b3JlKCktPmQtPnJlc3VtZVNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoQmFja2lu
Z1N0b3JlOjpOb25lKTsKKyAgICBtX2ZyYW1lLT52aWV3KCktPnVwZGF0ZUNhbkhhdmVTY3JvbGxi
YXJzKCk7CisKKyAgICBpZiAoaXNNYWluRnJhbWUoKSkgeworICAgICAgICAvLyBTaW5jZSB0aGUg
bWFpbmZyYW1lIGhhcyBhIHRpbGVkIGJhY2tpbmdzdG9yZSByZXF1ZXN0IHRvIHJlY2VpdmUgYWxs
IHVwZGF0ZQorICAgICAgICAvLyByZWN0cyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHdoaWNoIGp1
c3Qgc2VuZHMgdXBkYXRlIHJlY3RzIGZvciBjdXJyZW50bHkKKyAgICAgICAgLy8gdmlzaWJsZSB2
aWV3cG9ydC4KKyAgICAgICAgbV9mcmFtZS0+dmlldygpLT5zZXRQYWludHNFbnRpcmVDb250ZW50
cyh0cnVlKTsKKyAgICB9Cit9CisKK1N0cmluZyBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6
OnVzZXJBZ2VudChjb25zdCBLVVJMJikKK3sKKyAgICByZXR1cm4gbV93ZWJQYWdlUHJpdmF0ZS0+
bV93ZWJTZXR0aW5ncy0+dXNlckFnZW50U3RyaW5nKCk7Cit9CisKK2Jvb2wgRnJhbWVMb2FkZXJD
bGllbnRCbGFja0JlcnJ5OjpjYW5IYW5kbGVSZXF1ZXN0KGNvbnN0IFJlc291cmNlUmVxdWVzdCYp
IGNvbnN0Cit7CisgICAgLy8gRklYTUU6IFN0dWIuCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jv
b2wgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpjYW5TaG93TUlNRVR5cGUoY29uc3QgU3Ry
aW5nJiBtaW1lVHlwZUluKSBjb25zdAoreworICAgIC8vIEdldCBub3JtYWxpemVkIHR5cGUuCisg
ICAgU3RyaW5nIG1pbWVUeXBlID0gQmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJTZXR0aW5nczo6Z2V0
Tm9ybWFsaXplZE1JTUVUeXBlKG1pbWVUeXBlSW4pOworCisgICAgLy8gRklYTUU6IFNlZW1zIG5v
IG90aGVyIHBvcnQgY2hlY2tzIGVtcHR5IE1JTUUgdHlwZSBpbiB0aGlzIGZ1bmN0aW9uLiBTaG91
bGQgd2UgZG8gdGhhdD8KKyAgICByZXR1cm4gTUlNRVR5cGVSZWdpc3RyeTo6aXNTdXBwb3J0ZWRJ
bWFnZU1JTUVUeXBlKG1pbWVUeXBlKSB8fCBNSU1FVHlwZVJlZ2lzdHJ5Ojppc1N1cHBvcnRlZE5v
bkltYWdlTUlNRVR5cGUobWltZVR5cGUpCisgICAgICAgIHx8IE1JTUVUeXBlUmVnaXN0cnk6Omlz
U3VwcG9ydGVkTWVkaWFNSU1FVHlwZShtaW1lVHlwZSkgfHwgQmxhY2tCZXJyeTo6V2ViS2l0OjpX
ZWJTZXR0aW5nczo6aXNTdXBwb3J0ZWRPYmplY3RNSU1FVHlwZShtaW1lVHlwZSkKKyAgICAgICAg
fHwgKG1pbWVUeXBlID09ICJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpOworfQorCiti
b29sIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y2FuU2hvd01JTUVUeXBlQXNIVE1MKGNv
bnN0IFN0cmluZyYpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IFN0dWIuCisgICAgcmV0dXJuIHRy
dWU7Cit9CisKKworYm9vbCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmlzTWFpbkZyYW1l
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9mcmFtZSA9PSBtX3dlYlBhZ2VQcml2YXRlLT5tX21h
aW5GcmFtZTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNo
RGlkU3RhcnRQcm92aXNpb25hbExvYWQoKQoreworICAgIGlmIChpc01haW5GcmFtZSgpKQorICAg
ICAgICBtX3dlYlBhZ2VQcml2YXRlLT5zZXRMb2FkU3RhdGUoV2ViUGFnZVByaXZhdGU6OlByb3Zp
c2lvbmFsKTsKKworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlKQor
ICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlLT5kaWRTdGFydFByb3Zp
c2lvbmFsTG9hZEZvckZyYW1lKG1fZnJhbWUpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50
QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRSZWNlaXZlUmVzcG9uc2UoRG9jdW1lbnRMb2FkZXIqLCB1
bnNpZ25lZCBsb25nIGlkZW50aWZpZXIsIGNvbnN0IFJlc291cmNlUmVzcG9uc2UmIHJlc3BvbnNl
KQoreworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlKQorICAgICAg
ICBtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlLT5kaWRSZWNlaXZlUmVzcG9uc2VG
b3JGcmFtZShtX2ZyYW1lLCByZXNwb25zZSk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5OjpkaXNwYXRjaERpZFJlY2VpdmVUaXRsZShjb25zdCBTdHJpbmdXaXRoRGlyZWN0
aW9uJiB0aXRsZSkKK3sKKyAgICBpZiAoaXNNYWluRnJhbWUoKSkKKyAgICAgICAgbV93ZWJQYWdl
UHJpdmF0ZS0+bV9jbGllbnQtPnNldFBhZ2VUaXRsZSh0aXRsZS5zdHJpbmcoKS5jaGFyYWN0ZXJz
KCksIHRpdGxlLnN0cmluZygpLmxlbmd0aCgpKTsKKworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRl
LT5tX2R1bXBSZW5kZXJUcmVlKQorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5k
ZXJUcmVlLT5kaWRSZWNlaXZlVGl0bGVGb3JGcmFtZSh0aXRsZS5zdHJpbmcoKSwgbV9mcmFtZSk7
Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpzZXRUaXRsZShjb25zdCBT
dHJpbmdXaXRoRGlyZWN0aW9uJiAvKnRpdGxlKi8sIGNvbnN0IEtVUkwmIC8qdXJsKi8pCit7Cisg
ICAgLy8gVXNlZCBieSBBcHBsZSBXZWJLaXQgdG8gdXBkYXRlIHRoZSB0aXRsZSBvZiBhbiBleGlz
dGluZyBoaXN0b3J5IGl0ZW0uCisgICAgLy8gUXRXZWJLaXQgZG9lc24ndCBhY2NvbW9kYXRlIHRo
aXMgb24gaGlzdG9yeSBpdGVtcy4gSWYgaXQgZXZlciBkb2VzLAorICAgIC8vIGl0IHNob3VsZCBi
ZSBwcml2YXRlQnJvd3NpbmctYXdhcmUuIEZvciBub3csIHdlIGFyZSBqdXN0IHBhc3NpbmcKKyAg
ICAvLyBnbG9iYWxoaXN0b3J5IGxheW91dCB0ZXN0cy4KKyAgICAvLyBGSVhNRTogVXNlIGRpcmVj
dGlvbiBvZiB0aXRsZS4KKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRDb21taXRMb2FkKCkKK3sKKyAgICAvLyBG
SVhNRTogRG8gd2UgbmVlZCB0byBmaW5kIGEgcmVwbGFjZW1lbnQgZm9yIG1fZnJhbWUtPmRvY3Vt
ZW50KCktPnNldEV4dHJhTGF5b3V0RGVsYXkoMjUwKTs/CisKKyAgICBpZiAoaXNNYWluRnJhbWUo
KSkgeworICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5zZXRMb2FkU3RhdGUoV2ViUGFnZVByaXZh
dGU6OkNvbW1pdHRlZCk7CisKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsVXJsID0gbV9mcmFtZS0+
bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCktPm9yaWdpbmFsUmVxdWVzdCgpLnVybCgpLnN0cmlu
ZygpOworICAgICAgICBTdHJpbmcgdXJsID0gbV9mcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9h
ZGVyKCktPnJlcXVlc3QoKS51cmwoKS5zdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nIHRva2VuID0g
bV9mcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCktPnJlcXVlc3QoKS50b2tlbigpOwor
CisgICAgICAgIC8vIE5vdGlmeSB0aGUgY2xpZW50IHRoYXQgdGhlIGxvYWQgc3VjY2VlZGVkIG9y
IGZhaWxlZCAoaWYgaXQgZmFpbGVkLCB0aGlzCisgICAgICAgIC8vIGlzIGFjdHVhbGx5IGNvbW1p
dHRpbmcgdGhlIGVycm9yIHBhZ2UsIHdoaWNoIHdhcyBzZXQgdGhyb3VnaAorICAgICAgICAvLyBT
dWJzdGl0dXRlRGF0YSBpbiBkaXNwYXRjaERpZEZhaWxQcm92aXNpb25hbExvYWQpLgorICAgICAg
ICBpZiAobV9sb2FkaW5nRXJyb3JQYWdlKSB7CisgICAgICAgICAgICBtX2xvYWRpbmdFcnJvclBh
Z2UgPSBmYWxzZTsKKyAgICAgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5ub3Rp
ZnlMb2FkRmFpbGVkQmVmb3JlQ29tbWl0KAorICAgICAgICAgICAgICAgIG9yaWdpbmFsVXJsLmNo
YXJhY3RlcnMoKSwgb3JpZ2luYWxVcmwubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgIHVy
bC5jaGFyYWN0ZXJzKCksIHVybC5sZW5ndGgoKSwgdG9rZW4uY2hhcmFjdGVycygpLCB0b2tlbi5s
ZW5ndGgoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX3dlYlBhZ2VQcml2YXRl
LT5tX2NsaWVudC0+bm90aWZ5TG9hZENvbW1pdHRlZCgKKyAgICAgICAgICAgICAgICBvcmlnaW5h
bFVybC5jaGFyYWN0ZXJzKCksIG9yaWdpbmFsVXJsLmxlbmd0aCgpLAorICAgICAgICAgICAgICAg
ICAgICB1cmwuY2hhcmFjdGVycygpLCB1cmwubGVuZ3RoKCksIHRva2VuLmNoYXJhY3RlcnMoKSwg
dG9rZW4ubGVuZ3RoKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1fd2ViUGFnZVBy
aXZhdGUtPm1fZHVtcFJlbmRlclRyZWUpCisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fZHVt
cFJlbmRlclRyZWUtPmRpZENvbW1pdExvYWRGb3JGcmFtZShtX2ZyYW1lKTsKK30KKwordm9pZCBG
cmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkSGFuZGxlT25sb2FkRXZlbnRz
KCkKK3sKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+bm90aWZ5RG9jdW1lbnRPbkxv
YWQoKTsKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZSkKKyAgICAg
ICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZS0+ZGlkSGFuZGxlT25sb2FkRXZl
bnRzRm9yRnJhbWUobV9mcmFtZSk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0Jl
cnJ5OjpkaXNwYXRjaERpZEZpbmlzaExvYWQoKQoreworICAgIGRpZEZpbmlzaE9yRmFpbExvYWRp
bmcoUmVzb3VyY2VFcnJvcigpKTsKKworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBS
ZW5kZXJUcmVlKQorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlLT5k
aWRGaW5pc2hMb2FkRm9yRnJhbWUobV9mcmFtZSk7CisKKyAgICBpZiAoIWlzTWFpbkZyYW1lKCkg
fHwgbV93ZWJQYWdlUHJpdmF0ZS0+bV93ZWJTZXR0aW5ncy0+aXNFbWFpbE1vZGUoKQorICAgICAg
ICB8fCAhbV9mcmFtZS0+ZG9jdW1lbnQoKSB8fCAhbV9mcmFtZS0+ZG9jdW1lbnQoKS0+aGVhZCgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBIVE1MSGVhZEVsZW1lbnQqIGhlYWRFbGVtZW50ID0g
bV9mcmFtZS0+ZG9jdW1lbnQoKS0+aGVhZCgpOworICAgIC8vIEZJWE1FOiBIYW5kbGUgTk9TQ1JJ
UFQgc3BlY2lhbCBjYXNlPworCisgICAgLy8gUHJvY2VzcyBkb2N1bWVudCBtZXRhZGF0YS4KKyAg
ICBSZWZQdHI8Tm9kZUxpc3Q+IG5vZGVMaXN0ID0gaGVhZEVsZW1lbnQtPmdldEVsZW1lbnRzQnlU
YWdOYW1lKEhUTUxOYW1lczo6bWV0YVRhZy5sb2NhbE5hbWUoKSk7CisgICAgdW5zaWduZWQgaW50
IHNpemUgPSBub2RlTGlzdC0+bGVuZ3RoKCk7CisgICAgU2NvcGVBcnJheTxXZWJTdHJpbmc+IGhl
YWRlcnM7CisKKyAgICAvLyBUaGlzIG1heSBhbGxvY2F0ZSBtb3JlIHNwYWNlIHRoYW4gbmVlZGVk
IHNpbmNlIG5vdCBhbGwgbWV0YSBlbGVtZW50cyB3aWxsIGJlIGh0dHAtZXF1aXYuCisgICAgaGVh
ZGVycy5yZXNldChuZXcgV2ViU3RyaW5nWzIgKiBzaXplXSk7CisgICAgdW5zaWduZWQgaGVhZGVy
c0xlbmd0aCA9IDA7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7
CisgICAgICAgIEhUTUxNZXRhRWxlbWVudCogbWV0YUVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1M
TWV0YUVsZW1lbnQqPihub2RlTGlzdC0+aXRlbShpKSk7CisgICAgICAgIGlmIChXVEY6OmVxdWFs
SWdub3JpbmdDYXNlKG1ldGFFbGVtZW50LT5uYW1lKCksICJhcHBsZS1tb2JpbGUtd2ViLWFwcC1j
YXBhYmxlIikKKyAgICAgICAgICAgICYmIFdURjo6ZXF1YWxJZ25vcmluZ0Nhc2UobWV0YUVsZW1l
bnQtPmNvbnRlbnQoKS5zdHJpcFdoaXRlU3BhY2UoKSwgInllcyIpKQorICAgICAgICAgICAgbV93
ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPnNldFdlYkFwcENhcGFibGUoKTsKKyAgICAgICAgZWxz
ZSB7CisgICAgICAgICAgICBTdHJpbmcgaHR0cEVxdWl2ID0gbWV0YUVsZW1lbnQtPmh0dHBFcXVp
digpLnN0cmlwV2hpdGVTcGFjZSgpOworICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBtZXRh
RWxlbWVudC0+Y29udGVudCgpLnN0cmlwV2hpdGVTcGFjZSgpOworCisgICAgICAgICAgICBpZiAo
IWh0dHBFcXVpdi5pc051bGwoKSAmJiAhY29udGVudC5pc051bGwoKSkgeworICAgICAgICAgICAg
ICAgIGhlYWRlcnNbaGVhZGVyc0xlbmd0aCsrXSA9IGh0dHBFcXVpdjsKKyAgICAgICAgICAgICAg
ICBoZWFkZXJzW2hlYWRlcnNMZW5ndGgrK10gPSBjb250ZW50OworICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgfQorCisgICAgaWYgKGhlYWRlcnNMZW5ndGggPiAwKQorICAgICAgICBtX3dl
YlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+c2V0TWV0YUhlYWRlcnMoaGVhZGVycywgaGVhZGVyc0xl
bmd0aCk7CisKKyAgICBub2RlTGlzdCA9IGhlYWRFbGVtZW50LT5nZXRFbGVtZW50c0J5VGFnTmFt
ZShIVE1MTmFtZXM6OmxpbmtUYWcubG9jYWxOYW1lKCkpOworICAgIHNpemUgPSBub2RlTGlzdC0+
bGVuZ3RoKCk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Cisg
ICAgICAgIEhUTUxMaW5rRWxlbWVudCogbGlua0VsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MTGlu
a0VsZW1lbnQqPihub2RlTGlzdC0+aXRlbShpKSk7CisgICAgICAgIFN0cmluZyBocmVmID0gbGlu
a0VsZW1lbnQtPmhyZWYoKS5zdHJpbmcoKTsKKyAgICAgICAgaWYgKCFocmVmLmlzRW1wdHkoKSkg
eworICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gbGlua0VsZW1lbnQtPnRpdGxlKCk7CisKKyAg
ICAgICAgICAgIGlmIChXVEY6OmVxdWFsSWdub3JpbmdDYXNlKGxpbmtFbGVtZW50LT5yZWwoKSwg
ImFwcGxlLXRvdWNoLWljb24iKSkKKyAgICAgICAgICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5t
X2NsaWVudC0+c2V0TGFyZ2VJY29uKGhyZWYubGF0aW4xKCkuZGF0YSgpKTsKKyAgICAgICAgICAg
IGVsc2UgaWYgKFdURjo6ZXF1YWxJZ25vcmluZ0Nhc2UobGlua0VsZW1lbnQtPnJlbCgpLCAic2Vh
cmNoIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoV1RGOjplcXVhbElnbm9yaW5nQ2FzZShsaW5r
RWxlbWVudC0+dHlwZSgpLCAiYXBwbGljYXRpb24vb3BlbnNlYXJjaGRlc2NyaXB0aW9uK3htbCIp
KQorICAgICAgICAgICAgICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+c2V0U2Vh
cmNoUHJvdmlkZXJEZXRhaWxzKHRpdGxlLnV0ZjgoKS5kYXRhKCksIGhyZWYudXRmOCgpLmRhdGEo
KSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKFdURjo6ZXF1YWxJZ25vcmluZ0Nhc2UobGlua0Vs
ZW1lbnQtPnJlbCgpLCAiYWx0ZXJuYXRlIikKKyAgICAgICAgICAgICAgICAmJiAoV1RGOjplcXVh
bElnbm9yaW5nQ2FzZShsaW5rRWxlbWVudC0+dHlwZSgpLCAiYXBwbGljYXRpb24vcnNzK3htbCIp
CisgICAgICAgICAgICAgICAgfHwgV1RGOjplcXVhbElnbm9yaW5nQ2FzZShsaW5rRWxlbWVudC0+
dHlwZSgpLCAiYXBwbGljYXRpb24vYXRvbSt4bWwiKSkpCisgICAgICAgICAgICAgICAgbV93ZWJQ
YWdlUHJpdmF0ZS0+bV9jbGllbnQtPnNldEFsdGVybmF0ZUZlZWREZXRhaWxzKHRpdGxlLnV0Zjgo
KS5kYXRhKCksIGhyZWYudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3Zv
aWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZEZpbmlzaERvY3VtZW50
TG9hZCgpCit7CisgICAgaWYgKG1fd2ViUGFnZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUpCisg
ICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUtPmRpZEZpbmlzaERvY3Vt
ZW50TG9hZEZvckZyYW1lKG1fZnJhbWUpOworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKKwor
dm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkRmFpbExvYWQoY29u
c3QgUmVzb3VyY2VFcnJvciYgZXJyb3IpCit7CisgICAgZGlkRmluaXNoT3JGYWlsTG9hZGluZyhl
cnJvcik7CisgICAgaWYgKG1fd2ViUGFnZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUpCisgICAg
ICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUtPmRpZEZhaWxMb2FkRm9yRnJh
bWUobV9mcmFtZSk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaWRG
aW5pc2hPckZhaWxMb2FkaW5nKGNvbnN0IFJlc291cmNlRXJyb3ImIGVycm9yKQoreworICAgIC8v
IEZJWE1FOiBEbyB3ZSBuZWVkIHRvIGZpbmQgYSByZXBsYWNlbWVudCBmb3IgbV9mcmFtZS0+ZG9j
dW1lbnQoKS0+c2V0RXh0cmFMYXlvdXREZWxheSgwKTs/CisKKyAgICAvLyBJZiB3ZSBoYXZlIGZp
bmlzaGVkIGxvYWRpbmcgYSBwYWdlIHRocm91Z2ggaGlzdG9yeSBuYXZpZ2F0aW9uLCBhbnkKKyAg
ICAvLyBhdHRlbXB0IHRvIGdvIGJhY2sgdG8gdGhhdCBwYWdlIHRocm91Z2ggYW4gYXV0b21hdGlj
IHJlZGlyZWN0IHNob3VsZCBiZQorICAgIC8vIGRlbmllZCB0byBhdm9pZCByZWRpcmVjdCBsb29w
cy4gU28gc2F2ZSB0aGUgaGlzdG9yeSBuYXZpZ2F0aW9uIHVybHMgdG8KKyAgICAvLyBjaGVjayBs
YXRlci4gKElmIHRoaXMgd2FzIG5vdCBhIGhpc3RvcnkgbmF2aWdhdGlvbiwKKyAgICAvLyBtX2hp
c3RvcnlOYXZpZ2F0aW9uU291cmNlVVJMcyB3aWxsIGJlIGVtcHR5LCBhbmQgd2Ugc2hvdWxkIHNh
dmUgdGhhdAorICAgIC8vIHRvby4pCisgICAgbV9yZWRpcmVjdFVSTHNUb1NraXBEdWVUb0hpc3Rv
cnlOYXZpZ2F0aW9uLnN3YXAobV9oaXN0b3J5TmF2aWdhdGlvblNvdXJjZVVSTHMpOworCisgICAg
Ly8gSGlzdG9yeSBuYXZpZ2F0aW9uIGlzIGZpbmlzaGVkIHNvIGNsZWFyIHRoZSBoaXN0b3J5IG5h
dmlnYXRpb24gdXJsLgorICAgIG1faGlzdG9yeU5hdmlnYXRpb25Tb3VyY2VVUkxzLmNsZWFyKCk7
CisKKyAgICBpZiAoaXNNYWluRnJhbWUoKSkgeworICAgICAgICBtX2xvYWRFcnJvciA9IGVycm9y
OworICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5zZXRMb2FkU3RhdGUoZXJyb3IuaXNOdWxsKCkg
PyBXZWJQYWdlUHJpdmF0ZTo6RmluaXNoZWQgOiBXZWJQYWdlUHJpdmF0ZTo6RmFpbGVkKTsKKyAg
ICB9Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZEZh
aWxQcm92aXNpb25hbExvYWQoY29uc3QgUmVzb3VyY2VFcnJvciYgZXJyb3IpCit7CisgICAgaWYg
KGlzTWFpbkZyYW1lKCkpIHsKKyAgICAgICAgbV9sb2FkRXJyb3IgPSBlcnJvcjsKKyAgICAgICAg
bV93ZWJQYWdlUHJpdmF0ZS0+c2V0TG9hZFN0YXRlKFdlYlBhZ2VQcml2YXRlOjpGYWlsZWQpOwor
CisgICAgICAgIGlmIChlcnJvci5kb21haW4oKSA9PSBSZXNvdXJjZUVycm9yOjpwbGF0Zm9ybUVy
cm9yRG9tYWluCisgICAgICAgICAgICAgICAgJiYgKGVycm9yLmVycm9yQ29kZSgpID09IEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpGaWx0ZXJTdHJlYW06OlN0YXR1c0Vycm9yQWxyZWFkeUhhbmRsZWQp
KSB7CisgICAgICAgICAgICAvLyBFcnJvciBoYXMgYWxyZWFkeSBiZWVuIGRpc3BsYXllZCBieSBj
bGllbnQuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJy
b3IuZG9tYWluKCkuaXNFbXB0eSgpICYmICFlcnJvci5lcnJvckNvZGUoKSAmJiBlcnJvci5mYWls
aW5nVVJMKCkuaXNFbXB0eSgpICYmIGVycm9yLmxvY2FsaXplZERlc2NyaXB0aW9uKCkuaXNFbXB0
eSgpKSB7CisgICAgICAgICAgICAvLyBEb24ndCB0cnkgdG8gZGlzcGxheSBlbXB0eSBlcnJvcnMg
cmV0dXJuZWQgZnJvbSB0aGUgdW5pbXBsZW1lbnRlZCBlcnJvciBmdW5jdGlvbnMgaW4gRnJhbWVM
b2FkZXJDbGllbnRCbGFja0JlcnJ5IC0gdGhlcmUncyBub3RoaW5nIHRvIGRpc3BsYXkgYW55d2F5
LgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1fd2Vi
UGFnZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUpCisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUt
Pm1fZHVtcFJlbmRlclRyZWUtPmRpZEZhaWxQcm92aXNpb25hbExvYWRGb3JGcmFtZShtX2ZyYW1l
KTsKKworICAgIGlmICghaXNNYWluRnJhbWUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU3Ry
aW5nIGVycm9yUGFnZSA9IG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5nZXRFcnJvclBhZ2Uo
ZXJyb3IuZXJyb3JDb2RlKCkKKyAgICAgICAgICAgICwgZXJyb3IubG9jYWxpemVkRGVzY3JpcHRp
b24oKS5pc0VtcHR5KCkgPyAiIiA6IGVycm9yLmxvY2FsaXplZERlc2NyaXB0aW9uKCkudXRmOCgp
LmRhdGEoKQorICAgICAgICAgICAgLCBlcnJvci5mYWlsaW5nVVJMKCkuaXNFbXB0eSgpID8gIiIg
OiBlcnJvci5mYWlsaW5nVVJMKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICAvLyBNYWtlIHN1cmUg
d2UncmUgc3RpbGwgaW4gdGhlIHByb3Zpc2lvbmFsTG9hZCBzdGF0ZSAtIGdldEVycm9yUGFnZSBy
dW5zIGEKKyAgICAvLyBuZXN0ZWQgZXZlbnQgbG9vcCB3aGlsZSBpdCdzIHdhaXRpbmcgZm9yIGNs
aWVudCByZXNvdXJjZXMgdG8gbG9hZCBzbworICAgIC8vIHRoZXJlJ3MgYSBzbWFsbCB3aW5kb3cg
Zm9yIHRoZSB1c2VyIHRvIGhpdCBzdG9wLgorICAgIGlmIChtX2ZyYW1lLT5sb2FkZXIoKS0+cHJv
dmlzaW9uYWxEb2N1bWVudExvYWRlcigpKSB7CisgICAgICAgIFN1YnN0aXR1dGVEYXRhIGVycm9y
RGF0YSh1dGY4QnVmZmVyKGVycm9yUGFnZSksICJ0ZXh0L2h0bWwiLCAidXRmLTgiLCBLVVJMKEtV
UkwoKSwgZXJyb3IuZmFpbGluZ1VSTCgpKSk7CisKKyAgICAgICAgUmVzb3VyY2VSZXF1ZXN0IG9y
aWdpbmFsUmVxdWVzdCA9IG1fZnJhbWUtPmxvYWRlcigpLT5wcm92aXNpb25hbERvY3VtZW50TG9h
ZGVyKCktPm9yaWdpbmFsUmVxdWVzdCgpOworCisgICAgICAgIC8vIExvYWRpbmcgdXNpbmcgU3Vi
c3RpdHV0ZURhdGEgd2lsbCByZXBsYWNlIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHdpdGggb3VyCisg
ICAgICAgIC8vIGVycm9yIGRhdGEuIFRoaXMgbXVzdCBiZSBkb25lIHdpdGhpbiBkaXNwYXRjaERp
ZEZhaWxQcm92aXNpb25hbExvYWQsCisgICAgICAgIC8vIGFuZCBkbyBOT1QgY2FsbCBzdG9wQWxs
TG9hZGVycyBmaXJzdCwgYmVjYXVzZSB0aGUgbG9hZGVyIGNoZWNrcyB0aGUKKyAgICAgICAgLy8g
cHJvdmlzaW9uYWxEb2N1bWVudExvYWRlciB0byBkZWNpZGUgdGhlIGxvYWQgdHlwZTsgaWYgY2Fs
bGVkIGFueSBvdGhlcgorICAgICAgICAvLyB3YXksIHRoZSBlcnJvciBwYWdlIGlzIGFkZGVkIHRv
IHRoZSBlbmQgb2YgdGhlIGhpc3RvcnkgaW5zdGVhZCBvZgorICAgICAgICAvLyByZXBsYWNpbmcg
dGhlIGZhaWxlZCBsb2FkLgorICAgICAgICAvLworICAgICAgICAvLyBJZiB0aGlzIGNvbWVzIGZy
b20gYSBiYWNrL2ZvcndhcmQgbmF2aWdhdGlvbiwgd2UgbmVlZCB0byBzYXZlIHRoZSBjdXJyZW50
IHZpZXdzdGF0ZQorICAgICAgICAvLyB0byBvcmlnaW5hbCBoaXN0b3J5aXRlbSwgYW5kIHByZXZl
bnQgdGhlIHJlc3RvcmUgb2YgdmlldyBzdGF0ZSB0byB0aGUgZXJyb3IgcGFnZS4KKworICAgICAg
ICBpZiAoaXNCYWNrRm9yd2FyZExvYWRUeXBlKG1fZnJhbWUtPmxvYWRlcigpLT5sb2FkVHlwZSgp
KSkgeworICAgICAgICAgICAgbV9mcmFtZS0+bG9hZGVyKCktPmhpc3RvcnkoKS0+c2F2ZVNjcm9s
bFBvc2l0aW9uQW5kVmlld1N0YXRlVG9JdGVtKG1fZnJhbWUtPmxvYWRlcigpLT5oaXN0b3J5KCkt
PmN1cnJlbnRJdGVtKCkpOworICAgICAgICAgICAgQVNTRVJUKG1fZnJhbWUtPmxvYWRlcigpLT5o
aXN0b3J5KCktPnByb3Zpc2lvbmFsSXRlbSgpKTsKKyAgICAgICAgICAgIG1fZnJhbWUtPmxvYWRl
cigpLT5oaXN0b3J5KCktPnByb3Zpc2lvbmFsSXRlbSgpLT52aWV3U3RhdGUoKS5zaG91bGRTYXZl
Vmlld1N0YXRlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbV9sb2FkaW5nRXJyb3JQYWdl
ID0gdHJ1ZTsKKyAgICAgICAgbV9mcmFtZS0+bG9hZGVyKCktPmxvYWQob3JpZ2luYWxSZXF1ZXN0
LCBlcnJvckRhdGEsIGZhbHNlKTsKKyAgICB9Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5OjpkaXNwYXRjaFdpbGxTdWJtaXRGb3JtKEZyYW1lUG9saWN5RnVuY3Rpb24gZnVu
Y3Rpb24sIFBhc3NSZWZQdHI8Rm9ybVN0YXRlPikKK3sKKyAgICAvLyBGSVhNRTogU3R1Yi4KKyAg
ICAobV9mcmFtZS0+bG9hZGVyKCktPnBvbGljeUNoZWNrZXIoKS0+KmZ1bmN0aW9uKShQb2xpY3lV
c2UpOworfQorCitQYXNzUmVmUHRyPEZyYW1lPiBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6
OmNyZWF0ZUZyYW1lKGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiBuYW1lCisgICAgLCBI
VE1MRnJhbWVPd25lckVsZW1lbnQqIG93bmVyRWxlbWVudCwgY29uc3QgU3RyaW5nJiByZWZlcnJl
ciwgYm9vbCBhbGxvd3NTY3JvbGxpbmcsIGludCBtYXJnaW5XaWR0aCwgaW50IG1hcmdpbkhlaWdo
dCkKK3sKKyAgICBpZiAoIW1fd2ViUGFnZVByaXZhdGUpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgaWYgKG1fY2hpbGRGcmFtZUNyZWF0aW9uU3VwcHJlc3NlZCkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkqIGZyYW1lTG9hZGVyQ2xpZW50ID0g
bmV3IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeSgpOworICAgIFJlZlB0cjxGcmFtZT4gY2hp
bGRGcmFtZSA9IEZyYW1lOjpjcmVhdGUobV9mcmFtZS0+cGFnZSgpLCBvd25lckVsZW1lbnQsIGZy
YW1lTG9hZGVyQ2xpZW50KTsKKyAgICBmcmFtZUxvYWRlckNsaWVudC0+c2V0RnJhbWUoY2hpbGRG
cmFtZS5nZXQoKSwgbV93ZWJQYWdlUHJpdmF0ZSk7CisKKyAgICAvLyBJbml0aWFsaXplIEZyYW1l
Vmlldy4KKyAgICBSZWZQdHI8RnJhbWVWaWV3PiBmcmFtZVZpZXcgPSBGcmFtZVZpZXc6OmNyZWF0
ZShjaGlsZEZyYW1lLmdldCgpKTsKKyAgICBjaGlsZEZyYW1lLT5zZXRWaWV3KGZyYW1lVmlldy5n
ZXQoKSk7CisgICAgaWYgKCFhbGxvd3NTY3JvbGxpbmcpCisgICAgICAgIGZyYW1lVmlldy0+c2V0
U2Nyb2xsYmFyTW9kZXMoU2Nyb2xsYmFyQWx3YXlzT2ZmLCBTY3JvbGxiYXJBbHdheXNPZmYpOwor
ICAgIGlmIChtYXJnaW5XaWR0aCAhPSAtMSkKKyAgICAgICAgZnJhbWVWaWV3LT5zZXRNYXJnaW5X
aWR0aChtYXJnaW5XaWR0aCk7CisgICAgaWYgKG1hcmdpbkhlaWdodCAhPSAtMSkKKyAgICAgICAg
ZnJhbWVWaWV3LT5zZXRNYXJnaW5IZWlnaHQobWFyZ2luSGVpZ2h0KTsKKworICAgIGNoaWxkRnJh
bWUtPnRyZWUoKS0+c2V0TmFtZShuYW1lKTsKKyAgICBtX2ZyYW1lLT50cmVlKCktPmFwcGVuZENo
aWxkKGNoaWxkRnJhbWUpOworICAgIGNoaWxkRnJhbWUtPmluaXQoKTsKKworICAgIGlmICghY2hp
bGRGcmFtZS0+dHJlZSgpLT5wYXJlbnQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBCYWNr
aW5nU3RvcmVDbGllbnQ6OmNyZWF0ZShjaGlsZEZyYW1lLmdldCgpLCBtX2ZyYW1lLCBtX3dlYlBh
Z2VQcml2YXRlLT5tX3dlYlBhZ2UpOworCisgICAgbV9mcmFtZS0+bG9hZGVyKCktPmxvYWRVUkxJ
bnRvQ2hpbGRGcmFtZSh1cmwsIHJlZmVycmVyLCBjaGlsZEZyYW1lLmdldCgpKTsKKworICAgIGlm
ICghY2hpbGRGcmFtZS0+dHJlZSgpLT5wYXJlbnQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICByZXR1cm4gY2hpbGRGcmFtZS5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGll
bnRCbGFja0JlcnJ5OjpkaWRUcmFuc2ZlckNoaWxkRnJhbWVUb05ld0RvY3VtZW50KFBhZ2UqIC8q
b2xkUGFnZSovKQoreworICAgIFBhZ2UqIG5ld1BhZ2UgPSBtX2ZyYW1lLT5wYWdlKCk7CisgICAg
bV93ZWJQYWdlUHJpdmF0ZSA9IHN0YXRpY19jYXN0PENocm9tZUNsaWVudEJsYWNrQmVycnkqPihu
ZXdQYWdlLT5jaHJvbWUoKS0+Y2xpZW50KCkpLT53ZWJQYWdlUHJpdmF0ZSgpOworfQorCit2b2lk
IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6dHJhbnNmZXJMb2FkaW5nUmVzb3VyY2VGcm9t
UGFnZShSZXNvdXJjZUxvYWRlciosIGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIFBhZ2UqKQorewor
ICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK09iamVjdENvbnRlbnRUeXBlIEZyYW1lTG9hZGVy
Q2xpZW50QmxhY2tCZXJyeTo6b2JqZWN0Q29udGVudFR5cGUoY29uc3QgS1VSTCYgdXJsLCBjb25z
dCBTdHJpbmcmIG1pbWVUeXBlSW4sIGJvb2wgc2hvdWxkUHJlZmVyUGx1Z0luc0ZvckltYWdlcykK
K3sKKyAgICBTdHJpbmcgbWltZVR5cGUgPSBtaW1lVHlwZUluOworICAgIGlmIChtaW1lVHlwZS5p
c0VtcHR5KCkpCisgICAgICAgIG1pbWVUeXBlID0gTUlNRVR5cGVSZWdpc3RyeTo6Z2V0TUlNRVR5
cGVGb3JQYXRoKHVybC5wYXRoKCkpOworCisgICAgLy8gR2V0IG1hcHBlZCB0eXBlLgorICAgIG1p
bWVUeXBlID0gQmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJTZXR0aW5nczo6Z2V0Tm9ybWFsaXplZE1J
TUVUeXBlKG1pbWVUeXBlKTsKKworICAgIE9iamVjdENvbnRlbnRUeXBlIGRlZmF1bHRUeXBlID0g
RnJhbWVMb2FkZXI6OmRlZmF1bHRPYmplY3RDb250ZW50VHlwZSh1cmwsIG1pbWVUeXBlLCBzaG91
bGRQcmVmZXJQbHVnSW5zRm9ySW1hZ2VzKTsKKyAgICBpZiAoZGVmYXVsdFR5cGUgIT0gT2JqZWN0
Q29udGVudE5vbmUpCisgICAgICAgIHJldHVybiBkZWZhdWx0VHlwZTsKKworICAgIGlmIChCbGFj
a0JlcnJ5OjpXZWJLaXQ6OldlYlNldHRpbmdzOjppc1N1cHBvcnRlZE9iamVjdE1JTUVUeXBlKG1p
bWVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE9iamVjdENvbnRlbnRPdGhlclBsdWdpbjsKKworICAg
IHJldHVybiBPYmplY3RDb250ZW50Tm9uZTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJs
YWNrQmVycnk6OmRpc3BhdGNoV2lsbENsb3NlKCkKK3sKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5t
X2lucHV0SGFuZGxlci0+ZnJhbWVVbmxvYWRlZChtX2ZyYW1lKTsKK30KKwordm9pZCBGcmFtZUxv
YWRlckNsaWVudEJsYWNrQmVycnk6OnNldE1haW5Eb2N1bWVudEVycm9yKERvY3VtZW50TG9hZGVy
KiwgY29uc3QgUmVzb3VyY2VFcnJvciYgZXJyb3IpCit7CisgICAgaWYgKCFtX3BsdWdpblZpZXcp
CisgICAgICAgIHJldHVybjsKKworICAgIG1fcGx1Z2luVmlldy0+ZGlkRmFpbChlcnJvcik7Cisg
ICAgbV9wbHVnaW5WaWV3ID0gMDsKKyAgICBtX2hhc1NlbnRSZXNwb25zZVRvUGx1Z2luID0gZmFs
c2U7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpwb3N0UHJvZ3Jlc3NT
dGFydGVkTm90aWZpY2F0aW9uKCkKK3sKKyAgICBpZiAoIWlzTWFpbkZyYW1lKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIC8vIE5ldyBsb2FkIHN0YXJ0ZWQsIHNvIGNsZWFyIHRoZSBlcnJvci4K
KyAgICBtX2xvYWRFcnJvciA9IFJlc291cmNlRXJyb3IoKTsKKyAgICBtX3NlbnRSZWFkeVRvUmVu
ZGVyID0gZmFsc2U7CisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlmeUxvYWRT
dGFydGVkKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpwb3N0UHJv
Z3Jlc3NFc3RpbWF0ZUNoYW5nZWROb3RpZmljYXRpb24oKQoreworICAgIGlmICghaXNNYWluRnJh
bWUoKSB8fCAhbV9mcmFtZS0+cGFnZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3dlYlBh
Z2VQcml2YXRlLT5tX2NsaWVudC0+bm90aWZ5TG9hZFByb2dyZXNzKG1fZnJhbWUtPnBhZ2UoKS0+
cHJvZ3Jlc3MoKS0+ZXN0aW1hdGVkUHJvZ3Jlc3MoKSAqIDEwMCk7Cit9CisKK3ZvaWQgRnJhbWVM
b2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZEZpcnN0VmlzdWFsbHlOb25FbXB0eUxh
eW91dCgpCit7CisgICAgaWYgKCFpc01haW5GcmFtZSgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZl
bEluZm8sICJkaXNwYXRjaERpZEZpcnN0VmlzdWFsbHlOb25FbXB0eUxheW91dCIpOworCisgICAg
cmVhZHlUb1JlbmRlcih0cnVlKTsKKworICAgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgYmUgZ2V0
dGluZyBoZXJlIGlmIHdlIGFyZSBub3QgaW4gdGhlIENvbW1pdHRlZCBzdGF0ZSBidXQgd2UgYXJl
CisgICAgLy8gc28gd2UgY2FuIG5vdCBhc3NlcnQgb24gdGhhdCByaWdodCBub3cuIEJ1dCB3ZSBv
bmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBsb2FkLgorICAgIC8vIFJJTSBCdWcgIzU1NQorICAgIGlm
IChtX3dlYlBhZ2VQcml2YXRlLT5sb2FkU3RhdGUoKSA9PSBXZWJQYWdlUHJpdmF0ZTo6Q29tbWl0
dGVkKSB7CisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPnpvb21Ub0luaXRpYWxTY2FsZU9uTG9h
ZCgpOyAvLyBTZXQgdGhlIHByb3BlciB6b29tIGxldmVsIGZpcnN0LgorICAgICAgICBtX3dlYlBh
Z2VQcml2YXRlLT5tX2JhY2tpbmdTdG9yZS0+ZC0+Y2xlYXJWaXNpYmxlWm9vbSgpOyAvLyBDbGVh
ciB0aGUgdmlzaWJsZSB6b29tIHNpbmNlIHdlJ3JlIGV4cGxpY2l0bHkgcmVuZGVyaW5nK2JsaXR0
aW5nIGJlbG93LgorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2JhY2tpbmdTdG9yZS0+ZC0+
cmVuZGVyVmlzaWJsZUNvbnRlbnRzKCk7CisgICAgfQorCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+
bV9jbGllbnQtPm5vdGlmeUZpcnN0VmlzdWFsbHlOb25FbXB0eUxheW91dCgpOworfQorCit2b2lk
IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6cG9zdFByb2dyZXNzRmluaXNoZWROb3RpZmlj
YXRpb24oKQoreworICAgIGlmICghaXNNYWluRnJhbWUoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgLy8gRW1wdHkgcGFnZXMgd2lsbCBuZXZlciBoYXZlIGNhbGxlZAorICAgIC8vIGRpc3BhdGNo
RGlkRmlyc3RWaXN1YWxseU5vbkVtcHR5TGF5b3V0LCBzaW5jZSB0aGV5J3JlIHZpc3VhbGx5IGVt
cHR5LCBzbworICAgIC8vIHdlIG1heSBuZWVkIHRvIGNhbGwgcmVhZHlUb1JlbmRlciBub3cuCisg
ICAgcmVhZHlUb1JlbmRlcihmYWxzZSk7CisKKyAgICAvLyBGSVhNRTogU2VuZCB1cCBhIHJlYWwg
c3RhdHVzIGNvZGUuCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlmeUxvYWRG
aW5pc2hlZChtX2xvYWRFcnJvci5pc051bGwoKSA/IDAgOiAtMSk7CisKKyAgICAvLyBOb3RpZnkg
cGx1Z2lucyB0aGF0IGFyZSB3YWl0aW5nIGZvciB0aGUgcGFnZSB0byBmdWxseSBsb2FkIGJlZm9y
ZSBzdGFydGluZyB0aGF0CisgICAgLy8gdGhlIGxvYWQgaGFzIGNvbXBsZXRlZC4KKyAgICBtX3dl
YlBhZ2VQcml2YXRlLT5ub3RpZnlQYWdlT25Mb2FkKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJD
bGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZENsZWFyV2luZG93T2JqZWN0SW5Xb3JsZChET01X
cmFwcGVyV29ybGQqIHdvcmxkKQoreworICAgIGlmICh3b3JsZCAhPSBtYWluVGhyZWFkTm9ybWFs
V29ybGQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gUHJvdmlkZSB0aGUgZXh0ZW5zaW9u
IG9iamVjdCBmaXJzdCBpbiBjYXNlIHRoZSBjbGllbnQgb3Igb3RoZXJzIHdhbnQgdG8gdXNlIGl0
LgorICAgIC8vIEZJWE1FOiBDb25kaXRpb25hbGx5IGF0dGFjaCBleHRlbnNpb24gb2JqZWN0IGJh
c2VkIG9uIHNvbWUgZmxhZyBvciB3aGV0aGVyIG9yIG5vdCB3ZQorICAgIC8vIGFyZSBicm93c2Vy
IG9yIHNvbWV0aGluZyBlbHNlLgorICAgIGF0dGFjaEV4dGVuc2lvbk9iamVjdFRvRnJhbWUobV9m
cmFtZSwgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQpOworCisgICAgbV93ZWJQYWdlUHJpdmF0
ZS0+bV9jbGllbnQtPm5vdGlmeVdpbmRvd09iamVjdENsZWFyZWQoKTsKKworICAgIGlmIChtX3dl
YlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlKSB7CisgICAgICAgIEpTR2xvYmFsQ29udGV4
dFJlZiBjb250ZXh0ID0gdG9HbG9iYWxSZWYobV9mcmFtZS0+c2NyaXB0KCktPmdsb2JhbE9iamVj
dChtYWluVGhyZWFkTm9ybWFsV29ybGQoKSktPmdsb2JhbEV4ZWMoKSk7CisgICAgICAgIEpTT2Jq
ZWN0UmVmIHdpbmRvd09iamVjdCA9IHRvUmVmKG1fZnJhbWUtPnNjcmlwdCgpLT5nbG9iYWxPYmpl
Y3QobWFpblRocmVhZE5vcm1hbFdvcmxkKCkpKTsKKyAgICAgICAgQVNTRVJUKHdpbmRvd09iamVj
dCk7CisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUtPmRpZENsZWFy
V2luZG93T2JqZWN0SW5Xb3JsZCh3b3JsZCwgY29udGV4dCwgd2luZG93T2JqZWN0KTsKKyAgICB9
Cit9CisKK2Jvb2wgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpzaG91bGRHb1RvSGlzdG9y
eUl0ZW0oSGlzdG9yeUl0ZW0qKSBjb25zdAoreworICAgIHJldHVybiB0cnVlOworfQorCitib29s
IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6c2hvdWxkU3RvcExvYWRpbmdGb3JIaXN0b3J5
SXRlbShIaXN0b3J5SXRlbSopIGNvbnN0Cit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQg
RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjppbnZhbGlkYXRlQmFja0ZvcndhcmRMaXN0KCkg
Y29uc3QKK3sKKyAgICBub3RpZnlCYWNrRm9yd2FyZExpc3RDaGFuZ2VkKCk7Cit9CisKK3ZvaWQg
RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpub3RpZnlCYWNrRm9yd2FyZExpc3RDaGFuZ2Vk
KCkgY29uc3QKK3sKKyAgICBCYWNrRm9yd2FyZExpc3RJbXBsKiBiYWNrRm9yd2FyZExpc3QgPSBz
dGF0aWNfY2FzdDxCYWNrRm9yd2FyZExpc3RJbXBsKj4obV93ZWJQYWdlUHJpdmF0ZS0+bV9wYWdl
LT5iYWNrRm9yd2FyZCgpLT5jbGllbnQoKSk7CisgICAgQVNTRVJUKGJhY2tGb3J3YXJkTGlzdCk7
CisKKyAgICB1bnNpZ25lZCBsaXN0U2l6ZSA9IGJhY2tGb3J3YXJkTGlzdC0+ZW50cmllcygpLnNp
emUoKTsKKyAgICB1bnNpZ25lZCBjdXJyZW50SW5kZXggPSBiYWNrRm9yd2FyZExpc3QtPmJhY2tM
aXN0Q291bnQoKTsKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+cmVzZXRCYWNrRm9y
d2FyZExpc3QobGlzdFNpemUsIGN1cnJlbnRJbmRleCk7Cit9CisKK0ZyYW1lKiBGcmFtZUxvYWRl
ckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoQ3JlYXRlUGFnZShjb25zdCBOYXZpZ2F0aW9uQWN0
aW9uJiBuYXZpZ2F0aW9uKQoreworICAgIEJsYWNrQmVycnk6OldlYktpdDo6V2ViUGFnZSogd2Vi
UGFnZSA9IG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5jcmVhdGVXaW5kb3coMCwgMCwgLTEs
IC0xLCBCbGFja0JlcnJ5OjpXZWJLaXQ6OldlYlBhZ2VDbGllbnQ6OkZsYWdXaW5kb3dEZWZhdWx0
LCBuYXZpZ2F0aW9uLnVybCgpLnN0cmluZygpLCBXZWJTdHJpbmcoKSk7CisgICAgaWYgKCF3ZWJQ
YWdlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiB3ZWJQYWdlLT5kLT5tX3BhZ2Ut
Pm1haW5GcmFtZSgpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGV0
YWNoZWRGcm9tUGFyZW50MigpCit7CisgICAgQmFja2luZ1N0b3JlQ2xpZW50KiBiYWNraW5nU3Rv
cmVDbGllbnRGb3JGcmFtZSA9IG1fd2ViUGFnZVByaXZhdGUtPmJhY2tpbmdTdG9yZUNsaWVudEZv
ckZyYW1lKG1fZnJhbWUpOworICAgIGlmIChiYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZSkgewor
ICAgICAgICBkZWxldGUgYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWU7CisgICAgICAgIGJhY2tp
bmdTdG9yZUNsaWVudEZvckZyYW1lID0gMDsKKyAgICB9CisKKyAgICBpZiAobV9mcmFtZS0+ZG9j
dW1lbnQoKSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+Y2xlYXJEb2N1bWVudERhdGEobV9m
cmFtZS0+ZG9jdW1lbnQoKSk7CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2lucHV0SGFuZGxl
ci0+ZnJhbWVVbmxvYWRlZChtX2ZyYW1lKTsKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVu
dC0+bm90aWZ5RnJhbWVEZXRhY2hlZChtX2ZyYW1lKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNs
aWVudEJsYWNrQmVycnk6OmRpc3BhdGNoV2lsbFNlbmRSZXF1ZXN0KERvY3VtZW50TG9hZGVyKiBk
b2NMb2FkZXIsIGxvbmcgdW5zaWduZWQgaW50LCBSZXNvdXJjZVJlcXVlc3QmIHJlcXVlc3QsIGNv
bnN0IFJlc291cmNlUmVzcG9uc2UmKQoreworICAgIC8vIElmIHRoZSByZXF1ZXN0IGlzIGJlaW5n
IGxvYWRlZCBieSB0aGUgcHJvdmlzaW9uYWwgZG9jdW1lbnQgbG9hZGVyLCB0aGVuCisgICAgLy8g
aXQgaXMgYSBuZXcgdG9wIGxldmVsIHJlcXVlc3Qgd2hpY2ggaGFzIG5vdCBiZWVuIGNvbW1pdGVk
LgorICAgIGJvb2wgaXNNYWluUmVzb3VyY2VMb2FkID0gZG9jTG9hZGVyICYmIGRvY0xvYWRlciA9
PSBkb2NMb2FkZXItPmZyYW1lTG9hZGVyKCktPnByb3Zpc2lvbmFsRG9jdW1lbnRMb2FkZXIoKTsK
KworICAgIC8vIEFueSBwcm9jZXNzaW5nIHdoaWNoIGlzIGRvbmUgZm9yIGFsbCBsb2FkcyAoYm90
aCBtYWluIGFuZCBzdWJyZXNvdXJjZSkgc2hvdWxkIGdvIGhlcmUuCisgICAgQmxhY2tCZXJyeTo6
UGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0IHBsYXRmb3JtUmVxdWVzdDsKKyAgICByZXF1ZXN0Lmlu
aXRpYWxpemVQbGF0Zm9ybVJlcXVlc3QocGxhdGZvcm1SZXF1ZXN0LCBmYWxzZSAvKmlzSW5pdGlh
bCovKTsKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+cG9wdWxhdGVDdXN0b21IZWFk
ZXJzKHBsYXRmb3JtUmVxdWVzdCk7CisgICAgY29uc3QgQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5l
dHdvcmtSZXF1ZXN0OjpIZWFkZXJMaXN0JiBoZWFkZXJMaXN0cyA9IHBsYXRmb3JtUmVxdWVzdC5n
ZXRIZWFkZXJMaXN0UmVmKCk7CisgICAgZm9yIChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29y
a1JlcXVlc3Q6OkhlYWRlckxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaGVhZGVyTGlzdHMuYmVn
aW4oKTsgaXQgIT0gaGVhZGVyTGlzdHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgc3RkOjpzdHJp
bmcgaGVhZGVyU3RyaW5nID0gaXQtPmZpcnN0OworICAgICAgICBzdGQ6OnN0cmluZyBoZWFkZXJW
YWx1ZVN0cmluZyA9IGl0LT5zZWNvbmQ7CisgICAgICAgIHJlcXVlc3Quc2V0SFRUUEhlYWRlckZp
ZWxkKFN0cmluZyhoZWFkZXJTdHJpbmcuY19zdHIoKSksIFN0cmluZyhoZWFkZXJWYWx1ZVN0cmlu
Zy5jX3N0cigpKSk7CisgICAgfQorICAgIGlmIChjb29raWVzRW5hYmxlZCgpKSB7CisgICAgICAg
IFN0cmluZyBjb29raWVQYWlycyA9IGNvb2tpZU1hbmFnZXIoKS5nZXRDb29raWUocmVxdWVzdC51
cmwoKSwgV2l0aEh0dHBPbmx5Q29va2llcyk7CisgICAgICAgIGlmICghY29va2llUGFpcnMuaXNF
bXB0eSgpKSB7CisgICAgICAgICAgICAvLyBXZSBvbmx5IG1vZGlmeSB0aGUgV2ViQ29yZSByZXF1
ZXN0IHRvIG1ha2UgdGhlIGNvb2tpZXMgdmlzaWJsZSBpbiBpbnNwZWN0b3IuCisgICAgICAgICAg
ICByZXF1ZXN0LnNldEhUVFBIZWFkZXJGaWVsZChTdHJpbmcoIkNvb2tpZSIpLCBjb29raWVQYWly
cyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFpc01haW5SZXNvdXJjZUxvYWQpIHsKKyAg
ICAgICAgLy8gRG8gbm90aGluZyBmb3Igbm93LgorICAgICAgICAvLyBBbnkgcHJvY2Vzc2luZyB3
aGljaCBpcyBkb25lIG9ubHkgZm9yIHN1YnJlc291cmNlcyBzaG91bGQgZ28gaGVyZS4KKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEFsbCBwcm9jZXNzaW5nIGJleW9uZCB0aGlzIHBv
aW50IGlzIGRvbmUgb25seSBmb3IgbWFpbiByZXNvdXJjZSBsb2Fkcy4KKworICAgIGlmIChtX2Ns
aWVudFJlZGlyZWN0SXNQZW5kaW5nICYmIGlzTWFpbkZyYW1lKCkpIHsKKyAgICAgICAgU3RyaW5n
IG9yaWdpbmFsVXJsID0gbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCkuc3RyaW5nKCk7CisgICAg
ICAgIFN0cmluZyBmaW5hbFVybCA9IHJlcXVlc3QudXJsKCkuc3RyaW5nKCk7CisKKyAgICAgICAg
bV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlmeUNsaWVudFJlZGlyZWN0KG9yaWdpbmFs
VXJsLmNoYXJhY3RlcnMoKSwgb3JpZ2luYWxVcmwubGVuZ3RoKCksCisgICAgICAgICAgICBmaW5h
bFVybC5jaGFyYWN0ZXJzKCksIGZpbmFsVXJsLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICAvLyBG
SVhNRTogVXBkYXRlIHRoZSByZXF1ZXN0IHR5cGUuIFNlZSBQUiAjMTE5NzkyLgorICAgIGlmIChk
b2NMb2FkZXItPmZyYW1lTG9hZGVyKCktPmlzTG9hZGluZ01haW5GcmFtZSgpKQorICAgICAgICBy
ZXF1ZXN0LnNldFRhcmdldFR5cGUoUmVzb3VyY2VSZXF1ZXN0OjpUYXJnZXRJc01haW5GcmFtZSk7
CisgICAgZWxzZQorICAgICAgICByZXF1ZXN0LnNldFRhcmdldFR5cGUoUmVzb3VyY2VSZXF1ZXN0
OjpUYXJnZXRJc1N1YmZyYW1lKTsKKworICAgIEZyYW1lTG9hZGVyKiBsb2FkZXIgPSBtX2ZyYW1l
LT5sb2FkZXIoKTsKKyAgICBBU1NFUlQobG9hZGVyKTsKKyAgICBpZiAoaXNCYWNrRm9yd2FyZExv
YWRUeXBlKGxvYWRlci0+bG9hZFR5cGUoKSkpIHsKKyAgICAgICAgLy8gRG8gbm90IHVzZSB0aGUg
cGFzc2VkIERvY3VtZW50TG9hZGVyIGJlY2F1c2UgaXQgaXMgdGhlIGxvYWRlciB0aGF0CisgICAg
ICAgIC8vIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5ldyByZXF1ZXN0ICh0aGUgREVTVElOQVRJT04g
b2YgdGhlIGhpc3RvcnkKKyAgICAgICAgLy8gbmF2aWdhdGlvbiAtIHdlIHdhbnQgdG8gdXNlIHRo
ZSBjdXJyZW50IERvY3VtZW50TG9hZGVyIHRvIHJlY29yZCB0aGUKKyAgICAgICAgLy8gU09VUkNF
KS4KKyAgICAgICAgRG9jdW1lbnRMb2FkZXIqIGRvY0xvYWRlciA9IG1fZnJhbWUtPmxvYWRlcigp
LT5kb2N1bWVudExvYWRlcigpOworICAgICAgICBBU1NFUlQoZG9jTG9hZGVyKTsKKyAgICAgICAg
bV9oaXN0b3J5TmF2aWdhdGlvblNvdXJjZVVSTHMuYWRkKGRvY0xvYWRlci0+dXJsKCkpOworICAg
ICAgICBtX2hpc3RvcnlOYXZpZ2F0aW9uU291cmNlVVJMcy5hZGQoZG9jTG9hZGVyLT5vcmlnaW5h
bFVSTCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojps
b2FkSWNvbkV4dGVybmFsbHkoY29uc3QgU3RyaW5nJiBvcmlnaW5hbFBhZ2VVcmwsIGNvbnN0IFN0
cmluZyYgZmluYWxQYWdlVXJsLCBjb25zdCBTdHJpbmcmIGljb25VcmwpCit7CisgICAgbV93ZWJQ
YWdlUHJpdmF0ZS0+bV9jbGllbnQtPnNldEljb25Gb3JVcmwob3JpZ2luYWxQYWdlVXJsLnV0Zjgo
KS5kYXRhKCksIGZpbmFsUGFnZVVybC51dGY4KCkuZGF0YSgpLCBpY29uVXJsLnV0ZjgoKS5kYXRh
KCkpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6c2F2ZVZpZXdTdGF0
ZVRvSXRlbShIaXN0b3J5SXRlbSogaXRlbSkKK3sKKyAgICBpZiAoIWlzTWFpbkZyYW1lKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIEFTU0VSVChpdGVtKTsKKyAgICBIaXN0b3J5SXRlbVZpZXdT
dGF0ZSYgdmlld1N0YXRlID0gaXRlbS0+dmlld1N0YXRlKCk7CisgICAgaWYgKHZpZXdTdGF0ZS5z
aG91bGRTYXZlVmlld1N0YXRlKSB7CisgICAgICAgIHZpZXdTdGF0ZS5vcmllbnRhdGlvbiA9IG1f
d2ViUGFnZVByaXZhdGUtPm1haW5GcmFtZSgpLT5vcmllbnRhdGlvbigpOworICAgICAgICB2aWV3
U3RhdGUuaXNab29tVG9GaXRTY2FsZSA9IG1fd2ViUGFnZVByaXZhdGUtPmN1cnJlbnRTY2FsZSgp
ID09IG1fd2ViUGFnZVByaXZhdGUtPnpvb21Ub0ZpdFNjYWxlKCk7CisgICAgICAgIHZpZXdTdGF0
ZS5zY2FsZSA9IG1fd2ViUGFnZVByaXZhdGUtPmN1cnJlbnRTY2FsZSgpOworICAgICAgICB2aWV3
U3RhdGUuc2hvdWxkUmVmbG93QmxvY2sgPSBtX3dlYlBhZ2VQcml2YXRlLT5tX3Nob3VsZFJlZmxv
d0Jsb2NrOworICAgIH0KK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OnJl
c3RvcmVWaWV3U3RhdGUoKQoreworICAgIGlmICghaXNNYWluRnJhbWUoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgSGlzdG9yeUl0ZW0qIGN1cnJlbnRJdGVtID0gbV9mcmFtZS0+bG9hZGVyKCkt
Pmhpc3RvcnkoKS0+Y3VycmVudEl0ZW0oKTsKKyAgICBBU1NFUlQoY3VycmVudEl0ZW0pOworCisg
ICAgaWYgKCFjdXJyZW50SXRlbSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gV2ViUGFnZVBy
aXZhdGUgaXMgbWVzc2luZyB1cCBGcmFtZVZpZXc6Ondhc1Njcm9sbGVkQnlVc2VyKCkgYnkgc2Vu
ZGluZworICAgIC8vIHNjcm9sbCBldmVudHMgdGhhdCBsb29rIGxpa2UgdGhleSB3ZXJlIHVzZXIg
Z2VuZXJhdGVkIGFsbCB0aGUgdGltZS4KKyAgICAvLworICAgIC8vIEV2ZW4gaWYgdGhlIHVzZXIg
ZGlkIG5vdCBzY3JvbGwsIEZyYW1lVmlldyBpcyBnb25uYSB0aGluayB0aGV5IGRpZC4KKyAgICAv
LyBTbyB3ZSB1c2Ugb3VyIG93biBib29ra2VlcGluZyBjb2RlIHRvIGtlZXAgdHJhY2sgb2Ygd2hl
dGhlciB3ZSB3ZXJlCisgICAgLy8gYWN0dWFsbHkgc2Nyb2xsZWQgYnkgdGhlIHVzZXIgZHVyaW5n
IGxvYWQuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgdXNlciBkaWQgc2Nyb2xsIHRob3VnaCwgYWxs
IGFyZSBnb2luZyB0byBiZSBpbiBhZ3JlZW1lbnQgYWJvdXQKKyAgICAvLyB0aGF0LCBhbmQgdGhl
IHdvcnN0IHRoaW5nIHRoYXQgY291bGQgaGFwcGVuIGlzIHRoYXQKKyAgICAvLyBIaXN0b3J5Q29u
dHJvbGxlcjo6cmVzdG9yZVNjcm9sbFBvc2l0aW9uQW5kVmlld1N0YXRlIGNhbGxzCisgICAgLy8g
c2V0U2Nyb2xsUG9zaXRpb24gd2l0aCB0aGUgdGhlIHNhbWUgcG9pbnQsIHdoaWNoIGlzIGEgTk9P
UC4KKyAgICBJbnRTaXplIGNvbnRlbnRzU2l6ZSA9IGN1cnJlbnRJdGVtLT5jb250ZW50c1NpemUo
KTsKKyAgICBJbnRQb2ludCBzY3JvbGxQb3NpdGlvbiA9IGN1cnJlbnRJdGVtLT5zY3JvbGxQb2lu
dCgpOworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX3VzZXJQZXJmb3JtZWRNYW51YWxTY3Jv
bGwpCisgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gbV93ZWJQYWdlUHJpdmF0ZS0+c2Nyb2xsUG9z
aXRpb24oKTsKKworICAgIC8vIFdlIG5lZWQgdG8gcmVzZXQgdGhpcyB2YXJpYWJsZSBhZnRlciB0
aGUgdmlldyBzdGF0ZSBoYXMgYmVlbiByZXN0b3JlZC4KKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5t
X2RpZFJlc3RvcmVGcm9tUGFnZUNhY2hlID0gZmFsc2U7CisgICAgSGlzdG9yeUl0ZW1WaWV3U3Rh
dGUmIHZpZXdTdGF0ZSA9IGN1cnJlbnRJdGVtLT52aWV3U3RhdGUoKTsKKworICAgIC8vIEFsc28s
IHRyeSB0byBrZWVwIHRoZSB1c2VycyB6b29tIGlmIGFueS4KKyAgICBkb3VibGUgc2NhbGUgPSB2
aWV3U3RhdGUuc2NhbGU7CisgICAgYm9vbCBzaG91bGRSZWZsb3dCbG9jayA9IHZpZXdTdGF0ZS5z
aG91bGRSZWZsb3dCbG9jazsKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV91c2VyUGVyZm9y
bWVkTWFudWFsWm9vbSkgeworICAgICAgICBzY2FsZSA9IG1fd2ViUGFnZVByaXZhdGUtPmN1cnJl
bnRTY2FsZSgpOworICAgICAgICBzaG91bGRSZWZsb3dCbG9jayA9IG1fd2ViUGFnZVByaXZhdGUt
Pm1fc2hvdWxkUmVmbG93QmxvY2s7CisgICAgfQorCisgICAgYm9vbCBzY3JvbGxDaGFuZ2VkID0g
c2Nyb2xsUG9zaXRpb24gIT0gbV93ZWJQYWdlUHJpdmF0ZS0+c2Nyb2xsUG9zaXRpb24oKTsKKyAg
ICBib29sIHNjYWxlQ2hhbmdlZCA9IHNjYWxlICE9IG1fd2ViUGFnZVByaXZhdGUtPmN1cnJlbnRT
Y2FsZSgpOworICAgIGJvb2wgcmVmbG93Q2hhbmdlZCA9IHNob3VsZFJlZmxvd0Jsb2NrICE9IG1f
d2ViUGFnZVByaXZhdGUtPm1fc2hvdWxkUmVmbG93QmxvY2s7CisgICAgYm9vbCBvcmllbnRhdGlv
bkNoYW5nZWQgPSB2aWV3U3RhdGUub3JpZW50YXRpb24gJSAxODAgIT0gbV93ZWJQYWdlUHJpdmF0
ZS0+bWFpbkZyYW1lKCktPm9yaWVudGF0aW9uKCkgJSAxODA7CisKKyAgICBpZiAoIXNjcm9sbENo
YW5nZWQgJiYgIXNjYWxlQ2hhbmdlZCAmJiAhcmVmbG93Q2hhbmdlZCAmJiAhb3JpZW50YXRpb25D
aGFuZ2VkKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBXaGVuIHJvdGF0ZSBoYXBwZW5zLCBv
bmx5IHpvb20gd2hlbiBwcmV2aW91cyBwYWdlIHdhcyB6b29tVG9GaXRTY2FsZSwgb3RoZXJ3aXNl
IGtlZXAgb2xkIHNjYWxlLgorICAgIGlmIChvcmllbnRhdGlvbkNoYW5nZWQgJiYgdmlld1N0YXRl
LmlzWm9vbVRvRml0U2NhbGUpCisgICAgICAgIHNjYWxlID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkdyYXBoaWNzOjpTY3JlZW46OndpZHRoKCkgKiBzY2FsZSAvIHN0YXRpY19jYXN0PGRvdWJsZT4o
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OmhlaWdodCgpKTsKKyAgICBt
X3dlYlBhZ2VQcml2YXRlLT5tX2JhY2tpbmdTdG9yZS0+ZC0+c3VzcGVuZFNjcmVlbkFuZEJhY2tp
bmdTdG9yZVVwZGF0ZXMoKTsgLy8gZG9uJ3QgZmxhc2ggY2hlY2tlcmJvYXJkIGZvciB0aGUgc2V0
U2Nyb2xsUG9zaXRpb24gY2FsbAorICAgIG1fZnJhbWUtPnZpZXcoKS0+c2V0Q29udGVudHNTaXpl
RnJvbUhpc3RvcnkoY29udGVudHNTaXplKTsKKworICAgIC8vIEhlcmUgd2UgbmVlZCB0byBzZXQg
c2Nyb2xsIHBvc2l0aW9uIHdoYXQgd2UgYXNrZWQgZm9yLgorICAgIC8vIFNvIHdlIHVzZSBTY3Jv
bGxWaWV3OjpzZXRDYW5PdmVyc2Nyb2xsKHRydWUpLgorICAgIGJvb2wgb2xkQ2FuT3ZlcnNjcm9s
bCA9IG1fZnJhbWUtPnZpZXcoKS0+Y2FuT3ZlclNjcm9sbCgpOworICAgIG1fZnJhbWUtPnZpZXco
KS0+c2V0Q2FuT3ZlcnNjcm9sbCh0cnVlKTsKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5zZXRTY3Jv
bGxQb3NpdGlvbihzY3JvbGxQb3NpdGlvbik7CisgICAgbV9mcmFtZS0+dmlldygpLT5zZXRDYW5P
dmVyc2Nyb2xsKG9sZENhbk92ZXJzY3JvbGwpOworCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9z
aG91bGRSZWZsb3dCbG9jayA9IHZpZXdTdGF0ZS5zaG91bGRSZWZsb3dCbG9jazsKKworICAgIC8v
IFdpbGwgcmVzdG9yZSB1cGRhdGVzIHRvIGJhY2tpbmdzdG9yZSBndWFyYW50ZWVkIQorICAgIGlm
ICghbV93ZWJQYWdlUHJpdmF0ZS0+em9vbUFib3V0UG9pbnQoc2NhbGUsIG1fZnJhbWUtPnZpZXco
KS0+c2Nyb2xsUG9zaXRpb24oKSwgdHJ1ZSAvKiBlbmZvcmNlU2NhbGVDbGFtcGluZyAqLywgdHJ1
ZSAvKmZvcmNlUmVuZGVyaW5nKi8sIHRydWUgLyppc1Jlc3RvcmluZ1pvb21MZXZlbCovKSkgewor
ICAgICAgICAvLyBJZiB3ZSdyZSBhbHJlYWR5IGF0IHRoYXQgc2NhbGUsIHRoZW4gd2Ugc2hvdWxk
IHN0aWxsIGZvcmNlIHJlbmRlcmluZyBzaW5jZQorICAgICAgICAvLyBvdXIgc2Nyb2xsIHBvc2l0
aW9uIGNoYW5nZWQuCisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fYmFja2luZ1N0b3JlLT5k
LT5yZW5kZXJWaXNpYmxlQ29udGVudHMoKTsKKworICAgICAgICAvLyBXZSBuZWVkIHRvIG5vdGlm
eSB0aGUgY2xpZW50IG9mIHRoZSBzY3JvbGwgcG9zaXRpb24gYW5kIGNvbnRlbnQgc2l6ZSBjaGFu
Z2UocykgYWJvdmUgZXZlbiBpZiB3ZSBkaWRuJ3Qgc2NhbGUuCisgICAgICAgIG1fd2ViUGFnZVBy
aXZhdGUtPm5vdGlmeVRyYW5zZm9ybWVkQ29udGVudHNTaXplQ2hhbmdlZCgpOworICAgICAgICBt
X3dlYlBhZ2VQcml2YXRlLT5ub3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQoKTsKKyAgICB9
Cit9CisKK1BvbGljeUFjdGlvbiBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRlY2lkZVBv
bGljeUZvckV4dGVybmFsTG9hZChjb25zdCBSZXNvdXJjZVJlcXVlc3QmIHJlcXVlc3QsIGJvb2wg
aXNGcmFnbWVudFNjcm9sbCkKK3sKKyAgICBjb25zdCBLVVJMJiB1cmwgPSByZXF1ZXN0LnVybCgp
OworICAgIFN0cmluZyBwYXR0ZXJuID0gbV93ZWJQYWdlUHJpdmF0ZS0+ZmluZFBhdHRlcm5TdHJp
bmdGb3JVcmwodXJsKTsKKyAgICBpZiAoIXBhdHRlcm4uaXNFbXB0eSgpKSB7CisgICAgICAgIG1f
d2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5oYW5kbGVTdHJpbmdQYXR0ZXJuKHBhdHRlcm4uY2hh
cmFjdGVycygpLCBwYXR0ZXJuLmxlbmd0aCgpKTsKKyAgICAgICAgcmV0dXJuIFBvbGljeUlnbm9y
ZTsKKyAgICB9CisKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV93ZWJTZXR0aW5ncy0+YXJl
TGlua3NIYW5kbGVkRXh0ZXJuYWxseSgpCisgICAgICAgICAgICAmJiBpc01haW5GcmFtZSgpCisg
ICAgICAgICAgICAmJiAhcmVxdWVzdC5tdXN0SGFuZGxlSW50ZXJuYWxseSgpCisgICAgICAgICAg
ICAmJiAhaXNGcmFnbWVudFNjcm9sbCkgeworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
TmV0d29ya1JlcXVlc3QgcGxhdGZvcm1SZXF1ZXN0OworICAgICAgICByZXF1ZXN0LmluaXRpYWxp
emVQbGF0Zm9ybVJlcXVlc3QocGxhdGZvcm1SZXF1ZXN0KTsKKyAgICAgICAgbV93ZWJQYWdlUHJp
dmF0ZS0+bV9jbGllbnQtPmhhbmRsZUV4dGVybmFsTGluayhwbGF0Zm9ybVJlcXVlc3QsIHJlcXVl
c3QuYW5jaG9yVGV4dCgpLmNoYXJhY3RlcnMoKSwgcmVxdWVzdC5hbmNob3JUZXh0KCkubGVuZ3Ro
KCksIG1fY2xpZW50UmVkaXJlY3RJc1BlbmRpbmcpOworICAgICAgICByZXR1cm4gUG9saWN5SWdu
b3JlOworICAgIH0KKworICAgIHJldHVybiBQb2xpY3lVc2U7Cit9CisKK3ZvaWQgRnJhbWVMb2Fk
ZXJDbGllbnRCbGFja0JlcnJ5Ojp3aWxsRGVmZXJMb2FkaW5nKCkKK3sKKyAgICBtX2RlZmVycmVk
Sm9ic1RpbWVyLT5zdG9wKCk7CisKKyAgICBpZiAoIWlzTWFpbkZyYW1lKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIG1fd2ViUGFnZVByaXZhdGUtPndpbGxEZWZlckxvYWRpbmcoKTsKK30KKwor
dm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpZFJlc3VtZUxvYWRpbmcoKQorewor
ICAgIGlmICghbV9kZWZlcnJlZE1hbnVhbFNjcmlwdC5pc051bGwoKSkKKyAgICAgICAgbV9kZWZl
cnJlZEpvYnNUaW1lci0+c3RhcnRPbmVTaG90KDApOworCisgICAgaWYgKCFpc01haW5GcmFtZSgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5kaWRSZXN1bWVMb2Fk
aW5nKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpzZXREZWZlcnJl
ZE1hbnVhbFNjcmlwdChjb25zdCBLVVJMJiBzY3JpcHQpCit7CisgICAgQVNTRVJUKCFtX2RlZmVy
cmVkSm9ic1RpbWVyLT5pc0FjdGl2ZSgpKTsKKyAgICBtX2RlZmVycmVkTWFudWFsU2NyaXB0ID0g
c2NyaXB0OworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGVmZXJyZWRK
b2JzVGltZXJGaXJlZChUaW1lcjxGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk+KikKK3sKKyAg
ICBBU1NFUlQoIW1fZnJhbWUtPnBhZ2UoKS0+ZGVmZXJzTG9hZGluZygpKTsKKworICAgIGlmICgh
bV9kZWZlcnJlZE1hbnVhbFNjcmlwdC5pc051bGwoKSkgeworICAgICAgICAvLyBFeGVjdXRpbmcg
dGhlIHNjcmlwdCB3aWxsIHNldCBkZWZlcnJlZCBsb2FkaW5nLCB3aGljaCBjb3VsZCB0cmlnZ2Vy
IHRoaXMgdGltZXIgYWdhaW4gaWYgYSBzY3JpcHQgaXMgc2V0LiBTbyBjbGVhciB0aGUgc2NyaXB0
IGZpcnN0LgorICAgICAgICBLVVJMIHNjcmlwdCA9IG1fZGVmZXJyZWRNYW51YWxTY3JpcHQ7Cisg
ICAgICAgIG1fZGVmZXJyZWRNYW51YWxTY3JpcHQgPSBLVVJMKCk7CisKKyAgICAgICAgbV9mcmFt
ZS0+c2NyaXB0KCktPmV4ZWN1dGVJZkphdmFTY3JpcHRVUkwoc2NyaXB0KTsKKyAgICB9CisKKyAg
ICBBU1NFUlQoIW1fZnJhbWUtPnBhZ2UoKS0+ZGVmZXJzTG9hZGluZygpKTsKK30KKwordm9pZCBG
cmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OnJlYWR5VG9SZW5kZXIoYm9vbCBwYWdlSXNWaXN1
YWxseU5vbkVtcHR5KQoreworICAgIC8vIE9ubHkgc2VuZCB0aGUgbm90aWZpY2F0aW9uIG9uY2Uu
CisgICAgaWYgKCFtX3NlbnRSZWFkeVRvUmVuZGVyKSB7CisgICAgICAgIG1fd2ViUGFnZVByaXZh
dGUtPm1fY2xpZW50LT5ub3RpZnlMb2FkUmVhZHlUb1JlbmRlcihwYWdlSXNWaXN1YWxseU5vbkVt
cHR5KTsKKyAgICAgICAgbV9zZW50UmVhZHlUb1JlbmRlciA9IHRydWU7CisgICAgfQorfQorCitQ
YXNzUmVmUHRyPEZyYW1lTmV0d29ya2luZ0NvbnRleHQ+IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tC
ZXJyeTo6Y3JlYXRlTmV0d29ya2luZ0NvbnRleHQoKQoreworICAgIHJldHVybiBGcmFtZU5ldHdv
cmtpbmdDb250ZXh0QmxhY2tCZXJyeTo6Y3JlYXRlKG1fZnJhbWUpOworfQorCit2b2lkIEZyYW1l
TG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6YXV0aGVudGljYXRpb25DaGFsbGVuZ2UoY29uc3QgU3Ry
aW5nJiByZWFsbSwgU3RyaW5nJiB1c2VybmFtZSwgU3RyaW5nJiBwYXNzd29yZCkKK3sKKyAgICBX
ZWJTdHJpbmcgd2ViUGFnZVVzZXJuYW1lOworICAgIFdlYlN0cmluZyB3ZWJQYWdlUGFzc3dvcmQ7
CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+YXV0aGVudGljYXRpb25DaGFsbGVu
Z2UocmVhbG0uY2hhcmFjdGVycygpLCByZWFsbS5sZW5ndGgoKSwgd2ViUGFnZVVzZXJuYW1lLCB3
ZWJQYWdlUGFzc3dvcmQpOworCisgICAgdXNlcm5hbWUgPSB3ZWJQYWdlVXNlcm5hbWU7CisgICAg
cGFzc3dvcmQgPSB3ZWJQYWdlUGFzc3dvcmQ7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5OjpzdGFydERvd25sb2FkKGNvbnN0IFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCwg
Y29uc3QgU3RyaW5nJiAvKnN1Z2dlc3RlZE5hbWUqLykKK3sKKyAgICAvLyBGSVhNRTogdXNlIHRo
ZSBzdWdnZXN0ZWROYW1lPworICAgIG1fd2ViUGFnZVByaXZhdGUtPmxvYWQocmVxdWVzdC51cmwo
KS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpLCAwLCAiR0VUIiwgQmxhY2tCZXJyeTo6UGxhdGZvcm06
Ok5ldHdvcmtSZXF1ZXN0OjpVc2VQcm90b2NvbENhY2hlUG9saWN5LCAwLCAwLCAwLCAwLCBmYWxz
ZSwgZmFsc2UsIHRydWUsICIiKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVy
cnk6OmRvd25sb2FkKFJlc291cmNlSGFuZGxlKiBoYW5kbGUsIGNvbnN0IFJlc291cmNlUmVxdWVz
dCYsIGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIGNvbnN0IFJlc291cmNlUmVzcG9uc2UmIHIpCit7
CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkZpbHRlclN0cmVhbSogc3RyZWFtID0gTmV0d29y
a01hbmFnZXI6Omluc3RhbmNlKCktPnN0cmVhbUZvckhhbmRsZShoYW5kbGUpOworICAgIEFTU0VS
VChzdHJlYW0pOworCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPmRvd25sb2FkUmVx
dWVzdGVkKHN0cmVhbSwgci5zdWdnZXN0ZWRGaWxlbmFtZSgpKTsKK30KKwordm9pZCBGcmFtZUxv
YWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkUmVjZWl2ZUljb24oKQoreworICAgIFN0
cmluZyB1cmwgPSBtX2ZyYW1lLT5kb2N1bWVudCgpLT51cmwoKS5zdHJpbmcoKTsKKyAgICBJbWFn
ZSogaW1nID0gaWNvbkRhdGFiYXNlKCkuc3luY2hyb25vdXNJY29uRm9yUGFnZVVSTCh1cmwsIElu
dFNpemUoMTAsIDEwKSk7CisgICAgaWYgKCFpbWcgfHwgIWltZy0+ZGF0YSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBOYXRpdmVJbWFnZVNraWEqIGJpdG1hcCA9IGltZy0+bmF0aXZlSW1hZ2VG
b3JDdXJyZW50RnJhbWUoKTsKKyAgICBpZiAoIWJpdG1hcCkKKyAgICAgICAgcmV0dXJuOworICAg
IGJpdG1hcC0+bG9ja1BpeGVscygpOworICAgIFN0cmluZyBpY29uVXJsID0gaWNvbkRhdGFiYXNl
KCkuc3luY2hyb25vdXNJY29uVVJMRm9yUGFnZVVSTCh1cmwpOworICAgIG1fd2ViUGFnZVByaXZh
dGUtPm1fY2xpZW50LT5zZXRGYXZpY29uKGltZy0+d2lkdGgoKSwgaW1nLT5oZWlnaHQoKSwgKHVu
c2lnbmVkIGNoYXIqKWJpdG1hcC0+Z2V0UGl4ZWxzKCksIGljb25VcmwudXRmOCgpLmRhdGEoKSk7
CisgICAgYml0bWFwLT51bmxvY2tQaXhlbHMoKTsKK30KKworYm9vbCBGcmFtZUxvYWRlckNsaWVu
dEJsYWNrQmVycnk6OmNhbkNhY2hlUGFnZSgpIGNvbnN0Cit7CisgICAgLy8gV2Ugd29uJ3QgY2Fj
aGUgcGFnZXMgY29udGFpbmluZyB2aWRlbyBvciBhdWRpby4KKyAgICBBU1NFUlQobV9mcmFtZS0+
ZG9jdW1lbnQoKSk7CisgICAgUmVmUHRyPE5vZGVMaXN0PiBub2RlTGlzdCA9IG1fZnJhbWUtPmRv
Y3VtZW50KCktPmdldEVsZW1lbnRzQnlUYWdOYW1lKEhUTUxOYW1lczo6dmlkZW9UYWcubG9jYWxO
YW1lKCkpOworICAgIGlmIChub2RlTGlzdC5nZXQoKS0+bGVuZ3RoKCkgPiAwKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgbm9kZUxpc3QgPSBtX2ZyYW1lLT5kb2N1bWVudCgpLT5nZXRFbGVt
ZW50c0J5VGFnTmFtZShIVE1MTmFtZXM6OmF1ZGlvVGFnLmxvY2FsTmFtZSgpKTsKKyAgICBpZiAo
bm9kZUxpc3QuZ2V0KCktPmxlbmd0aCgpID4gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgLy8gVGhlIG11bHRpcGFydCBvZiAibXVsdGlwYXJ0L3gtbWl4ZWQtcmVwbGFjZSIgb25seSBz
dXBwb3J0cyBpbWFnZSwgY29ycmVjdD8KKyAgICAvLyBGSVhNRTogRG8gd2UgaGF2ZSBhIGJldHRl
ciBwbGFjZSB0byBoYW5kbGUgdGhpcyBjYXNlPworICAgIG5vZGVMaXN0ID0gbV9mcmFtZS0+ZG9j
dW1lbnQoKS0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoSFRNTE5hbWVzOjppbWdUYWcubG9jYWxOYW1l
KCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBub2RlTGlzdC5nZXQoKS0+bGVuZ3Ro
KCk7ICsraSkgeworICAgICAgICBIVE1MSW1hZ2VFbGVtZW50KiBub2RlID0gc3RhdGljX2Nhc3Q8
SFRNTEltYWdlRWxlbWVudCo+KG5vZGVMaXN0LmdldCgpLT5pdGVtKGkpKTsKKyAgICAgICAgQ2Fj
aGVkSW1hZ2UqIGNhY2hlZGltYWdlID0gbm9kZSA/IG5vZGUtPmNhY2hlZEltYWdlKCkgOiAwOwor
ICAgICAgICBpZiAoY2FjaGVkaW1hZ2UgJiYgY2FjaGVkaW1hZ2UtPnJlc3BvbnNlKCkuaXNNdWx0
aXBhcnRQYXlsb2FkKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJl
dHVybiB0cnVlOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6cHJvdmlz
aW9uYWxMb2FkU3RhcnRlZCgpCit7CisgICAgLy8gV2Ugd291bGQgbGlrZSB0byBoaWRlIHRoZSB2
aXJ0dWFsIGtleWJvYXJkIGJlZm9yZSBpdCBuYXZpZ2F0ZXMgdG8gYW5vdGhlciBwYWdlCisgICAg
Ly8gc28gdGhhdCB0aGUgc2Nyb2xsIG9mZnNldCB3aXRob3V0IGtleWJvYXJkIHNob3duIHdpbGwg
YmUgc2F2ZWQgaW4gdGhlIGhpc3RvcnkgaXRlbS4KKyAgICAvLyBUaGVuIHdoZW4gdGhlIHVzZXIg
bmF2aWdhdGVzIGJhY2ssIGl0IHdpbGwgc2Nyb2xsIHRvIHRoZSByaWdodCBwb3NpdGlvbi4KKyAg
ICBpZiAoaXNNYWluRnJhbWUoKSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+c2hvd1ZpcnR1
YWxLZXlib2FyZChmYWxzZSk7Cit9CisKKy8vIFdlIGRvbid0IG5lZWQgdG8gcHJvdmlkZSB0aGUg
ZXJyb3IgbWVzc2FnZSBzdHJpbmcsIHRoYXQgd2lsbCBiZSBoYW5kbGVkIGluIEJyb3dzZXJFcnJv
clBhZ2UgYWNjb3JkaW5nIHRvIHRoZSBlcnJvciBjb2RlLgorUmVzb3VyY2VFcnJvciBGcmFtZUxv
YWRlckNsaWVudEJsYWNrQmVycnk6OmNhbm5vdFNob3dVUkxFcnJvcihjb25zdCBSZXNvdXJjZVJl
cXVlc3QmIHJlcXVlc3QpCit7CisgICAgLy8gRklYTUU6IFdoeSBhcmUgd2Ugbm90IHBhc3Npbmcg
dGhlIGRvbWFpbiB0byB0aGUgUmVzb3VyY2VFcnJvcj8gU2VlIFBSICMxMTk3ODkuCisgICAgcmV0
dXJuIFJlc291cmNlRXJyb3IoU3RyaW5nKCksIFdlYktpdEVycm9yQ2Fubm90U2hvd1VSTCwgcmVx
dWVzdC51cmwoKS5zdHJpbmcoKSwgU3RyaW5nKCkpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xp
ZW50QmxhY2tCZXJyeTo6ZGlkUmVzdG9yZUZyb21QYWdlQ2FjaGUoKQoreworICAgIG1fd2ViUGFn
ZVByaXZhdGUtPm1fZGlkUmVzdG9yZUZyb21QYWdlQ2FjaGUgPSB0cnVlOworfQorCit2b2lkIEZy
YW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hXaWxsVXBkYXRlQXBwbGljYXRpb25D
YWNoZShjb25zdCBSZXNvdXJjZVJlcXVlc3QmKQoreworICAgIEFTU0VSVChpc01haW5GcmFtZSgp
KTsKKyAgICBpZiAoIWlzTWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fd2Vi
UGFnZVByaXZhdGUtPm1fY2xpZW50LT5ub3RpZnlXaWxsVXBkYXRlQXBwbGljYXRpb25DYWNoZSgp
OworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRMb2Fk
RnJvbUFwcGxpY2F0aW9uQ2FjaGUoY29uc3QgUmVzb3VyY2VSZXF1ZXN0JikKK3sKKyAgICBBU1NF
UlQoaXNNYWluRnJhbWUoKSk7CisgICAgaWYgKCFpc01haW5GcmFtZSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+bm90aWZ5RGlkTG9hZEZyb21B
cHBsaWNhdGlvbkNhY2hlKCk7Cit9CisKK30gLy8gV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9ibGFja2JlcnJ5L1dlYkNvcmVTdXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tC
ZXJyeS5oIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYkNvcmVTdXBwb3J0L0ZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjExYzE0YzliYzA3OTUzY2U5MTQ3MTBh
ZDA5MTcwMzM0MzRlODczOGIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L2JsYWNr
YmVycnkvV2ViQ29yZVN1cHBvcnQvRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5LmgKQEAgLTAs
MCArMSwyMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIg
UmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl
dGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMw
MSAgVVNBCisgKi8KKworI2lmbmRlZiBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnlfaAorI2Rl
ZmluZSBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnlfaAorCisjaW5jbHVkZSAiRG9jdW1lbnRM
b2FkZXIuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkZyYW1lTG9hZGVyQ2xpZW50
LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJXaWRnZXQuaCIKKwor
bmFtZXNwYWNlIEJsYWNrQmVycnkgeworbmFtZXNwYWNlIFdlYktpdCB7CitjbGFzcyBXZWJQYWdl
UHJpdmF0ZTsKK30KK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBGcmFtZU5ldHdv
cmtpbmdDb250ZXh0OworY2xhc3MgR2VvbG9jYXRpb247CitjbGFzcyBIVE1MRm9ybUVsZW1lbnQ7
CisKK2NsYXNzIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeSA6IHB1YmxpYyBGcmFtZUxvYWRl
ckNsaWVudCB7CitwdWJsaWM6CisgICAgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5KCk7Cisg
ICAgfkZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeSgpOworCisgICAgdm9pZCBzZXRGcmFtZShG
cmFtZSogZnJhbWUsIEJsYWNrQmVycnk6OldlYktpdDo6V2ViUGFnZVByaXZhdGUqIHdlYlBhZ2VQ
cml2YXRlKSB7IG1fZnJhbWUgPSBmcmFtZTsgbV93ZWJQYWdlUHJpdmF0ZSA9IHdlYlBhZ2VQcml2
YXRlOyB9CisKKyAgICBpbnQgcGxheWVySWQoKSBjb25zdDsKKyAgICBib29sIGNvb2tpZXNFbmFi
bGVkKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgZnJhbWVMb2FkZXJEZXN0cm95ZWQoKTsK
KyAgICB2aXJ0dWFsIGJvb2wgaGFzV2ViVmlldygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAg
ICB2aXJ0dWFsIHZvaWQgbWFrZVJlcHJlc2VudGF0aW9uKERvY3VtZW50TG9hZGVyKikgeyBub3RJ
bXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGZvcmNlTGF5b3V0KCkgeyBub3RJbXBs
ZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGZvcmNlTGF5b3V0Rm9yTm9uSFRNTCgpIHsg
bm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRDb3BpZXNPblNjcm9sbCgp
IHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBkZXRhY2hlZEZyb21QYXJl
bnQyKCk7CisgICAgdmlydHVhbCB2b2lkIGRldGFjaGVkRnJvbVBhcmVudDMoKSB7IG5vdEltcGxl
bWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgYXNzaWduSWRlbnRpZmllclRvSW5pdGlhbFJl
cXVlc3QobG9uZyB1bnNpZ25lZCBpbnQsIERvY3VtZW50TG9hZGVyKiwgY29uc3QgUmVzb3VyY2VS
ZXF1ZXN0JikgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNo
V2lsbFNlbmRSZXF1ZXN0KERvY3VtZW50TG9hZGVyKiwgbG9uZyB1bnNpZ25lZCBpbnQsIFJlc291
cmNlUmVxdWVzdCYsIGNvbnN0IFJlc291cmNlUmVzcG9uc2UmKTsKKyAgICB2aXJ0dWFsIGJvb2wg
c2hvdWxkVXNlQ3JlZGVudGlhbFN0b3JhZ2UoRG9jdW1lbnRMb2FkZXIqLCBsb25nIHVuc2lnbmVk
IGludCkgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIHZv
aWQgZGlzcGF0Y2hEaWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2UoRG9jdW1lbnRMb2Fk
ZXIqLCBsb25nIHVuc2lnbmVkIGludCwgY29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmKSB7
IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRDYW5jZWxB
dXRoZW50aWNhdGlvbkNoYWxsZW5nZShEb2N1bWVudExvYWRlciosIGxvbmcgdW5zaWduZWQgaW50
LCBjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQor
ICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZFJlY2VpdmVSZXNwb25zZShEb2N1bWVudExvYWRl
ciosIGxvbmcgdW5zaWduZWQgaW50LCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJik7CisgICAgdmly
dHVhbCB2b2lkIGRpc3BhdGNoRGlkUmVjZWl2ZUNvbnRlbnRMZW5ndGgoRG9jdW1lbnRMb2FkZXIq
LCBsb25nIHVuc2lnbmVkIGludCwgaW50KSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0
dWFsIHZvaWQgZGlzcGF0Y2hEaWRGaW5pc2hMb2FkaW5nKERvY3VtZW50TG9hZGVyKiwgbG9uZyB1
bnNpZ25lZCBpbnQpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBkaXNw
YXRjaERpZEZhaWxMb2FkaW5nKERvY3VtZW50TG9hZGVyKiwgbG9uZyB1bnNpZ25lZCBpbnQsIGNv
bnN0IFJlc291cmNlRXJyb3ImKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIGJv
b2wgZGlzcGF0Y2hEaWRMb2FkUmVzb3VyY2VGcm9tTWVtb3J5Q2FjaGUoRG9jdW1lbnRMb2FkZXIq
LCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmLCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiwgaW50KSB7
IG5vdEltcGxlbWVudGVkKCk7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgdm9pZCBkaXNw
YXRjaERpZEhhbmRsZU9ubG9hZEV2ZW50cygpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERp
ZFJlY2VpdmVTZXJ2ZXJSZWRpcmVjdEZvclByb3Zpc2lvbmFsTG9hZCgpIHsgbm90SW1wbGVtZW50
ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZENhbmNlbENsaWVudFJlZGlyZWN0
KCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoV2lsbFBlcmZvcm1DbGllbnRSZWRpcmVjdChj
b25zdCBLVVJMJiwgZG91YmxlLCBkb3VibGUpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERp
ZENoYW5nZUxvY2F0aW9uV2l0aGluUGFnZSgpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERp
ZFB1c2hTdGF0ZVdpdGhpblBhZ2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRSZXBs
YWNlU3RhdGVXaXRoaW5QYWdlKCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkUG9wU3Rh
dGVXaXRoaW5QYWdlKCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoV2lsbENsb3NlKCk7Cisg
ICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkUmVjZWl2ZUljb24oKTsKKyAgICB2aXJ0dWFsIHZv
aWQgZGlzcGF0Y2hEaWRTdGFydFByb3Zpc2lvbmFsTG9hZCgpOworICAgIHZpcnR1YWwgdm9pZCBk
aXNwYXRjaERpZFJlY2VpdmVUaXRsZShjb25zdCBTdHJpbmdXaXRoRGlyZWN0aW9uJik7CisgICAg
dmlydHVhbCB2b2lkIHNldFRpdGxlKGNvbnN0IFN0cmluZ1dpdGhEaXJlY3Rpb24mIHRpdGxlLCBj
b25zdCBLVVJMJik7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkQ29tbWl0TG9hZCgpOwor
ICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZEZhaWxQcm92aXNpb25hbExvYWQoY29uc3QgUmVz
b3VyY2VFcnJvciYpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZEZhaWxMb2FkKGNvbnN0
IFJlc291cmNlRXJyb3ImKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRGaW5pc2hEb2N1
bWVudExvYWQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRGaW5pc2hMb2FkKCk7Cisg
ICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkRmlyc3RMYXlvdXQoKSB7IG5vdEltcGxlbWVudGVk
KCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRGaXJzdFZpc3VhbGx5Tm9uRW1wdHlM
YXlvdXQoKTsKKyAgICB2aXJ0dWFsIEZyYW1lKiBkaXNwYXRjaENyZWF0ZVBhZ2UoY29uc3QgTmF2
aWdhdGlvbkFjdGlvbiYpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaFNob3coKSB7IG5vdElt
cGxlbWVudGVkKCk7IH0KKworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERlY2lkZVBvbGljeUZv
clJlc3BvbnNlKEZyYW1lUG9saWN5RnVuY3Rpb24sIGNvbnN0IFJlc291cmNlUmVzcG9uc2UmLCBj
b25zdCBSZXNvdXJjZVJlcXVlc3QmKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEZWNpZGVQ
b2xpY3lGb3JOZXdXaW5kb3dBY3Rpb24oRnJhbWVQb2xpY3lGdW5jdGlvbiwgY29uc3QgTmF2aWdh
dGlvbkFjdGlvbiYsIGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIFBhc3NSZWZQdHI8Rm9ybVN0YXRl
PiwgY29uc3QgU3RyaW5nJiBmcmFtZU5hbWUpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERl
Y2lkZVBvbGljeUZvck5hdmlnYXRpb25BY3Rpb24oRnJhbWVQb2xpY3lGdW5jdGlvbiwgY29uc3Qg
TmF2aWdhdGlvbkFjdGlvbiYsIGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIFBhc3NSZWZQdHI8Rm9y
bVN0YXRlPik7CisgICAgdmlydHVhbCB2b2lkIGNhbmNlbFBvbGljeUNoZWNrKCk7CisgICAgdmly
dHVhbCB2b2lkIGRpc3BhdGNoVW5hYmxlVG9JbXBsZW1lbnRQb2xpY3koY29uc3QgUmVzb3VyY2VF
cnJvciYpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaFdp
bGxTdWJtaXRGb3JtKEZyYW1lUG9saWN5RnVuY3Rpb24sIFBhc3NSZWZQdHI8Rm9ybVN0YXRlPik7
CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkTG9hZE1haW5SZXNvdXJjZShEb2N1bWVudExv
YWRlciopIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCByZXZlcnRUb1By
b3Zpc2lvbmFsU3RhdGUoRG9jdW1lbnRMb2FkZXIqKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0TWFpbkRvY3VtZW50RXJyb3IoRG9jdW1lbnRMb2FkZXIqLCBjb25z
dCBSZXNvdXJjZUVycm9yJik7CisgICAgdmlydHVhbCB2b2lkIHBvc3RQcm9ncmVzc1N0YXJ0ZWRO
b3RpZmljYXRpb24oKTsKKyAgICB2aXJ0dWFsIHZvaWQgcG9zdFByb2dyZXNzRXN0aW1hdGVDaGFu
Z2VkTm90aWZpY2F0aW9uKCk7CisgICAgdmlydHVhbCB2b2lkIHBvc3RQcm9ncmVzc0ZpbmlzaGVk
Tm90aWZpY2F0aW9uKCk7CisgICAgdmlydHVhbCB2b2lkIHNldE1haW5GcmFtZURvY3VtZW50UmVh
ZHkoYm9vbCkgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIHN0YXJ0RG93
bmxvYWQoY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiwgY29uc3QgU3RyaW5nJiBzdWdnZXN0ZWROYW1l
ID0gU3RyaW5nKCkpOworICAgIHZpcnR1YWwgdm9pZCB3aWxsQ2hhbmdlVGl0bGUoRG9jdW1lbnRM
b2FkZXIqKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlkQ2hhbmdl
VGl0bGUoRG9jdW1lbnRMb2FkZXIqKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFs
IHZvaWQgY29tbWl0dGVkTG9hZChEb2N1bWVudExvYWRlciosIGNvbnN0IGNoYXIqLCBpbnQpOwor
ICAgIHZpcnR1YWwgdm9pZCBmaW5pc2hlZExvYWRpbmcoRG9jdW1lbnRMb2FkZXIqKTsKKyAgICB2
aXJ0dWFsIHZvaWQgdXBkYXRlR2xvYmFsSGlzdG9yeSgpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQor
ICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVHbG9iYWxIaXN0b3J5UmVkaXJlY3RMaW5rcygpIHsgbm90
SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgYm9vbCBzaG91bGRHb1RvSGlzdG9yeUl0ZW0o
SGlzdG9yeUl0ZW0qKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkU3RvcExvYWRpbmdG
b3JIaXN0b3J5SXRlbShIaXN0b3J5SXRlbSopIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBkaXNw
YXRjaERpZEFkZEJhY2tGb3J3YXJkSXRlbShIaXN0b3J5SXRlbSopIGNvbnN0OworICAgIHZpcnR1
YWwgdm9pZCBkaXNwYXRjaERpZFJlbW92ZUJhY2tGb3J3YXJkSXRlbShIaXN0b3J5SXRlbSopIGNv
bnN0OworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZENoYW5nZUJhY2tGb3J3YXJkSW5kZXgo
KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hXaWxsVXBkYXRlQXBwbGljYXRpb25D
YWNoZShjb25zdCBSZXNvdXJjZVJlcXVlc3QmKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hE
aWRMb2FkRnJvbUFwcGxpY2F0aW9uQ2FjaGUoY29uc3QgUmVzb3VyY2VSZXF1ZXN0Jik7CisgICAg
dmlydHVhbCB2b2lkIGRpZERpc3BsYXlJbnNlY3VyZUNvbnRlbnQoKSB7IG5vdEltcGxlbWVudGVk
KCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlkUnVuSW5zZWN1cmVDb250ZW50KFNlY3VyaXR5T3Jp
Z2luKiwgY29uc3QgS1VSTCYpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgUmVz
b3VyY2VFcnJvciBpbnRlcnJ1cHRlZEZvclBvbGljeUNoYW5nZUVycm9yKGNvbnN0IFJlc291cmNl
UmVxdWVzdCYpIHsgbm90SW1wbGVtZW50ZWQoKTsgcmV0dXJuIFJlc291cmNlRXJyb3IoZW1wdHlT
dHJpbmcoKSwgMCwgZW1wdHlTdHJpbmcoKSwgZW1wdHlTdHJpbmcoKSk7IH0KKyAgICB2aXJ0dWFs
IFJlc291cmNlRXJyb3IgY2FuY2VsbGVkRXJyb3IoY29uc3QgUmVzb3VyY2VSZXF1ZXN0JikgeyBu
b3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gUmVzb3VyY2VFcnJvcihlbXB0eVN0cmluZygpLCAwLCBl
bXB0eVN0cmluZygpLCBlbXB0eVN0cmluZygpKTsgfQorICAgIHZpcnR1YWwgUmVzb3VyY2VFcnJv
ciBibG9ja2VkRXJyb3IoY29uc3QgUmVzb3VyY2VSZXF1ZXN0JikgeyBub3RJbXBsZW1lbnRlZCgp
OyByZXR1cm4gUmVzb3VyY2VFcnJvcihlbXB0eVN0cmluZygpLCAwLCBlbXB0eVN0cmluZygpLCBl
bXB0eVN0cmluZygpKTsgfQorICAgIHZpcnR1YWwgUmVzb3VyY2VFcnJvciBjYW5ub3RTaG93VVJM
RXJyb3IoY29uc3QgUmVzb3VyY2VSZXF1ZXN0Jik7CisgICAgdmlydHVhbCBSZXNvdXJjZUVycm9y
IGludGVycnVwdEZvclBvbGljeUNoYW5nZUVycm9yKGNvbnN0IFJlc291cmNlUmVxdWVzdCYpIHsg
bm90SW1wbGVtZW50ZWQoKTsgcmV0dXJuIFJlc291cmNlRXJyb3IoZW1wdHlTdHJpbmcoKSwgMCwg
ZW1wdHlTdHJpbmcoKSwgZW1wdHlTdHJpbmcoKSk7IH0KKyAgICB2aXJ0dWFsIFJlc291cmNlRXJy
b3IgY2Fubm90U2hvd01JTUVUeXBlRXJyb3IoY29uc3QgUmVzb3VyY2VSZXNwb25zZSYpIHsgbm90
SW1wbGVtZW50ZWQoKTsgcmV0dXJuIFJlc291cmNlRXJyb3IoZW1wdHlTdHJpbmcoKSwgMCwgZW1w
dHlTdHJpbmcoKSwgZW1wdHlTdHJpbmcoKSk7IH0KKyAgICB2aXJ0dWFsIFJlc291cmNlRXJyb3Ig
ZmlsZURvZXNOb3RFeGlzdEVycm9yKGNvbnN0IFJlc291cmNlUmVzcG9uc2UmKSB7IG5vdEltcGxl
bWVudGVkKCk7IHJldHVybiBSZXNvdXJjZUVycm9yKGVtcHR5U3RyaW5nKCksIDAsIGVtcHR5U3Ry
aW5nKCksIGVtcHR5U3RyaW5nKCkpOyB9CisgICAgdmlydHVhbCBSZXNvdXJjZUVycm9yIHBsdWdp
bldpbGxIYW5kbGVMb2FkRXJyb3IoY29uc3QgUmVzb3VyY2VSZXNwb25zZSYpIHsgbm90SW1wbGVt
ZW50ZWQoKTsgcmV0dXJuIFJlc291cmNlRXJyb3IoZW1wdHlTdHJpbmcoKSwgMCwgZW1wdHlTdHJp
bmcoKSwgZW1wdHlTdHJpbmcoKSk7IH0KKyAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRmFsbEJhY2so
Y29uc3QgUmVzb3VyY2VFcnJvciYpIHsgbm90SW1wbGVtZW50ZWQoKTsgcmV0dXJuIGZhbHNlOyB9
CisgICAgdmlydHVhbCBib29sIGNhbkhhbmRsZVJlcXVlc3QoY29uc3QgUmVzb3VyY2VSZXF1ZXN0
JikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGNhblNob3dNSU1FVHlwZShjb25zdCBTdHJpbmcm
KSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgY2FuU2hvd01JTUVUeXBlQXNIVE1MKGNvbnN0IFN0
cmluZyYpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCByZXByZXNlbnRhdGlvbkV4aXN0c0ZvclVS
TFNjaGVtZShjb25zdCBTdHJpbmcmKSBjb25zdCB7IG5vdEltcGxlbWVudGVkKCk7IHJldHVybiBm
YWxzZTsgfQorICAgIHZpcnR1YWwgU3RyaW5nIGdlbmVyYXRlZE1JTUVUeXBlRm9yVVJMU2NoZW1l
KGNvbnN0IFN0cmluZyYpIGNvbnN0IHsgbm90SW1wbGVtZW50ZWQoKTsgcmV0dXJuIFN0cmluZygp
OyB9CisgICAgdmlydHVhbCB2b2lkIGZyYW1lTG9hZENvbXBsZXRlZCgpIHsgbm90SW1wbGVtZW50
ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBzYXZlVmlld1N0YXRlVG9JdGVtKEhpc3RvcnlJdGVt
Kik7CisgICAgdmlydHVhbCB2b2lkIHJlc3RvcmVWaWV3U3RhdGUoKTsKKyAgICB2aXJ0dWFsIHZv
aWQgcHJvdmlzaW9uYWxMb2FkU3RhcnRlZCgpOworICAgIHZpcnR1YWwgdm9pZCBkaWRGaW5pc2hM
b2FkKCkgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVGb3JE
YXRhU291cmNlUmVwbGFjZW1lbnQoKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFs
IFBhc3NSZWZQdHI8RG9jdW1lbnRMb2FkZXI+IGNyZWF0ZURvY3VtZW50TG9hZGVyKGNvbnN0IFJl
c291cmNlUmVxdWVzdCYsIGNvbnN0IFN1YnN0aXR1dGVEYXRhJik7CisgICAgdmlydHVhbCB2b2lk
IHNldFRpdGxlKGNvbnN0IFN0cmluZyYsIGNvbnN0IEtVUkwmKSB7IG5vdEltcGxlbWVudGVkKCk7
IH0KKyAgICB2aXJ0dWFsIFN0cmluZyB1c2VyQWdlbnQoY29uc3QgS1VSTCYpOworICAgIHZpcnR1
YWwgdm9pZCBzYXZlUGxhdGZvcm1EYXRhVG9DYWNoZWRGcmFtZShDYWNoZWRGcmFtZSopIHsgbm90
SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCB0cmFuc2l0aW9uVG9Db21taXR0ZWRG
cm9tQ2FjaGVkRnJhbWUoQ2FjaGVkRnJhbWUqKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2
aXJ0dWFsIHZvaWQgdHJhbnNpdGlvblRvQ29tbWl0dGVkRm9yTmV3UGFnZSgpOworICAgIHZpcnR1
YWwgYm9vbCBjYW5DYWNoZVBhZ2UoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkU2F2ZVRv
UGFnZUNhY2hlKCkgeyB9CisgICAgdmlydHVhbCB2b2lkIGRpZFJlc3RvcmVGcm9tUGFnZUNhY2hl
KCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkQmVjb21lRnJhbWVzZXQoYm9vbCkgeyB9
CisgICAgdmlydHVhbCB2b2lkIGRvd25sb2FkKFJlc291cmNlSGFuZGxlKiwgY29uc3QgUmVzb3Vy
Y2VSZXF1ZXN0JiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiwgY29uc3QgUmVzb3VyY2VSZXNwb25z
ZSYpOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxGcmFtZT4gY3JlYXRlRnJhbWUoY29uc3QgS1VS
TCYsIGNvbnN0IFN0cmluZyYsIEhUTUxGcmFtZU93bmVyRWxlbWVudCosIGNvbnN0IFN0cmluZyYs
IGJvb2wsIGludCwgaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkVHJhbnNmZXJDaGlsZEZyYW1l
VG9OZXdEb2N1bWVudChQYWdlKik7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPFdpZGdldD4gY3Jl
YXRlUGx1Z2luKGNvbnN0IEludFNpemUmLCBIVE1MUGx1Z0luRWxlbWVudCosIGNvbnN0IEtVUkwm
LCBjb25zdCBWZWN0b3I8U3RyaW5nPiYsIGNvbnN0IFZlY3RvcjxTdHJpbmc+JiwgY29uc3QgU3Ry
aW5nJiwgYm9vbCk7CisgICAgdmlydHVhbCB2b2lkIHJlZGlyZWN0RGF0YVRvUGx1Z2luKFdpZGdl
dCopOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxXaWRnZXQ+IGNyZWF0ZUphdmFBcHBsZXRXaWRn
ZXQoY29uc3QgSW50U2l6ZSYsIEhUTUxBcHBsZXRFbGVtZW50KiwgY29uc3QgS1VSTCYsIGNvbnN0
IFZlY3RvcjxTdHJpbmc+JiwgY29uc3QgVmVjdG9yPFN0cmluZz4mKSB7IG5vdEltcGxlbWVudGVk
KCk7IHJldHVybiAwOyB9CisKKyAgICB2aXJ0dWFsIE9iamVjdENvbnRlbnRUeXBlIG9iamVjdENv
bnRlbnRUeXBlKGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmIG1pbWVUeXBlLCBib29sIHNob3Vs
ZFByZWZlclBsdWdJbnNGb3JJbWFnZXMpOworICAgIHZpcnR1YWwgU3RyaW5nIG92ZXJyaWRlTWVk
aWFUeXBlKCkgY29uc3QgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gU3RyaW5nKCk7IH0KKyAg
ICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRDbGVhcldpbmRvd09iamVjdEluV29ybGQoRE9NV3Jh
cHBlcldvcmxkKik7CisgICAgdmlydHVhbCB2b2lkIGRvY3VtZW50RWxlbWVudEF2YWlsYWJsZSgp
IHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBkaWRQZXJmb3JtRmlyc3RO
YXZpZ2F0aW9uKCkgY29uc3QgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lk
IHJlZ2lzdGVyRm9ySWNvbk5vdGlmaWNhdGlvbihib29sKSB7IG5vdEltcGxlbWVudGVkKCk7IH0K
KworICAgIHZpcnR1YWwgYm9vbCBzaG91bGRMb2FkSWNvbkV4dGVybmFsbHkoKSB7IHJldHVybiBm
YWxzZTsgfQorICAgIHZpcnR1YWwgdm9pZCBsb2FkSWNvbkV4dGVybmFsbHkoY29uc3QgU3RyaW5n
JiBvcmlnaW5hbFBhZ2VVcmwsIGNvbnN0IFN0cmluZyYgZmluYWxQYWdlVXJsLCBjb25zdCBTdHJp
bmcmIGljb25VcmwpOworCisgICAgdmlydHVhbCB2b2lkIGRpZERldGVjdFhTUyhjb25zdCBLVVJM
JiwgYm9vbCkgeyB9CisgICAgdmlydHVhbCB2b2lkIHRyYW5zZmVyTG9hZGluZ1Jlc291cmNlRnJv
bVBhZ2UoUmVzb3VyY2VMb2FkZXIqLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmLCBQYWdlKik7Cisg
ICAgdmlydHVhbCB2b2lkIGRpZFRyYW5zZmVyQ2hpbGRGcmFtZVRvTmV3RG9jdW1lbnQoKSB7IG5v
dEltcGxlbWVudGVkKCk7IH07CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkQ2hhbmdlSWNv
bnMoSWNvblR5cGUpIHsgbm90SW1wbGVtZW50ZWQoKTsgfTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlz
cGF0Y2hXaWxsU2VuZFN1Ym1pdEV2ZW50KEhUTUxGb3JtRWxlbWVudCopIHsgbm90SW1wbGVtZW50
ZWQoKTsgfTsKKworICAgIHZpcnR1YWwgdm9pZCB3aWxsRGVmZXJMb2FkaW5nKCk7CisgICAgdmly
dHVhbCB2b2lkIGRpZFJlc3VtZUxvYWRpbmcoKTsKKyAgICB2aXJ0dWFsIHZvaWQgYXV0aGVudGlj
YXRpb25DaGFsbGVuZ2UoY29uc3QgU3RyaW5nJiByZWFsbSwgU3RyaW5nJiB1c2VybmFtZSwgU3Ry
aW5nJiBwYXNzd29yZCk7CisKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8RnJhbWVOZXR3b3JraW5n
Q29udGV4dD4gY3JlYXRlTmV0d29ya2luZ0NvbnRleHQoKTsKKworICAgICAvLyBTY2hlZHVsZSBh
IHNjcmlwdCB0aGF0IHdhcyBsb2FkZWQgbWFudWFsbHkgYnkgdGhlIHVzZXIgKGVnLiBhCisgICAg
IC8vIGJvb2ttYXJrbGV0KSB3aGlsZSBwYWdlIGxvYWRpbmcgd2FzIGRlZmVycmVkLgorICAgIHZv
aWQgc2V0RGVmZXJyZWRNYW51YWxTY3JpcHQoY29uc3QgS1VSTCYpOworCisgICAgdm9pZCByZWFk
eVRvUmVuZGVyKGJvb2wgcGFnZUlzVmlzdWFsbHlOb25FbXB0eSk7CisKKyAgICB2b2lkIGRvUGVu
ZGluZ0ZyYWdtZW50U2Nyb2xsKCk7CisKKyAgICAvLyBVc2VkIHRvIHN0b3AgbWVkaWEgZmlsZXMg
ZnJvbSBsb2FkaW5nIGJlY2F1c2Ugd2UgZG9uJ3QgbmVlZCB0byBoYXZlIHRoZSBlbnRpcmUgZmls
ZSBsb2FkZWQgYnkgV2ViS2l0LgorICAgIHZvaWQgc2V0Q2FuY2VsTG9hZE9uTmV4dERhdGEoKSB7
IG1fY2FuY2VsTG9hZE9uTmV4dERhdGEgPSB0cnVlOyB9CisgICAgYm9vbCBzaG91bGRDYW5jZWxM
b2FkT25OZXh0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fY2FuY2VsTG9hZE9uTmV4dERhdGE7IH0K
KworICAgIHZvaWQgc3VwcHJlc3NDaGlsZEZyYW1lQ3JlYXRpb24oKSB7IG1fY2hpbGRGcmFtZUNy
ZWF0aW9uU3VwcHJlc3NlZCA9IHRydWU7IH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHJlY2VpdmVk
RGF0YShjb25zdCBjaGFyKiwgaW50LCBjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lkIGRpZEZpbmlz
aE9yRmFpbExvYWRpbmcoY29uc3QgUmVzb3VyY2VFcnJvciYpOworICAgIGJvb2wgaXNNYWluRnJh
bWUoKSBjb25zdDsKKworICAgIHZvaWQgaW52YWxpZGF0ZUJhY2tGb3J3YXJkTGlzdCgpIGNvbnN0
OworICAgIHZvaWQgbm90aWZ5QmFja0ZvcndhcmRMaXN0Q2hhbmdlZCgpIGNvbnN0OworCisgICAg
UG9saWN5QWN0aW9uIGRlY2lkZVBvbGljeUZvckV4dGVybmFsTG9hZChjb25zdCBSZXNvdXJjZVJl
cXVlc3QgJiwgYm9vbCBpc0ZyYWdtZW50U2Nyb2xsKTsKKyAgICB2b2lkIGRlbGF5UG9saWN5Q2hl
Y2tVbnRpbEZyYWdtZW50RXhpc3RzKGNvbnN0IFN0cmluZyYgZnJhZ21lbnQsIEZyYW1lUG9saWN5
RnVuY3Rpb24pOworCisgICAgdm9pZCBkZWZlcnJlZEpvYnNUaW1lckZpcmVkKFRpbWVyPEZyYW1l
TG9hZGVyQ2xpZW50QmxhY2tCZXJyeT4qKTsKKworICAgIEZyYW1lKiBtX2ZyYW1lOworICAgIFJl
c291cmNlRXJyb3IgbV9sb2FkRXJyb3I7CisgICAgQmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJQYWdl
UHJpdmF0ZSogbV93ZWJQYWdlUHJpdmF0ZTsKKworICAgIFRpbWVyPEZyYW1lTG9hZGVyQ2xpZW50
QmxhY2tCZXJyeT4qIG1fZGVmZXJyZWRKb2JzVGltZXI7CisgICAgS1VSTCBtX2RlZmVycmVkTWFu
dWFsU2NyaXB0OworICAgIEdlb2xvY2F0aW9uKiBtX2dlb2xvY2F0aW9uOworICAgIGJvb2wgbV9z
ZW50UmVhZHlUb1JlbmRlcjsKKworICAgIEZyYW1lUG9saWN5RnVuY3Rpb24gbV9wZW5kaW5nRnJh
Z21lbnRTY3JvbGxQb2xpY3lGdW5jdGlvbjsKKyAgICBTdHJpbmcgbV9wZW5kaW5nRnJhZ21lbnRT
Y3JvbGw7CisKKyAgICBib29sIG1fbG9hZGluZ0Vycm9yUGFnZTsKKyAgICBib29sIG1fY2xpZW50
UmVkaXJlY3RJc1BlbmRpbmc7CisgICAgYm9vbCBtX2NoaWxkRnJhbWVDcmVhdGlvblN1cHByZXNz
ZWQ7CisKKyAgICAvLyBUaGlzIHNldCBpbmNsdWRlcyB0aGUgb3JpZ2luYWwgYW5kIGZpbmFsIHVy
bHMgZm9yIHNlcnZlciByZWRpcmVjdHMuCisgICAgSGFzaFNldDxLVVJMPiBtX2hpc3RvcnlOYXZp
Z2F0aW9uU291cmNlVVJMczsKKyAgICBIYXNoU2V0PEtVUkw+IG1fcmVkaXJlY3RVUkxzVG9Ta2lw
RHVlVG9IaXN0b3J5TmF2aWdhdGlvbjsKKworICAgIC8vIFBsdWdpbiB2aWV3IHRvIHJlZGlyZWN0
IGRhdGEgdG8uCisgICAgUGx1Z2luVmlldyogbV9wbHVnaW5WaWV3OworICAgIGJvb2wgbV9oYXNT
ZW50UmVzcG9uc2VUb1BsdWdpbjsKKworICAgIC8vIFVzZWQgdG8gc3RvcCBtZWRpYSBmaWxlcyBm
cm9tIGxvYWRpbmcgYmVjYXVzZSB3ZSBkb24ndCBuZWVkIHRvIGhhdmUgdGhlIGVudGlyZSBmaWxl
IGxvYWRlZCBieSBXZWJLaXQuCisgICAgYm9vbCBtX2NhbmNlbExvYWRPbk5leHREYXRhOworfTsK
KworfSAvLyBXZWJDb3JlCisKKyNlbmRpZiAvLyBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnlf
aAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>127010</attachid>
            <date>2012-02-14 11:58:21 -0800</date>
            <delta_ts>2012-02-14 14:09:37 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78275-20120214145800.patch</filename>
            <type>text/plain</type>
            <size>66996</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3MTA5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDljM2E2NmRhNThjMjhhYjI5
YzQwMjQ5YzBhNTcwYTg2YTA1N2IwNTIuLjk5YjE5MjRhZDQyMTU2YzBhN2VhZGM5OTA1YmFiNzEz
MDdjYjkyMGMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTItMDItMTAgIEphY2t5IEpp
YW5nICA8emhhamlhbmdAcmltLmNvbT4KKworICAgICAgICBbQmxhY2tCZXJyeV0gVXBzdHJlYW0g
QmxhY2tCZXJyeSBXZWJDb3JlU3VwcG9ydCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkgY2xh
c3MKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc4Mjc1
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW5pdGlh
bCB1cHN0cmVhbSwgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJDb3Jl
U3VwcG9ydC9GcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkuY3BwOiBBZGRlZC4KKyAgICAgICAg
KiBibGFja2JlcnJ5L1dlYkNvcmVTdXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeS5o
OiBBZGRlZC4KKwogMjAxMi0wMi0wOCAgUm9iIEJ1aXMgIDxyYnVpc0ByaW0uY29tPgogCiAgICAg
ICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBEdW1wUmVuZGVyVHJlZUJsYWNrQmVycnkKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRl
ckNsaWVudEJsYWNrQmVycnkuY3BwIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYkNvcmVT
dXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNzc5ODY1
ZjlkNWVlNWEzOGE5N2JlYWY0Yzk1NzRjMjU1YjA5ZDk0MwotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRlckNsaWVudEJs
YWNrQmVycnkuY3BwCkBAIC0wLDAgKzEsMTI1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl
CisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5LmgiCisKKyNpbmNsdWRlICJCYWNr
Rm9yd2FyZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJCYWNrRm9yd2FyZExpc3RJbXBsLmgiCisj
aW5jbHVkZSAiQmFja2luZ1N0b3JlQ2xpZW50LmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlX3Au
aCIKKyNpbmNsdWRlICJCYXNlNjQuaCIKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2luY2x1
ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUgIkNocm9tZUNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNs
dWRlICJDbGllbnRFeHRlbnNpb24uaCIKKyNpbmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCisjaW5j
bHVkZSAiRHVtcFJlbmRlclRyZWVDbGllbnQuaCIKKyNpbmNsdWRlICJGcmFtZU5ldHdvcmtpbmdD
b250ZXh0QmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhU
TUxGb3JtRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxIZWFkRWxlbWVudC5oIgorI2luY2x1ZGUg
IkhUTUxJbWFnZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MTGlua0VsZW1lbnQuaCIKKyNpbmNs
dWRlICJIVE1MTWVkaWFFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTE1ldGFFbGVtZW50LmgiCisj
aW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTFBsdWdJbkVsZW1lbnQuaCIKKyNp
bmNsdWRlICJIVFRQUGFyc2Vycy5oIgorI2luY2x1ZGUgIkhpc3RvcnlJdGVtLmgiCisjaW5jbHVk
ZSAiSWNvbkRhdGFiYXNlLmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJJbnB1dEhh
bmRsZXIuaCIKKyNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAiTmF0aXZl
SW1hZ2VTa2lhLmgiCisjaW5jbHVkZSAiTmV0d29ya01hbmFnZXIuaCIKKyNpbmNsdWRlICJOb2Rl
TGlzdC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJQbHVnaW5WaWV3LmgiCisjaW5j
bHVkZSAiUHJvZ3Jlc3NUcmFja2VyLmgiCisjaW5jbHVkZSAiU2NvcGVQb2ludGVyLmgiCisjaW5j
bHVkZSAiU2hhcmVkQnVmZmVyLmgiCisjaW5jbHVkZSAiVGV4dEVuY29kaW5nLmgiCisjaW5jbHVk
ZSAiVG91Y2hFdmVudEhhbmRsZXIuaCIKKyNpZiBFTkFCTEUoV0VCRE9NKQorI2luY2x1ZGUgIldl
YkRPTURvY3VtZW50LmgiCisjZW5kaWYKKyNpbmNsdWRlICJXZWJQYWdlQ2xpZW50LmgiCisKKyNp
bmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1Mb2cuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxh
dGZvcm1TY3JlZW4uaD4KKyNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9BUElDYXN0Lmg+CisjaW5j
bHVkZSA8bmV0d29yay9GaWx0ZXJTdHJlYW0uaD4KKyNpbmNsdWRlIDxuZXR3b3JrL05ldHdvcmtS
ZXF1ZXN0Lmg+CisKK3VzaW5nIFdURjo6U3RyaW5nOwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7
Cit1c2luZyBuYW1lc3BhY2UgQmxhY2tCZXJyeTo6V2ViS2l0OworCisvLyBUaGlzIHdhcyBjb3Bp
ZWQgZnJvbSBmaWxlICJXZWJLaXQvU291cmNlL1dlYktpdC9tYWMvTWlzYy9XZWJLaXRFcnJvcnMu
aCIuCitlbnVtIHsKKyAgICBXZWJLaXRFcnJvckNhbm5vdFNob3dNSU1FVHlwZSA9ICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAxMDAsCisgICAgV2ViS2l0RXJyb3JDYW5ub3RTaG93VVJMID0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxLAorICAgIFdlYktpdEVycm9yRnJh
bWVMb2FkSW50ZXJydXB0ZWRCeVBvbGljeUNoYW5nZSA9ICAgICAgICAgICAgIDEwMiwKKyAgICBX
ZWJLaXRFcnJvckNhbm5vdFVzZVJlc3RyaWN0ZWRQb3J0ID0gICAgICAgICAgICAgICAgICAgICAg
ICAxMDMsCisgICAgV2ViS2l0RXJyb3JDYW5ub3RGaW5kUGx1Z0luID0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgMjAwLAorICAgIFdlYktpdEVycm9yQ2Fubm90TG9hZFBsdWdJbiA9ICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMSwKKyAgICBXZWJLaXRFcnJvckphdmFVbmF2
YWlsYWJsZSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDIsCisgICAgV2ViS2l0
RXJyb3JQbHVnaW5XaWxsSGFuZGxlTG9hZCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAz
Cit9OworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJy
eTo6RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5KCkKKyAgICA6IG1fZnJhbWUoMCkKKyAgICAs
IG1fd2ViUGFnZVByaXZhdGUoMCkKKyAgICAsIG1fc2VudFJlYWR5VG9SZW5kZXIoZmFsc2UpCisg
ICAgLCBtX3BlbmRpbmdGcmFnbWVudFNjcm9sbFBvbGljeUZ1bmN0aW9uKDApCisgICAgLCBtX2xv
YWRpbmdFcnJvclBhZ2UoZmFsc2UpCisgICAgLCBtX2NsaWVudFJlZGlyZWN0SXNQZW5kaW5nKGZh
bHNlKQorICAgICwgbV9jaGlsZEZyYW1lQ3JlYXRpb25TdXBwcmVzc2VkKGZhbHNlKQorICAgICwg
bV9wbHVnaW5WaWV3KDApCisgICAgLCBtX2hhc1NlbnRSZXNwb25zZVRvUGx1Z2luKGZhbHNlKQor
ICAgICwgbV9jYW5jZWxMb2FkT25OZXh0RGF0YShmYWxzZSkKK3sKKyAgICBtX2RlZmVycmVkSm9i
c1RpbWVyID0gbmV3IFRpbWVyPEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeT4odGhpcywgJkZy
YW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGVmZXJyZWRKb2JzVGltZXJGaXJlZCk7Cit9CisK
K0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6fkZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJy
eSgpCit7CisgICAgZGVsZXRlIG1fZGVmZXJyZWRKb2JzVGltZXI7CisgICAgbV9kZWZlcnJlZEpv
YnNUaW1lciA9IDA7Cit9CisKK2ludCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OnBsYXll
cklkKCkgY29uc3QKK3sKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZSAmJiBtX3dlYlBhZ2VQcml2
YXRlLT5tX2NsaWVudCkKKyAgICAgICAgcmV0dXJuIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50
LT5nZXRJbnN0YW5jZUlkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgRnJhbWVMb2FkZXJD
bGllbnRCbGFja0JlcnJ5Ojpjb29raWVzRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1f
d2ViUGFnZVByaXZhdGUtPm1fd2ViU2V0dGluZ3MtPmFyZUNvb2tpZXNFbmFibGVkKCk7Cit9CisK
K3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZEFkZEJhY2tGb3J3
YXJkSXRlbShIaXN0b3J5SXRlbSogaXRlbSkgY29uc3QKK3sKKyAgICAvLyBJbmZvcm0gdGhlIGNs
aWVudCB0aGF0IHRoZSBiYWNrL2ZvcndhcmQgbGlzdCBoYXMgY2hhbmdlZC4KKyAgICBpbnZhbGlk
YXRlQmFja0ZvcndhcmRMaXN0KCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0Jl
cnJ5OjpkaXNwYXRjaERpZFJlbW92ZUJhY2tGb3J3YXJkSXRlbShIaXN0b3J5SXRlbSogaXRlbSkg
Y29uc3QKK3sKKyAgICBpbnZhbGlkYXRlQmFja0ZvcndhcmRMaXN0KCk7Cit9CisKK3ZvaWQgRnJh
bWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZENoYW5nZUJhY2tGb3J3YXJkSW5k
ZXgoKSBjb25zdAoreworICAgIGludmFsaWRhdGVCYWNrRm9yd2FyZExpc3QoKTsKK30KKwordm9p
ZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkQ2hhbmdlTG9jYXRpb25X
aXRoaW5QYWdlKCkKK3sKKyAgICBpZiAoIWlzTWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIFN0cmluZyB1cmwgPSBtX2ZyYW1lLT5kb2N1bWVudCgpLT51cmwoKS5zdHJpbmcoKTsK
KyAgICBTdHJpbmcgdG9rZW4gPSBtX2ZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKS0+
cmVxdWVzdCgpLnRva2VuKCk7CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+bm90
aWZ5TG9hZFRvQW5jaG9yKHVybC5jaGFyYWN0ZXJzKCksIHVybC5sZW5ndGgoKSwgdG9rZW4uY2hh
cmFjdGVycygpLCB0b2tlbi5sZW5ndGgoKSk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5OjpkaXNwYXRjaERpZFB1c2hTdGF0ZVdpdGhpblBhZ2UoKQoreworICAgIC8vIEZJ
WE1FOiBBcyBhIHdvcmthcm91bmQgd2UgYWJ1c2UgYW5jaG9yIG5hdmlnYXRpb24gdG8gYWNoaWV2
ZSBoaXN0b3J5IHB1c2guIFNlZSBQUiAjMTE5Nzc5IGZvciBtb3JlIGRldGFpbHMuCisgICAgZGlz
cGF0Y2hEaWRDaGFuZ2VMb2NhdGlvbldpdGhpblBhZ2UoKTsKK30KKwordm9pZCBGcmFtZUxvYWRl
ckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkUmVwbGFjZVN0YXRlV2l0aGluUGFnZSgpCit7
CisgICAgLy8gRklYTUU6IEFzIGEgd29ya2Fyb3VuZCB3ZSBhYnVzZSBhbmNob3IgbmF2aWdhdGlv
biB0byBhY2hpZXZlIGhpc3RvcnkgcmVwbGFjZS4gU2VlIFBSICMxMTk3NzkgZm9yIG1vcmUgZGV0
YWlscy4KKyAgICBkaXNwYXRjaERpZENoYW5nZUxvY2F0aW9uV2l0aGluUGFnZSgpOworfQorCit2
b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRQb3BTdGF0ZVdpdGhp
blBhZ2UoKQoreworICAgIC8vIE5vdCBuZWVkZWQuCit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGll
bnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZENhbmNlbENsaWVudFJlZGlyZWN0KCkKK3sKKyAgICBt
X2NsaWVudFJlZGlyZWN0SXNQZW5kaW5nID0gZmFsc2U7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJD
bGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaFdpbGxQZXJmb3JtQ2xpZW50UmVkaXJlY3QoY29uc3Qg
S1VSTCYsIGRvdWJsZSwgZG91YmxlKQoreworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1
bXBSZW5kZXJUcmVlKQorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVl
LT5kaWREaXNwYXRjaFdpbGxQZXJmb3JtQ2xpZW50UmVkaXJlY3QoKTsKKworICAgIG1fY2xpZW50
UmVkaXJlY3RJc1BlbmRpbmcgPSB0cnVlOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50Qmxh
Y2tCZXJyeTo6ZGlzcGF0Y2hEZWNpZGVQb2xpY3lGb3JSZXNwb25zZShGcmFtZVBvbGljeUZ1bmN0
aW9uIGZ1bmN0aW9uLCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSwgY29uc3QgUmVz
b3VyY2VSZXF1ZXN0JiByZXF1ZXN0KQoreworICAgIC8vIEZJWE1FOiBXaGF0IHNob3VsZCB3ZSBk
byBmb3IgSFRUUCBzdGF0dXMgY29kZSAyMDQgYW5kIDIwNSBhbmQgImFwcGxpY2F0aW9uL3ppcCI/
CisgICAgUG9saWN5QWN0aW9uIHBvbGljeSA9IFBvbGljeUlnbm9yZTsKKworICAgIGlmIChjb250
ZW50RGlzcG9zaXRpb25UeXBlKHJlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZCgiQ29udGVudC1EaXNw
b3NpdGlvbiIpKSA9PSBDb250ZW50RGlzcG9zaXRpb25BdHRhY2htZW50CisgICAgICAgIHx8IHJl
cXVlc3QuZm9yY2VEb3dubG9hZCgpKQorICAgICAgICBwb2xpY3kgPSBQb2xpY3lEb3dubG9hZDsK
KyAgICBlbHNlIGlmIChjYW5TaG93TUlNRVR5cGUocmVzcG9uc2UubWltZVR5cGUoKSkpCisgICAg
ICAgIHBvbGljeSA9IFBvbGljeVVzZTsKKyAgICBlbHNlIGlmICgoUmVzb3VyY2VSZXF1ZXN0OjpU
YXJnZXRJc01haW5GcmFtZSA9PSByZXF1ZXN0LnRhcmdldFR5cGUoKSkKKyAgICAgICAgICAgICAm
JiBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+ZG93bmxvYWRBbGxvd2VkKHJlcXVlc3QudXJs
KCkuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSkpCisgICAgICAgIHBvbGljeSA9IFBvbGljeURvd25s
b2FkOworCisgICAgKG1fZnJhbWUtPmxvYWRlcigpLT5wb2xpY3lDaGVja2VyKCktPipmdW5jdGlv
bikocG9saWN5KTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3Bh
dGNoRGVjaWRlUG9saWN5Rm9yTmF2aWdhdGlvbkFjdGlvbihGcmFtZVBvbGljeUZ1bmN0aW9uIGZ1
bmN0aW9uLCBjb25zdCBOYXZpZ2F0aW9uQWN0aW9uJiBhY3Rpb24sIGNvbnN0IFJlc291cmNlUmVx
dWVzdCYgcmVxdWVzdCwgUGFzc1JlZlB0cjxGb3JtU3RhdGU+KQoreworICAgIFBvbGljeUFjdGlv
biBkZWNpc2lvbiA9IFBvbGljeVVzZTsKKworICAgIGNvbnN0IEtVUkwmIHVybCA9IHJlcXVlc3Qu
dXJsKCk7CisKKyAgICAvLyBGcmFnbWVudCBzY3JvbGxzIG9uIHRoZSBzYW1lIHBhZ2Ugc2hvdWxk
IGFsd2F5cyBiZSBoYW5kbGVkIGludGVybmFsbHkuCisgICAgLy8gKE9ubHkgY291bnQgYXMgYSBm
cmFnbWVudCBzY3JvbGwgaWYgd2UgYXJlIHNjcm9sbGluZyB0byBhICNmcmFnbWVudCB1cmwsIG5v
dCBiYWNrIHRvIHRoZSB0b3AsIGFuZCByZWxvYWRpbmcKKyAgICAvLyB0aGUgc2FtZSB1cmwgaXMg
bm90IGEgZnJhZ21lbnQgc2Nyb2xsIGV2ZW4gaWYgaXQgaGFzIGEgI2ZyYWdtZW50LikKKyAgICBj
b25zdCBLVVJMJiBjdXJyZW50VXJsID0gbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCk7CisgICAg
Ym9vbCBpc0ZyYWdtZW50U2Nyb2xsID0gdXJsLmhhc0ZyYWdtZW50SWRlbnRpZmllcigpICYmIHVy
bCAhPSBjdXJyZW50VXJsICYmIGVxdWFsSWdub3JpbmdGcmFnbWVudElkZW50aWZpZXIoY3VycmVu
dFVybCwgdXJsKTsKKyAgICBpZiAoZGVjaXNpb24gPT0gUG9saWN5VXNlKQorICAgICAgICBkZWNp
c2lvbiA9IGRlY2lkZVBvbGljeUZvckV4dGVybmFsTG9hZChyZXF1ZXN0LCBpc0ZyYWdtZW50U2Ny
b2xsKTsKKworICAgIC8vIExldCB0aGUgY2xpZW50IGhhdmUgYSBjaGFuY2UgdG8gc2F5IHdoZXRo
ZXIgdGhpcyBuYXZpZ2F0aW9uIHNob3VsZAorICAgIC8vIGJlIGlnbm9yZWQgb3Igbm90LgorICAg
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdCBwbGF0Zm9ybVJlcXVlc3Q7Cisg
ICAgcmVxdWVzdC5pbml0aWFsaXplUGxhdGZvcm1SZXF1ZXN0KHBsYXRmb3JtUmVxdWVzdCwgZmFs
c2UgLyppc0luaXRpYWwqLyk7CisgICAgaWYgKGlzTWFpbkZyYW1lKCkgJiYgIW1fd2ViUGFnZVBy
aXZhdGUtPm1fY2xpZW50LT5hY2NlcHROYXZpZ2F0aW9uUmVxdWVzdCgKKyAgICAgICAgcGxhdGZv
cm1SZXF1ZXN0LCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmF2aWdhdGlvblR5cGUoYWN0aW9uLnR5
cGUoKSkpKSB7CisgICAgICAgIGlmIChhY3Rpb24udHlwZSgpID09IE5hdmlnYXRpb25UeXBlRm9y
bVN1Ym1pdHRlZAorICAgICAgICAgICAgfHwgYWN0aW9uLnR5cGUoKSA9PSBOYXZpZ2F0aW9uVHlw
ZUZvcm1SZXN1Ym1pdHRlZCkKKyAgICAgICAgICAgIG1fZnJhbWUtPmxvYWRlcigpLT5yZXNldE11
bHRpcGxlRm9ybVN1Ym1pc3Npb25Qcm90ZWN0aW9uKCk7CisKKyAgICAgICAgaWYgKGFjdGlvbi50
eXBlKCkgPT0gTmF2aWdhdGlvblR5cGVMaW5rQ2xpY2tlZCAmJiB1cmwuaGFzRnJhZ21lbnRJZGVu
dGlmaWVyKCkpIHsKKyAgICAgICAgICAgIFJlc291cmNlUmVxdWVzdCBlbXB0eVJlcXVlc3Q7Cisg
ICAgICAgICAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+YWN0aXZlRG9jdW1lbnRMb2FkZXIoKS0+c2V0
TGFzdENoZWNrZWRSZXF1ZXN0KGVtcHR5UmVxdWVzdCk7CisgICAgICAgIH0KKyAgICAgICAgZGVj
aXNpb24gPSBQb2xpY3lJZ25vcmU7CisgICAgfQorCisgICAgLy8gSWYgd2UgYWJvcnQgaGVyZSwg
ZGlzcGF0Y2hEaWRDYW5jZWxDbGllbnRSZWRpcmVjdCB3aWxsIG5vdCBiZSBjYWxsZWQuCisgICAg
Ly8gU28gY2FsbCBpdCBieSBoYW5kLgorICAgIGlmIChkZWNpc2lvbiA9PSBQb2xpY3lJZ25vcmUp
CisgICAgICAgIGRpc3BhdGNoRGlkQ2FuY2VsQ2xpZW50UmVkaXJlY3QoKTsKKworICAgIChtX2Zy
YW1lLT5sb2FkZXIoKS0+cG9saWN5Q2hlY2tlcigpLT4qZnVuY3Rpb24pKGRlY2lzaW9uKTsKKwor
ICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlKQorICAgICAgICBtX3dl
YlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlLT5kaWREZWNpZGVQb2xpY3lGb3JOYXZpZ2F0
aW9uQWN0aW9uKGFjdGlvbiwgcmVxdWVzdCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5OjpkZWxheVBvbGljeUNoZWNrVW50aWxGcmFnbWVudEV4aXN0cyhjb25zdCBTdHJp
bmcmIGZyYWdtZW50LCBGcmFtZVBvbGljeUZ1bmN0aW9uIGZ1bmN0aW9uKQoreworICAgIEFTU0VS
VChpc01haW5GcmFtZSgpKTsKKworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5sb2FkU3RhdGUo
KSA8IFdlYlBhZ2VQcml2YXRlOjpGaW5pc2hlZCAmJiAhbV9mcmFtZS0+ZG9jdW1lbnQoKS0+Zmlu
ZEFuY2hvcihmcmFnbWVudCkpIHsKKyAgICAgICAgLy8gVGVsbCB0aGUgY2xpZW50IHdlIG5lZWQg
bW9yZSBkYXRhLCBpbiBjYXNlIHRoZSBmcmFnbWVudCBleGlzdHMgYnV0IGlzIGJlaW5nIGhlbGQg
YmFjay4KKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5lZWRNb3JlRGF0YSgp
OworICAgICAgICBtX3BlbmRpbmdGcmFnbWVudFNjcm9sbFBvbGljeUZ1bmN0aW9uID0gZnVuY3Rp
b247CisgICAgICAgIG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsID0gZnJhZ21lbnQ7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICAobV9mcmFtZS0+bG9hZGVyKCktPnBvbGljeUNoZWNrZXIo
KS0+KmZ1bmN0aW9uKShQb2xpY3lVc2UpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50Qmxh
Y2tCZXJyeTo6Y2FuY2VsUG9saWN5Q2hlY2soKQoreworICAgIG1fcGVuZGluZ0ZyYWdtZW50U2Ny
b2xsUG9saWN5RnVuY3Rpb24gPSAwOworICAgIG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsID0gU3Ry
aW5nKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpkb1BlbmRpbmdG
cmFnbWVudFNjcm9sbCgpCit7CisgICAgaWYgKG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsLmlzTnVs
bCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBNYWtlIHN1cmUgdG8gY2xlYXIgdGhlIHBl
bmRpbmcgbWVtYmVycyBmaXJzdCB0byBhdm9pZCByZWN1cnNpb24uCisgICAgU3RyaW5nIGZyYWdt
ZW50ID0gbV9wZW5kaW5nRnJhZ21lbnRTY3JvbGw7CisgICAgbV9wZW5kaW5nRnJhZ21lbnRTY3Jv
bGwgPSBTdHJpbmcoKTsKKworICAgIEZyYW1lUG9saWN5RnVuY3Rpb24gZnVuY3Rpb24gPSBtX3Bl
bmRpbmdGcmFnbWVudFNjcm9sbFBvbGljeUZ1bmN0aW9uOworICAgIG1fcGVuZGluZ0ZyYWdtZW50
U2Nyb2xsUG9saWN5RnVuY3Rpb24gPSAwOworCisgICAgZGVsYXlQb2xpY3lDaGVja1VudGlsRnJh
Z21lbnRFeGlzdHMoZnJhZ21lbnQsIGZ1bmN0aW9uKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNs
aWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGVjaWRlUG9saWN5Rm9yTmV3V2luZG93QWN0aW9uKEZy
YW1lUG9saWN5RnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IE5hdmlnYXRpb25BY3Rpb24mLCBjb25z
dCBSZXNvdXJjZVJlcXVlc3QmIHJlcXVlc3QsIFBhc3NSZWZQdHI8Rm9ybVN0YXRlPiwgY29uc3Qg
U3RyaW5nJiBmcmFtZU5hbWUpCit7CisgICAgaWYgKHJlcXVlc3QuaXNSZXF1ZXN0ZWRCeVBsdWdp
bigpICYmIFNjcmlwdENvbnRyb2xsZXI6OnByb2Nlc3NpbmdVc2VyR2VzdHVyZSgpICYmICFtX3dl
YlBhZ2VQcml2YXRlLT5tX3BsdWdpbk1heU9wZW5OZXdUYWIpCisgICAgICAgIChtX2ZyYW1lLT5s
b2FkZXIoKS0+cG9saWN5Q2hlY2tlcigpLT4qZnVuY3Rpb24pKFBvbGljeUlnbm9yZSk7CisKKyAg
ICAvLyBBIG5ldyB3aW5kb3cgY2FuIG5ldmVyIGJlIGEgZnJhZ21lbnQgc2Nyb2xsLgorICAgIFBv
bGljeUFjdGlvbiBkZWNpc2lvbiA9IGRlY2lkZVBvbGljeUZvckV4dGVybmFsTG9hZChyZXF1ZXN0
LCBmYWxzZSk7CisgICAgKG1fZnJhbWUtPmxvYWRlcigpLT5wb2xpY3lDaGVja2VyKCktPipmdW5j
dGlvbikoZGVjaXNpb24pOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6
Y29tbWl0dGVkTG9hZChEb2N1bWVudExvYWRlciogbG9hZGVyLCBjb25zdCBjaGFyKiBkYXRhLCBp
bnQgbGVuZ3RoKQoreworICAgIC8vIFRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBjb2RlIG1heSBzZWVt
Li4uYSBiaXQgb2RkLiBJdCdzIHN0cnVjdHVyZWQgd2l0aCB0d28gY2hlY2tzIG9uIHRoZSBzdGF0
ZQorICAgIC8vIG9mIG1fcGx1Z2luVmlldyBiZWNhdXNlIGl0J3MgYWN0dWFsbHkgcmVjZWl2ZWRE
YXRhIHRoYXQgbWF5IGNhdXNlIHRoZSByZXF1ZXN0IHRvIHJlLWRpcmVjdCBkYXRhCisgICAgLy8g
dG8gYSBQbHVnaW5WaWV3LiBUaGlzIGlzIGJlY2F1c2UgcmVjZWl2ZWREYXRhIG1heSBkZWNpZGUg
dG8gY3JlYXRlIGEgUGx1Z2luRG9jdW1lbnQgY29udGFpbmluZworICAgIC8vIGEgUGx1Z2luVmll
dy4gVGhlIFBsdWdpblZpZXcgd2lsbCByZXF1ZXN0IHRoYXQgdGhlIG1haW4gcmVzb3VyY2UgZm9y
IHRoZSBmcmFtZSBiZSByZWRpcmVjdGVkCisgICAgLy8gdG8gdGhlIFBsdWdpblZpZXcuIFNvIGFm
dGVyIHJlY2VpdmVkRGF0YSBoYXMgYmVlbiBjYWxsZWQsIHRoaXMgY29kZSBuZWVkcyB0byBjaGVj
ayB3aGV0aGVyCisgICAgLy8gcmUtZGlyZWN0aW9uIHRvIGEgUGx1Z2luVmlldyBoYXMgYmVlbiBy
ZXF1ZXN0ZWQgYW5kIHBhc3MgdGhlIHNhbWUgZGF0YSBvbiB0byB0aGUgUGx1Z2luVmlldy4KKyAg
ICAvLyBUaGVyZWFmdGVyLCBhbGwgZGF0YSB3aWxsIGJlIHJlLWRpcmVjdGVkIHRvIHRoZSBQbHVn
aW5WaWV3OyBpLmUuLCBubyBhZGRpdGlvbmFsIGRhdGEgd2lsbCBnbworICAgIC8vIHRvIHJlY2Vp
dmVkRGF0YS4KKworICAgIGlmICghbV9wbHVnaW5WaWV3KSB7CisgICAgICAgIGNvbnN0IFN0cmlu
ZyYgdGV4dEVuY29kaW5nID0gbG9hZGVyLT5yZXNwb25zZSgpLnRleHRFbmNvZGluZ05hbWUoKTsK
KyAgICAgICAgcmVjZWl2ZWREYXRhKGRhdGEsIGxlbmd0aCwgdGV4dEVuY29kaW5nKTsKKyAgICB9
CisKKyAgICBpZiAobV9wbHVnaW5WaWV3KSB7CisgICAgICAgIGlmICghbV9oYXNTZW50UmVzcG9u
c2VUb1BsdWdpbikgeworICAgICAgICAgICAgbV9wbHVnaW5WaWV3LT5kaWRSZWNlaXZlUmVzcG9u
c2UobG9hZGVyLT5yZXNwb25zZSgpKTsKKyAgICAgICAgICAgIG1faGFzU2VudFJlc3BvbnNlVG9Q
bHVnaW4gPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtX3BsdWdpblZpZXcpCisg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgbV9wbHVnaW5WaWV3LT5kaWRSZWNlaXZlRGF0
YShkYXRhLCBsZW5ndGgpOworICAgIH0KK30KKworUGFzc1JlZlB0cjxXaWRnZXQ+IEZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y3JlYXRlUGx1Z2luKGNvbnN0IEludFNpemUmIHBsdWdpblNp
emUsCisgICAgSFRNTFBsdWdJbkVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IEtVUkwmIHVybCwgY29u
c3QgVmVjdG9yPFN0cmluZz4mIHBhcmFtTmFtZXMsCisgICAgY29uc3QgVmVjdG9yPFN0cmluZz4m
IHBhcmFtVmFsdWVzLCBjb25zdCBTdHJpbmcmIG1pbWVUeXBlSW4sIGJvb2wgbG9hZE1hbnVhbGx5
KQoreworICAgIFN0cmluZyBtaW1lVHlwZShtaW1lVHlwZUluKTsKKyAgICBpZiAobWltZVR5cGUu
aXNFbXB0eSgpKSB7CisgICAgICAgIG1pbWVUeXBlID0gTUlNRVR5cGVSZWdpc3RyeTo6Z2V0TUlN
RVR5cGVGb3JQYXRoKHVybC5wYXRoKCkpOworICAgICAgICBtaW1lVHlwZSA9IFdlYlNldHRpbmdz
OjpnZXROb3JtYWxpemVkTUlNRVR5cGUobWltZVR5cGUpOworICAgICAgICBpZiAobWltZVR5cGUg
IT0gImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIikKKyAgICAgICAgICAgIG1pbWVUeXBl
ID0gbWltZVR5cGVJbjsKKyAgICB9CisKKyAgICBpZiAobWltZVR5cGUgPT0gImFwcGxpY2F0aW9u
L3gtc2hvY2t3YXZlLWZsYXNoIiB8fCBtaW1lVHlwZSA9PSAiYXBwbGljYXRpb24vam5leHQtc2Ny
aXB0YWJsZS1wbHVnaW4iKQorICAgICAgICByZXR1cm4gUGx1Z2luVmlldzo6Y3JlYXRlKG1fZnJh
bWUsIHBsdWdpblNpemUsIGVsZW1lbnQsIHVybCwgcGFyYW1OYW1lcywgcGFyYW1WYWx1ZXMsIG1p
bWVUeXBlLCBsb2FkTWFudWFsbHkpOworCisgICAgLy8gSWYgaXQncyBub3QgdGhlIHBsdWdpbiB0
eXBlIHdlIHN1cHBvcnQsIHRyeSBsb2FkIGRpcmVjdGx5IGZyb20gYnJvd3Nlci4KKyAgICBpZiAo
bV9mcmFtZS0+bG9hZGVyKCkgJiYgbV9mcmFtZS0+bG9hZGVyKCktPnN1YmZyYW1lTG9hZGVyKCkg
JiYgIXVybC5pc051bGwoKSkKKyAgICAgICAgbV9mcmFtZS0+bG9hZGVyKCktPnN1YmZyYW1lTG9h
ZGVyKCktPnJlcXVlc3RGcmFtZShlbGVtZW50LCB1cmwsIFN0cmluZygpKTsKKworICAgIHJldHVy
biAwOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6cmVkaXJlY3REYXRh
VG9QbHVnaW4oV2lkZ2V0KiBwbHVnaW5XaWRnZXQpCit7CisgICAgQVNTRVJUKCFtX3BsdWdpblZp
ZXcpOworICAgIG1fcGx1Z2luVmlldyA9IHN0YXRpY19jYXN0PFBsdWdpblZpZXcqPihwbHVnaW5X
aWRnZXQpOworICAgIG1faGFzU2VudFJlc3BvbnNlVG9QbHVnaW4gPSBmYWxzZTsKK30KKwordm9p
ZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OnJlY2VpdmVkRGF0YShjb25zdCBjaGFyKiBk
YXRhLCBpbnQgbGVuZ3RoLCBjb25zdCBTdHJpbmcmIHRleHRFbmNvZGluZykKK3sKKyAgICBpZiAo
IW1fZnJhbWUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX2NhbmNlbExvYWRPbk5leHRE
YXRhKSB7CisgICAgICAgIG1fZnJhbWUtPmxvYWRlcigpLT5hY3RpdmVEb2N1bWVudExvYWRlcigp
LT5zdG9wTG9hZGluZygpOworICAgICAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2Fk
ZXIoKS0+d3JpdGVyKCktPmVuZCgpOworICAgICAgICBtX2NhbmNlbExvYWRPbk5leHREYXRhID0g
ZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIGVuY29kaW5n
LiBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBvbmNlLCBidXQgaXQncyBoYXJtbGVzcyB0byBk
byBpdCBhZ2FpbiBsYXRlci4KKyAgICBTdHJpbmcgZW5jb2RpbmcgPSBtX2ZyYW1lLT5sb2FkZXIo
KS0+ZG9jdW1lbnRMb2FkZXIoKS0+b3ZlcnJpZGVFbmNvZGluZygpOworICAgIGJvb2wgdXNlckNo
b3NlbiA9ICFlbmNvZGluZy5pc051bGwoKTsKKyAgICBpZiAoZW5jb2RpbmcuaXNOdWxsKCkpCisg
ICAgICAgIGVuY29kaW5nID0gdGV4dEVuY29kaW5nOworICAgIG1fZnJhbWUtPmxvYWRlcigpLT5k
b2N1bWVudExvYWRlcigpLT53cml0ZXIoKS0+c2V0RW5jb2RpbmcoZW5jb2RpbmcsIHVzZXJDaG9z
ZW4pOworICAgIG1fZnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigpLT53cml0ZXIoKS0+
YWRkRGF0YShkYXRhLCBsZW5ndGgpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tC
ZXJyeTo6ZmluaXNoZWRMb2FkaW5nKERvY3VtZW50TG9hZGVyKiBsb2FkZXIpCit7CisgICAgaWYg
KG1fcGx1Z2luVmlldykgeworICAgICAgICBtX3BsdWdpblZpZXctPmRpZEZpbmlzaExvYWRpbmco
KTsKKyAgICAgICAgbV9wbHVnaW5WaWV3ID0gMDsKKyAgICAgICAgbV9oYXNTZW50UmVzcG9uc2VU
b1BsdWdpbiA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRlbGxpbmcgdGhlIGZy
YW1lIHdlIHJlY2VpdmVkIHNvbWUgZGF0YSBhbmQgcGFzc2luZyAwIGFzIHRoZSBkYXRhIGlzIG91
cgorICAgICAgICAvLyB3YXkgdG8gZ2V0IHdvcmsgZG9uZSB0aGF0IGlzIG5vcm1hbGx5IGRvbmUg
d2hlbiB0aGUgZmlyc3QgYml0IG9mIGRhdGEgaXMKKyAgICAgICAgLy8gcmVjZWl2ZWQsIGV2ZW4g
Zm9yIHRoZSBjYXNlIG9mIGEgZG9jdW1lbnQgd2l0aCBubyBkYXRhIChsaWtlIGFib3V0OmJsYW5r
KS4KKyAgICAgICAgY29tbWl0dGVkTG9hZChsb2FkZXIsIDAsIDApOworICAgIH0KK30KKworUGFz
c1JlZlB0cjxEb2N1bWVudExvYWRlcj4gRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpjcmVh
dGVEb2N1bWVudExvYWRlcihjb25zdCBSZXNvdXJjZVJlcXVlc3QmIHJlcXVlc3QsIGNvbnN0IFN1
YnN0aXR1dGVEYXRhJiBzdWJzdGl0dXRlRGF0YSkKK3sKKyAgICAvLyBNYWtlIGEgY29weSBvZiB0
aGUgcmVxdWVzdCB3aXRoIHRoZSB0b2tlbiBmcm9tIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGZvciB0
aGlzIGZyYW1lCisgICAgLy8gKHVubGVzcyBpdCBhbHJlYWR5IGhhcyBhIHRva2VuLCBpbiB3aGlj
aCBjYXNlIHRoZSByZXF1ZXN0IGNhbWUgZnJvbSB0aGUgY2xpZW50KS4KKyAgICBSZXNvdXJjZVJl
cXVlc3QgbmV3UmVxdWVzdChyZXF1ZXN0KTsKKyAgICBpZiAobV9mcmFtZSAmJiBtX2ZyYW1lLT5s
b2FkZXIoKSAmJiBtX2ZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKSkgeworICAgICAg
ICBjb25zdCBSZXNvdXJjZVJlcXVlc3QmIG9yaWdpbmFsUmVxdWVzdCA9IG1fZnJhbWUtPmxvYWRl
cigpLT5kb2N1bWVudExvYWRlcigpLT5vcmlnaW5hbFJlcXVlc3QoKTsKKyAgICAgICAgaWYgKHJl
cXVlc3QudG9rZW4oKS5pc051bGwoKSAmJiAhb3JpZ2luYWxSZXF1ZXN0LnRva2VuKCkuaXNOdWxs
KCkpCisgICAgICAgICAgICBuZXdSZXF1ZXN0LnNldFRva2VuKG9yaWdpbmFsUmVxdWVzdC50b2tl
bigpKTsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgc2hh
cmVkLgorICAgIFJlZlB0cjxEb2N1bWVudExvYWRlcj4gbG9hZGVyID0gRG9jdW1lbnRMb2FkZXI6
OmNyZWF0ZShuZXdSZXF1ZXN0LCBzdWJzdGl0dXRlRGF0YSk7CisgICAgaWYgKHN1YnN0aXR1dGVE
YXRhLmlzVmFsaWQoKSkKKyAgICAgICAgbG9hZGVyLT5zZXREZWZlck1haW5SZXNvdXJjZURhdGFM
b2FkKGZhbHNlKTsKKyAgICByZXR1cm4gbG9hZGVyLnJlbGVhc2UoKTsKK30KKwordm9pZCBGcmFt
ZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmZyYW1lTG9hZGVyRGVzdHJveWVkKCkKK3sKKyAgICBk
ZWxldGUgdGhpczsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OnRyYW5z
aXRpb25Ub0NvbW1pdHRlZEZvck5ld1BhZ2UoKQoreworICAgIG1fY2FuY2VsTG9hZE9uTmV4dERh
dGEgPSBmYWxzZTsKKworICAgIC8vIEluIEZyYW1lOjpjcmVhdGVWaWV3LCBGcmFtZSdzIEZyYW1l
VmlldyBvYmplY3QgaXMgc2V0IHRvIDAgYW5kIHJlY3JlYXRlZC4KKyAgICAvLyBUaGlzIG9wZXJh
dGlvbiBpcyBub3QgYXRvbWljLCBhbmQgYW4gYXR0ZW1wdCB0byBibGl0IGNvbnRlbnRzIG1pZ2h0
IGhhcHBlbgorICAgIC8vIGluIHRoZSBiYWNraW5nIHN0b3JlIGZyb20gYW5vdGhlciB0aHJlYWQg
KHNlZSBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0Q29udGVudHMgbWV0aG9kKSwKKyAgICAvLyBz
byB3ZSBzdXNwZW5kIGFuZCByZXN1bWUgc2NyZWVuIHVwZGF0ZSB0byBtYWtlIHN1cmUgd2UgZG8g
bm90IGdldCBhIGludmFsaWQgRnJhbWVWaWV3CisgICAgLy8gc3RhdGUuCisgICAgQmFja2luZ1N0
b3JlQ2xpZW50KiBiYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZSA9IG1fd2ViUGFnZVByaXZhdGUt
PmJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKG1fZnJhbWUpOworICAgIGlmIChiYWNraW5nU3Rv
cmVDbGllbnRGb3JGcmFtZSkKKyAgICAgICAgYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUtPmJh
Y2tpbmdTdG9yZSgpLT5kLT5zdXNwZW5kU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcygpOwor
CisgICAgLy8gV2UgYXJlIG5hdmlnYXRpbmcgYXdheSBmcm9tIHRoaXMgZG9jdW1lbnQsIHNvIGNs
ZWFuIHVwIGFueSBmb290cHJpbnQgd2UgbWlnaHQgaGF2ZS4KKyAgICBpZiAobV9mcmFtZS0+ZG9j
dW1lbnQoKSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+Y2xlYXJEb2N1bWVudERhdGEobV9m
cmFtZS0+ZG9jdW1lbnQoKSk7CisKKyAgICBDb2xvciBiYWNrZ3JvdW5kQ29sb3IobV93ZWJQYWdl
UHJpdmF0ZS0+bV93ZWJTZXR0aW5ncy0+YmFja2dyb3VuZENvbG9yKCkpOworCisgICAgbV9mcmFt
ZS0+Y3JlYXRlVmlldyhtX3dlYlBhZ2VQcml2YXRlLT52aWV3cG9ydFNpemUoKSwgICAgICAvKiB2
aWV3cG9ydCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yLCAgICAg
ICAgICAgICAgICAgICAgICAgLyogYmFja2dyb3VuZCBjb2xvciAqLworICAgICAgICAgICAgICAg
ICAgICAgICAgYmFja2dyb3VuZENvbG9yLmhhc0FscGhhKCksICAgICAgICAgICAgLyogaXMgdHJh
bnNwYXJlbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPmFj
dHVhbFZpc2libGVTaXplKCksIC8qIGZpeGVkIHJlcG9ydGVkIHNpemUgKi8KKyAgICAgICAgICAg
ICAgICAgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPmZpeGVkTGF5b3V0U2l6ZSgpLCAgIC8qIGZp
eGVkIGxheW91dCBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICBtX3dlYlBhZ2VQcml2
YXRlLT51c2VGaXhlZExheW91dCgpLCAgICAvKiB1c2UgZml4ZWQgbGF5b3V0ICovCisgICAgICAg
ICAgICAgICAgICAgICAgICBTY3JvbGxiYXJBbHdheXNPZmYsICAgICAgICAgICAgICAgICAgICAv
KiBob3IgbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgLyogbG9jayB0aGUgbW9kZSAqLworICAgICAgICAgICAgICAg
ICAgICAgICAgU2Nyb2xsYmFyQWx3YXlzT2ZmLCAgICAgICAgICAgICAgICAgICAgLyogdmVyIG1v
ZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8qIGxvY2sgdGhlIG1vZGUgKi8KKworICAgIGlmIChiYWNraW5nU3RvcmVD
bGllbnRGb3JGcmFtZSkKKyAgICAgICAgYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUtPmJhY2tp
bmdTdG9yZSgpLT5kLT5yZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKEJhY2tpbmdT
dG9yZTo6Tm9uZSk7CisgICAgbV9mcmFtZS0+dmlldygpLT51cGRhdGVDYW5IYXZlU2Nyb2xsYmFy
cygpOworCisgICAgaWYgKGlzTWFpbkZyYW1lKCkpIHsKKyAgICAgICAgLy8gU2luY2UgdGhlIG1h
aW5mcmFtZSBoYXMgYSB0aWxlZCBiYWNraW5nc3RvcmUgcmVxdWVzdCB0byByZWNlaXZlIGFsbCB1
cGRhdGUKKyAgICAgICAgLy8gcmVjdHMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCB3aGljaCBqdXN0
IHNlbmRzIHVwZGF0ZSByZWN0cyBmb3IgY3VycmVudGx5CisgICAgICAgIC8vIHZpc2libGUgdmll
d3BvcnQuCisgICAgICAgIG1fZnJhbWUtPnZpZXcoKS0+c2V0UGFpbnRzRW50aXJlQ29udGVudHMo
dHJ1ZSk7CisgICAgfQorfQorCitTdHJpbmcgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojp1
c2VyQWdlbnQoY29uc3QgS1VSTCYpCit7CisgICAgcmV0dXJuIG1fd2ViUGFnZVByaXZhdGUtPm1f
d2ViU2V0dGluZ3MtPnVzZXJBZ2VudFN0cmluZygpOworfQorCitib29sIEZyYW1lTG9hZGVyQ2xp
ZW50QmxhY2tCZXJyeTo6Y2FuSGFuZGxlUmVxdWVzdChjb25zdCBSZXNvdXJjZVJlcXVlc3QmKSBj
b25zdAoreworICAgIC8vIEZJWE1FOiBTdHViLgorICAgIHJldHVybiB0cnVlOworfQorCitib29s
IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y2FuU2hvd01JTUVUeXBlKGNvbnN0IFN0cmlu
ZyYgbWltZVR5cGVJbikgY29uc3QKK3sKKyAgICAvLyBHZXQgbm9ybWFsaXplZCB0eXBlLgorICAg
IFN0cmluZyBtaW1lVHlwZSA9IFdlYlNldHRpbmdzOjpnZXROb3JtYWxpemVkTUlNRVR5cGUobWlt
ZVR5cGVJbik7CisKKyAgICAvLyBGSVhNRTogU2VlbXMgbm8gb3RoZXIgcG9ydCBjaGVja3MgZW1w
dHkgTUlNRSB0eXBlIGluIHRoaXMgZnVuY3Rpb24uIFNob3VsZCB3ZSBkbyB0aGF0PworICAgIHJl
dHVybiBNSU1FVHlwZVJlZ2lzdHJ5Ojppc1N1cHBvcnRlZEltYWdlTUlNRVR5cGUobWltZVR5cGUp
IHx8IE1JTUVUeXBlUmVnaXN0cnk6OmlzU3VwcG9ydGVkTm9uSW1hZ2VNSU1FVHlwZShtaW1lVHlw
ZSkKKyAgICAgICAgfHwgTUlNRVR5cGVSZWdpc3RyeTo6aXNTdXBwb3J0ZWRNZWRpYU1JTUVUeXBl
KG1pbWVUeXBlKSB8fCBXZWJTZXR0aW5nczo6aXNTdXBwb3J0ZWRPYmplY3RNSU1FVHlwZShtaW1l
VHlwZSkKKyAgICAgICAgfHwgKG1pbWVUeXBlID09ICJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1m
bGFzaCIpOworfQorCitib29sIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6Y2FuU2hvd01J
TUVUeXBlQXNIVE1MKGNvbnN0IFN0cmluZyYpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IFN0dWIu
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5
Ojppc01haW5GcmFtZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZnJhbWUgPT0gbV93ZWJQYWdl
UHJpdmF0ZS0+bV9tYWluRnJhbWU7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0Jl
cnJ5OjpkaXNwYXRjaERpZFN0YXJ0UHJvdmlzaW9uYWxMb2FkKCkKK3sKKyAgICBpZiAoaXNNYWlu
RnJhbWUoKSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+c2V0TG9hZFN0YXRlKFdlYlBhZ2VQ
cml2YXRlOjpQcm92aXNpb25hbCk7CisKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1w
UmVuZGVyVHJlZSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZS0+
ZGlkU3RhcnRQcm92aXNpb25hbExvYWRGb3JGcmFtZShtX2ZyYW1lKTsKK30KKwordm9pZCBGcmFt
ZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkUmVjZWl2ZVJlc3BvbnNlKERvY3Vt
ZW50TG9hZGVyKiwgdW5zaWduZWQgbG9uZyBpZGVudGlmaWVyLCBjb25zdCBSZXNvdXJjZVJlc3Bv
bnNlJiByZXNwb25zZSkKK3sKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVy
VHJlZSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZS0+ZGlkUmVj
ZWl2ZVJlc3BvbnNlRm9yRnJhbWUobV9mcmFtZSwgcmVzcG9uc2UpOworfQorCit2b2lkIEZyYW1l
TG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRSZWNlaXZlVGl0bGUoY29uc3QgU3Ry
aW5nV2l0aERpcmVjdGlvbiYgdGl0bGUpCit7CisgICAgaWYgKGlzTWFpbkZyYW1lKCkpCisgICAg
ICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5zZXRQYWdlVGl0bGUodGl0bGUuc3RyaW5n
KCkuY2hhcmFjdGVycygpLCB0aXRsZS5zdHJpbmcoKS5sZW5ndGgoKSk7CisKKyAgICBpZiAobV93
ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0
ZS0+bV9kdW1wUmVuZGVyVHJlZS0+ZGlkUmVjZWl2ZVRpdGxlRm9yRnJhbWUodGl0bGUuc3RyaW5n
KCksIG1fZnJhbWUpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6c2V0
VGl0bGUoY29uc3QgU3RyaW5nV2l0aERpcmVjdGlvbiYgLyp0aXRsZSovLCBjb25zdCBLVVJMJiAv
KnVybCovKQoreworICAgIC8vIFVzZWQgYnkgQXBwbGUgV2ViS2l0IHRvIHVwZGF0ZSB0aGUgdGl0
bGUgb2YgYW4gZXhpc3RpbmcgaGlzdG9yeSBpdGVtLgorICAgIC8vIFF0V2ViS2l0IGRvZXNuJ3Qg
YWNjb21vZGF0ZSB0aGlzIG9uIGhpc3RvcnkgaXRlbXMuIElmIGl0IGV2ZXIgZG9lcywKKyAgICAv
LyBpdCBzaG91bGQgYmUgcHJpdmF0ZUJyb3dzaW5nLWF3YXJlLiBGb3Igbm93LCB3ZSBhcmUganVz
dCBwYXNzaW5nCisgICAgLy8gZ2xvYmFsaGlzdG9yeSBsYXlvdXQgdGVzdHMuCisgICAgLy8gRklY
TUU6IFVzZSBkaXJlY3Rpb24gb2YgdGl0bGUuCisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwor
dm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkQ29tbWl0TG9hZCgp
Cit7CisgICAgLy8gRklYTUU6IERvIHdlIG5lZWQgdG8gZmluZCBhIHJlcGxhY2VtZW50IGZvciBt
X2ZyYW1lLT5kb2N1bWVudCgpLT5zZXRFeHRyYUxheW91dERlbGF5KDI1MCk7PworCisgICAgaWYg
KGlzTWFpbkZyYW1lKCkpIHsKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+c2V0TG9hZFN0YXRl
KFdlYlBhZ2VQcml2YXRlOjpDb21taXR0ZWQpOworCisgICAgICAgIFN0cmluZyBvcmlnaW5hbFVy
bCA9IG1fZnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigpLT5vcmlnaW5hbFJlcXVlc3Qo
KS51cmwoKS5zdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nIHVybCA9IG1fZnJhbWUtPmxvYWRlcigp
LT5kb2N1bWVudExvYWRlcigpLT5yZXF1ZXN0KCkudXJsKCkuc3RyaW5nKCk7CisgICAgICAgIFN0
cmluZyB0b2tlbiA9IG1fZnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigpLT5yZXF1ZXN0
KCkudG9rZW4oKTsKKworICAgICAgICAvLyBOb3RpZnkgdGhlIGNsaWVudCB0aGF0IHRoZSBsb2Fk
IHN1Y2NlZWRlZCBvciBmYWlsZWQgKGlmIGl0IGZhaWxlZCwgdGhpcworICAgICAgICAvLyBpcyBh
Y3R1YWxseSBjb21taXR0aW5nIHRoZSBlcnJvciBwYWdlLCB3aGljaCB3YXMgc2V0IHRocm91Z2gK
KyAgICAgICAgLy8gU3Vic3RpdHV0ZURhdGEgaW4gZGlzcGF0Y2hEaWRGYWlsUHJvdmlzaW9uYWxM
b2FkKS4KKyAgICAgICAgaWYgKG1fbG9hZGluZ0Vycm9yUGFnZSkgeworICAgICAgICAgICAgbV9s
b2FkaW5nRXJyb3JQYWdlID0gZmFsc2U7CisgICAgICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5t
X2NsaWVudC0+bm90aWZ5TG9hZEZhaWxlZEJlZm9yZUNvbW1pdCgKKyAgICAgICAgICAgICAgICBv
cmlnaW5hbFVybC5jaGFyYWN0ZXJzKCksIG9yaWdpbmFsVXJsLmxlbmd0aCgpLAorICAgICAgICAg
ICAgICAgICAgICB1cmwuY2hhcmFjdGVycygpLCB1cmwubGVuZ3RoKCksIHRva2VuLmNoYXJhY3Rl
cnMoKSwgdG9rZW4ubGVuZ3RoKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV93
ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlmeUxvYWRDb21taXR0ZWQoCisgICAgICAgICAg
ICAgICAgb3JpZ2luYWxVcmwuY2hhcmFjdGVycygpLCBvcmlnaW5hbFVybC5sZW5ndGgoKSwKKyAg
ICAgICAgICAgICAgICAgICAgdXJsLmNoYXJhY3RlcnMoKSwgdXJsLmxlbmd0aCgpLCB0b2tlbi5j
aGFyYWN0ZXJzKCksIHRva2VuLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlm
IChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlKQorICAgICAgICBtX3dlYlBhZ2VQ
cml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlLT5kaWRDb21taXRMb2FkRm9yRnJhbWUobV9mcmFtZSk7
Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaERpZEhhbmRs
ZU9ubG9hZEV2ZW50cygpCit7CisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlm
eURvY3VtZW50T25Mb2FkKCk7CisgICAgaWYgKG1fd2ViUGFnZVByaXZhdGUtPm1fZHVtcFJlbmRl
clRyZWUpCisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUtPmRpZEhh
bmRsZU9ubG9hZEV2ZW50c0ZvckZyYW1lKG1fZnJhbWUpOworfQorCit2b2lkIEZyYW1lTG9hZGVy
Q2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRGaW5pc2hMb2FkKCkKK3sKKyAgICBkaWRGaW5p
c2hPckZhaWxMb2FkaW5nKFJlc291cmNlRXJyb3IoKSk7CisKKyAgICBpZiAobV93ZWJQYWdlUHJp
dmF0ZS0+bV9kdW1wUmVuZGVyVHJlZSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1w
UmVuZGVyVHJlZS0+ZGlkRmluaXNoTG9hZEZvckZyYW1lKG1fZnJhbWUpOworCisgICAgaWYgKCFp
c01haW5GcmFtZSgpIHx8IG1fd2ViUGFnZVByaXZhdGUtPm1fd2ViU2V0dGluZ3MtPmlzRW1haWxN
b2RlKCkKKyAgICAgICAgfHwgIW1fZnJhbWUtPmRvY3VtZW50KCkgfHwgIW1fZnJhbWUtPmRvY3Vt
ZW50KCktPmhlYWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgSFRNTEhlYWRFbGVtZW50KiBo
ZWFkRWxlbWVudCA9IG1fZnJhbWUtPmRvY3VtZW50KCktPmhlYWQoKTsKKyAgICAvLyBGSVhNRTog
SGFuZGxlIE5PU0NSSVBUIHNwZWNpYWwgY2FzZT8KKworICAgIC8vIFByb2Nlc3MgZG9jdW1lbnQg
bWV0YWRhdGEuCisgICAgUmVmUHRyPE5vZGVMaXN0PiBub2RlTGlzdCA9IGhlYWRFbGVtZW50LT5n
ZXRFbGVtZW50c0J5VGFnTmFtZShIVE1MTmFtZXM6Om1ldGFUYWcubG9jYWxOYW1lKCkpOworICAg
IHVuc2lnbmVkIGludCBzaXplID0gbm9kZUxpc3QtPmxlbmd0aCgpOworICAgIFNjb3BlQXJyYXk8
V2ViU3RyaW5nPiBoZWFkZXJzOworCisgICAgLy8gVGhpcyBtYXkgYWxsb2NhdGUgbW9yZSBzcGFj
ZSB0aGFuIG5lZWRlZCBzaW5jZSBub3QgYWxsIG1ldGEgZWxlbWVudHMgd2lsbCBiZSBodHRwLWVx
dWl2LgorICAgIGhlYWRlcnMucmVzZXQobmV3IFdlYlN0cmluZ1syICogc2l6ZV0pOworICAgIHVu
c2lnbmVkIGhlYWRlcnNMZW5ndGggPSAwOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IHNpemU7ICsraSkgeworICAgICAgICBIVE1MTWV0YUVsZW1lbnQqIG1ldGFFbGVtZW50ID0gc3Rh
dGljX2Nhc3Q8SFRNTE1ldGFFbGVtZW50Kj4obm9kZUxpc3QtPml0ZW0oaSkpOworICAgICAgICBp
ZiAoV1RGOjplcXVhbElnbm9yaW5nQ2FzZShtZXRhRWxlbWVudC0+bmFtZSgpLCAiYXBwbGUtbW9i
aWxlLXdlYi1hcHAtY2FwYWJsZSIpCisgICAgICAgICAgICAmJiBXVEY6OmVxdWFsSWdub3JpbmdD
YXNlKG1ldGFFbGVtZW50LT5jb250ZW50KCkuc3RyaXBXaGl0ZVNwYWNlKCksICJ5ZXMiKSkKKyAg
ICAgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5zZXRXZWJBcHBDYXBhYmxlKCk7
CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIGh0dHBFcXVpdiA9IG1ldGFFbGVt
ZW50LT5odHRwRXF1aXYoKS5zdHJpcFdoaXRlU3BhY2UoKTsKKyAgICAgICAgICAgIFN0cmluZyBj
b250ZW50ID0gbWV0YUVsZW1lbnQtPmNvbnRlbnQoKS5zdHJpcFdoaXRlU3BhY2UoKTsKKworICAg
ICAgICAgICAgaWYgKCFodHRwRXF1aXYuaXNOdWxsKCkgJiYgIWNvbnRlbnQuaXNOdWxsKCkpIHsK
KyAgICAgICAgICAgICAgICBoZWFkZXJzW2hlYWRlcnNMZW5ndGgrK10gPSBodHRwRXF1aXY7Cisg
ICAgICAgICAgICAgICAgaGVhZGVyc1toZWFkZXJzTGVuZ3RoKytdID0gY29udGVudDsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChoZWFkZXJzTGVuZ3RoID4gMCkK
KyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPnNldE1ldGFIZWFkZXJzKGhlYWRl
cnMsIGhlYWRlcnNMZW5ndGgpOworCisgICAgbm9kZUxpc3QgPSBoZWFkRWxlbWVudC0+Z2V0RWxl
bWVudHNCeVRhZ05hbWUoSFRNTE5hbWVzOjpsaW5rVGFnLmxvY2FsTmFtZSgpKTsKKyAgICBzaXpl
ID0gbm9kZUxpc3QtPmxlbmd0aCgpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNp
emU7ICsraSkgeworICAgICAgICBIVE1MTGlua0VsZW1lbnQqIGxpbmtFbGVtZW50ID0gc3RhdGlj
X2Nhc3Q8SFRNTExpbmtFbGVtZW50Kj4obm9kZUxpc3QtPml0ZW0oaSkpOworICAgICAgICBTdHJp
bmcgaHJlZiA9IGxpbmtFbGVtZW50LT5ocmVmKCkuc3RyaW5nKCk7CisgICAgICAgIGlmICghaHJl
Zi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IGxpbmtFbGVtZW50LT50
aXRsZSgpOworCisgICAgICAgICAgICBpZiAoV1RGOjplcXVhbElnbm9yaW5nQ2FzZShsaW5rRWxl
bWVudC0+cmVsKCksICJhcHBsZS10b3VjaC1pY29uIikpCisgICAgICAgICAgICAgICAgbV93ZWJQ
YWdlUHJpdmF0ZS0+bV9jbGllbnQtPnNldExhcmdlSWNvbihocmVmLmxhdGluMSgpLmRhdGEoKSk7
CisgICAgICAgICAgICBlbHNlIGlmIChXVEY6OmVxdWFsSWdub3JpbmdDYXNlKGxpbmtFbGVtZW50
LT5yZWwoKSwgInNlYXJjaCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKFdURjo6ZXF1YWxJZ25v
cmluZ0Nhc2UobGlua0VsZW1lbnQtPnR5cGUoKSwgImFwcGxpY2F0aW9uL29wZW5zZWFyY2hkZXNj
cmlwdGlvbit4bWwiKSkKKyAgICAgICAgICAgICAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9j
bGllbnQtPnNldFNlYXJjaFByb3ZpZGVyRGV0YWlscyh0aXRsZS51dGY4KCkuZGF0YSgpLCBocmVm
LnV0ZjgoKS5kYXRhKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChXVEY6OmVxdWFsSWdub3Jp
bmdDYXNlKGxpbmtFbGVtZW50LT5yZWwoKSwgImFsdGVybmF0ZSIpCisgICAgICAgICAgICAgICAg
JiYgKFdURjo6ZXF1YWxJZ25vcmluZ0Nhc2UobGlua0VsZW1lbnQtPnR5cGUoKSwgImFwcGxpY2F0
aW9uL3Jzcyt4bWwiKQorICAgICAgICAgICAgICAgIHx8IFdURjo6ZXF1YWxJZ25vcmluZ0Nhc2Uo
bGlua0VsZW1lbnQtPnR5cGUoKSwgImFwcGxpY2F0aW9uL2F0b20reG1sIikpKQorICAgICAgICAg
ICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5zZXRBbHRlcm5hdGVGZWVkRGV0YWls
cyh0aXRsZS51dGY4KCkuZGF0YSgpLCBocmVmLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICB9Cisg
ICAgfQorfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRG
aW5pc2hEb2N1bWVudExvYWQoKQoreworICAgIGlmIChtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBS
ZW5kZXJUcmVlKQorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2R1bXBSZW5kZXJUcmVlLT5k
aWRGaW5pc2hEb2N1bWVudExvYWRGb3JGcmFtZShtX2ZyYW1lKTsKKyAgICBub3RJbXBsZW1lbnRl
ZCgpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hEaWRG
YWlsTG9hZChjb25zdCBSZXNvdXJjZUVycm9yJiBlcnJvcikKK3sKKyAgICBkaWRGaW5pc2hPckZh
aWxMb2FkaW5nKGVycm9yKTsKKyAgICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVy
VHJlZSkKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZS0+ZGlkRmFp
bExvYWRGb3JGcmFtZShtX2ZyYW1lKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNr
QmVycnk6OmRpZEZpbmlzaE9yRmFpbExvYWRpbmcoY29uc3QgUmVzb3VyY2VFcnJvciYgZXJyb3Ip
Cit7CisgICAgLy8gRklYTUU6IERvIHdlIG5lZWQgdG8gZmluZCBhIHJlcGxhY2VtZW50IGZvciBt
X2ZyYW1lLT5kb2N1bWVudCgpLT5zZXRFeHRyYUxheW91dERlbGF5KDApOz8KKworICAgIC8vIElm
IHdlIGhhdmUgZmluaXNoZWQgbG9hZGluZyBhIHBhZ2UgdGhyb3VnaCBoaXN0b3J5IG5hdmlnYXRp
b24sIGFueQorICAgIC8vIGF0dGVtcHQgdG8gZ28gYmFjayB0byB0aGF0IHBhZ2UgdGhyb3VnaCBh
biBhdXRvbWF0aWMgcmVkaXJlY3Qgc2hvdWxkIGJlCisgICAgLy8gZGVuaWVkIHRvIGF2b2lkIHJl
ZGlyZWN0IGxvb3BzLiBTbyBzYXZlIHRoZSBoaXN0b3J5IG5hdmlnYXRpb24gdXJscyB0bworICAg
IC8vIGNoZWNrIGxhdGVyLiAoSWYgdGhpcyB3YXMgbm90IGEgaGlzdG9yeSBuYXZpZ2F0aW9uLAor
ICAgIC8vIG1faGlzdG9yeU5hdmlnYXRpb25Tb3VyY2VVUkxzIHdpbGwgYmUgZW1wdHksIGFuZCB3
ZSBzaG91bGQgc2F2ZSB0aGF0CisgICAgLy8gdG9vLikKKyAgICBtX3JlZGlyZWN0VVJMc1RvU2tp
cER1ZVRvSGlzdG9yeU5hdmlnYXRpb24uc3dhcChtX2hpc3RvcnlOYXZpZ2F0aW9uU291cmNlVVJM
cyk7CisKKyAgICAvLyBIaXN0b3J5IG5hdmlnYXRpb24gaXMgZmluaXNoZWQgc28gY2xlYXIgdGhl
IGhpc3RvcnkgbmF2aWdhdGlvbiB1cmwuCisgICAgbV9oaXN0b3J5TmF2aWdhdGlvblNvdXJjZVVS
THMuY2xlYXIoKTsKKworICAgIGlmIChpc01haW5GcmFtZSgpKSB7CisgICAgICAgIG1fbG9hZEVy
cm9yID0gZXJyb3I7CisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPnNldExvYWRTdGF0ZShlcnJv
ci5pc051bGwoKSA/IFdlYlBhZ2VQcml2YXRlOjpGaW5pc2hlZCA6IFdlYlBhZ2VQcml2YXRlOjpG
YWlsZWQpOworICAgIH0KK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRp
c3BhdGNoRGlkRmFpbFByb3Zpc2lvbmFsTG9hZChjb25zdCBSZXNvdXJjZUVycm9yJiBlcnJvcikK
K3sKKyAgICBpZiAoaXNNYWluRnJhbWUoKSkgeworICAgICAgICBtX2xvYWRFcnJvciA9IGVycm9y
OworICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5zZXRMb2FkU3RhdGUoV2ViUGFnZVByaXZhdGU6
OkZhaWxlZCk7CisKKyAgICAgICAgaWYgKGVycm9yLmRvbWFpbigpID09IFJlc291cmNlRXJyb3I6
OnBsYXRmb3JtRXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAmJiAoZXJyb3IuZXJyb3JDb2Rl
KCkgPT0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkZpbHRlclN0cmVhbTo6U3RhdHVzRXJyb3JBbHJl
YWR5SGFuZGxlZCkpIHsKKyAgICAgICAgICAgIC8vIEVycm9yIGhhcyBhbHJlYWR5IGJlZW4gZGlz
cGxheWVkIGJ5IGNsaWVudC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAg
ICAgIGlmIChlcnJvci5kb21haW4oKS5pc0VtcHR5KCkgJiYgIWVycm9yLmVycm9yQ29kZSgpICYm
IGVycm9yLmZhaWxpbmdVUkwoKS5pc0VtcHR5KCkgJiYgZXJyb3IubG9jYWxpemVkRGVzY3JpcHRp
b24oKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIERvbid0IHRyeSB0byBkaXNwbGF5IGVt
cHR5IGVycm9ycyByZXR1cm5lZCBmcm9tIHRoZSB1bmltcGxlbWVudGVkIGVycm9yIGZ1bmN0aW9u
cyBpbiBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkgLSB0aGVyZSdzIG5vdGhpbmcgdG8gZGlz
cGxheSBhbnl3YXkuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICBpZiAobV93ZWJQYWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZSkKKyAgICAgICAgbV93ZWJQ
YWdlUHJpdmF0ZS0+bV9kdW1wUmVuZGVyVHJlZS0+ZGlkRmFpbFByb3Zpc2lvbmFsTG9hZEZvckZy
YW1lKG1fZnJhbWUpOworCisgICAgaWYgKCFpc01haW5GcmFtZSgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBTdHJpbmcgZXJyb3JQYWdlID0gbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPmdl
dEVycm9yUGFnZShlcnJvci5lcnJvckNvZGUoKQorICAgICAgICAgICAgLCBlcnJvci5sb2NhbGl6
ZWREZXNjcmlwdGlvbigpLmlzRW1wdHkoKSA/ICIiIDogZXJyb3IubG9jYWxpemVkRGVzY3JpcHRp
b24oKS51dGY4KCkuZGF0YSgpCisgICAgICAgICAgICAsIGVycm9yLmZhaWxpbmdVUkwoKS5pc0Vt
cHR5KCkgPyAiIiA6IGVycm9yLmZhaWxpbmdVUkwoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIC8v
IE1ha2Ugc3VyZSB3ZSdyZSBzdGlsbCBpbiB0aGUgcHJvdmlzaW9uYWxMb2FkIHN0YXRlIC0gZ2V0
RXJyb3JQYWdlIHJ1bnMgYQorICAgIC8vIG5lc3RlZCBldmVudCBsb29wIHdoaWxlIGl0J3Mgd2Fp
dGluZyBmb3IgY2xpZW50IHJlc291cmNlcyB0byBsb2FkIHNvCisgICAgLy8gdGhlcmUncyBhIHNt
YWxsIHdpbmRvdyBmb3IgdGhlIHVzZXIgdG8gaGl0IHN0b3AuCisgICAgaWYgKG1fZnJhbWUtPmxv
YWRlcigpLT5wcm92aXNpb25hbERvY3VtZW50TG9hZGVyKCkpIHsKKyAgICAgICAgU3Vic3RpdHV0
ZURhdGEgZXJyb3JEYXRhKHV0ZjhCdWZmZXIoZXJyb3JQYWdlKSwgInRleHQvaHRtbCIsICJ1dGYt
OCIsIEtVUkwoS1VSTCgpLCBlcnJvci5mYWlsaW5nVVJMKCkpKTsKKworICAgICAgICBSZXNvdXJj
ZVJlcXVlc3Qgb3JpZ2luYWxSZXF1ZXN0ID0gbV9mcmFtZS0+bG9hZGVyKCktPnByb3Zpc2lvbmFs
RG9jdW1lbnRMb2FkZXIoKS0+b3JpZ2luYWxSZXF1ZXN0KCk7CisKKyAgICAgICAgLy8gTG9hZGlu
ZyB1c2luZyBTdWJzdGl0dXRlRGF0YSB3aWxsIHJlcGxhY2UgdGhlIG9yaWdpbmFsIHJlcXVlc3Qg
d2l0aCBvdXIKKyAgICAgICAgLy8gZXJyb3IgZGF0YS4gVGhpcyBtdXN0IGJlIGRvbmUgd2l0aGlu
IGRpc3BhdGNoRGlkRmFpbFByb3Zpc2lvbmFsTG9hZCwKKyAgICAgICAgLy8gYW5kIGRvIE5PVCBj
YWxsIHN0b3BBbGxMb2FkZXJzIGZpcnN0LCBiZWNhdXNlIHRoZSBsb2FkZXIgY2hlY2tzIHRoZQor
ICAgICAgICAvLyBwcm92aXNpb25hbERvY3VtZW50TG9hZGVyIHRvIGRlY2lkZSB0aGUgbG9hZCB0
eXBlOyBpZiBjYWxsZWQgYW55IG90aGVyCisgICAgICAgIC8vIHdheSwgdGhlIGVycm9yIHBhZ2Ug
aXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgaGlzdG9yeSBpbnN0ZWFkIG9mCisgICAgICAgIC8v
IHJlcGxhY2luZyB0aGUgZmFpbGVkIGxvYWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRo
aXMgY29tZXMgZnJvbSBhIGJhY2svZm9yd2FyZCBuYXZpZ2F0aW9uLCB3ZSBuZWVkIHRvIHNhdmUg
dGhlIGN1cnJlbnQgdmlld3N0YXRlCisgICAgICAgIC8vIHRvIG9yaWdpbmFsIGhpc3RvcnlpdGVt
LCBhbmQgcHJldmVudCB0aGUgcmVzdG9yZSBvZiB2aWV3IHN0YXRlIHRvIHRoZSBlcnJvciBwYWdl
LgorICAgICAgICBpZiAoaXNCYWNrRm9yd2FyZExvYWRUeXBlKG1fZnJhbWUtPmxvYWRlcigpLT5s
b2FkVHlwZSgpKSkgeworICAgICAgICAgICAgbV9mcmFtZS0+bG9hZGVyKCktPmhpc3RvcnkoKS0+
c2F2ZVNjcm9sbFBvc2l0aW9uQW5kVmlld1N0YXRlVG9JdGVtKG1fZnJhbWUtPmxvYWRlcigpLT5o
aXN0b3J5KCktPmN1cnJlbnRJdGVtKCkpOworICAgICAgICAgICAgQVNTRVJUKG1fZnJhbWUtPmxv
YWRlcigpLT5oaXN0b3J5KCktPnByb3Zpc2lvbmFsSXRlbSgpKTsKKyAgICAgICAgICAgIG1fZnJh
bWUtPmxvYWRlcigpLT5oaXN0b3J5KCktPnByb3Zpc2lvbmFsSXRlbSgpLT52aWV3U3RhdGUoKS5z
aG91bGRTYXZlVmlld1N0YXRlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbV9sb2FkaW5n
RXJyb3JQYWdlID0gdHJ1ZTsKKyAgICAgICAgbV9mcmFtZS0+bG9hZGVyKCktPmxvYWQob3JpZ2lu
YWxSZXF1ZXN0LCBlcnJvckRhdGEsIGZhbHNlKTsKKyAgICB9Cit9CisKK3ZvaWQgRnJhbWVMb2Fk
ZXJDbGllbnRCbGFja0JlcnJ5OjpkaXNwYXRjaFdpbGxTdWJtaXRGb3JtKEZyYW1lUG9saWN5RnVu
Y3Rpb24gZnVuY3Rpb24sIFBhc3NSZWZQdHI8Rm9ybVN0YXRlPikKK3sKKyAgICAvLyBGSVhNRTog
U3R1Yi4KKyAgICAobV9mcmFtZS0+bG9hZGVyKCktPnBvbGljeUNoZWNrZXIoKS0+KmZ1bmN0aW9u
KShQb2xpY3lVc2UpOworfQorCitQYXNzUmVmUHRyPEZyYW1lPiBGcmFtZUxvYWRlckNsaWVudEJs
YWNrQmVycnk6OmNyZWF0ZUZyYW1lKGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiBuYW1l
CisgICAgLCBIVE1MRnJhbWVPd25lckVsZW1lbnQqIG93bmVyRWxlbWVudCwgY29uc3QgU3RyaW5n
JiByZWZlcnJlciwgYm9vbCBhbGxvd3NTY3JvbGxpbmcsIGludCBtYXJnaW5XaWR0aCwgaW50IG1h
cmdpbkhlaWdodCkKK3sKKyAgICBpZiAoIW1fd2ViUGFnZVByaXZhdGUpCisgICAgICAgIHJldHVy
biAwOworCisgICAgaWYgKG1fY2hpbGRGcmFtZUNyZWF0aW9uU3VwcHJlc3NlZCkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkqIGZyYW1lTG9hZGVy
Q2xpZW50ID0gbmV3IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeSgpOworICAgIFJlZlB0cjxG
cmFtZT4gY2hpbGRGcmFtZSA9IEZyYW1lOjpjcmVhdGUobV9mcmFtZS0+cGFnZSgpLCBvd25lckVs
ZW1lbnQsIGZyYW1lTG9hZGVyQ2xpZW50KTsKKyAgICBmcmFtZUxvYWRlckNsaWVudC0+c2V0RnJh
bWUoY2hpbGRGcmFtZS5nZXQoKSwgbV93ZWJQYWdlUHJpdmF0ZSk7CisKKyAgICAvLyBJbml0aWFs
aXplIEZyYW1lVmlldy4KKyAgICBSZWZQdHI8RnJhbWVWaWV3PiBmcmFtZVZpZXcgPSBGcmFtZVZp
ZXc6OmNyZWF0ZShjaGlsZEZyYW1lLmdldCgpKTsKKyAgICBjaGlsZEZyYW1lLT5zZXRWaWV3KGZy
YW1lVmlldy5nZXQoKSk7CisgICAgaWYgKCFhbGxvd3NTY3JvbGxpbmcpCisgICAgICAgIGZyYW1l
Vmlldy0+c2V0U2Nyb2xsYmFyTW9kZXMoU2Nyb2xsYmFyQWx3YXlzT2ZmLCBTY3JvbGxiYXJBbHdh
eXNPZmYpOworICAgIGlmIChtYXJnaW5XaWR0aCAhPSAtMSkKKyAgICAgICAgZnJhbWVWaWV3LT5z
ZXRNYXJnaW5XaWR0aChtYXJnaW5XaWR0aCk7CisgICAgaWYgKG1hcmdpbkhlaWdodCAhPSAtMSkK
KyAgICAgICAgZnJhbWVWaWV3LT5zZXRNYXJnaW5IZWlnaHQobWFyZ2luSGVpZ2h0KTsKKworICAg
IGNoaWxkRnJhbWUtPnRyZWUoKS0+c2V0TmFtZShuYW1lKTsKKyAgICBtX2ZyYW1lLT50cmVlKCkt
PmFwcGVuZENoaWxkKGNoaWxkRnJhbWUpOworICAgIGNoaWxkRnJhbWUtPmluaXQoKTsKKworICAg
IGlmICghY2hpbGRGcmFtZS0+dHJlZSgpLT5wYXJlbnQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisK
KyAgICBCYWNraW5nU3RvcmVDbGllbnQ6OmNyZWF0ZShjaGlsZEZyYW1lLmdldCgpLCBtX2ZyYW1l
LCBtX3dlYlBhZ2VQcml2YXRlLT5tX3dlYlBhZ2UpOworCisgICAgbV9mcmFtZS0+bG9hZGVyKCkt
PmxvYWRVUkxJbnRvQ2hpbGRGcmFtZSh1cmwsIHJlZmVycmVyLCBjaGlsZEZyYW1lLmdldCgpKTsK
KworICAgIGlmICghY2hpbGRGcmFtZS0+dHJlZSgpLT5wYXJlbnQoKSkKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICByZXR1cm4gY2hpbGRGcmFtZS5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgRnJhbWVM
b2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkaWRUcmFuc2ZlckNoaWxkRnJhbWVUb05ld0RvY3VtZW50
KFBhZ2UqIC8qb2xkUGFnZSovKQoreworICAgIFBhZ2UqIG5ld1BhZ2UgPSBtX2ZyYW1lLT5wYWdl
KCk7CisgICAgbV93ZWJQYWdlUHJpdmF0ZSA9IHN0YXRpY19jYXN0PENocm9tZUNsaWVudEJsYWNr
QmVycnkqPihuZXdQYWdlLT5jaHJvbWUoKS0+Y2xpZW50KCkpLT53ZWJQYWdlUHJpdmF0ZSgpOwor
fQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6dHJhbnNmZXJMb2FkaW5nUmVz
b3VyY2VGcm9tUGFnZShSZXNvdXJjZUxvYWRlciosIGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIFBh
Z2UqKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK09iamVjdENvbnRlbnRUeXBlIEZy
YW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6b2JqZWN0Q29udGVudFR5cGUoY29uc3QgS1VSTCYg
dXJsLCBjb25zdCBTdHJpbmcmIG1pbWVUeXBlSW4sIGJvb2wgc2hvdWxkUHJlZmVyUGx1Z0luc0Zv
ckltYWdlcykKK3sKKyAgICBTdHJpbmcgbWltZVR5cGUgPSBtaW1lVHlwZUluOworICAgIGlmICht
aW1lVHlwZS5pc0VtcHR5KCkpCisgICAgICAgIG1pbWVUeXBlID0gTUlNRVR5cGVSZWdpc3RyeTo6
Z2V0TUlNRVR5cGVGb3JQYXRoKHVybC5wYXRoKCkpOworCisgICAgLy8gR2V0IG1hcHBlZCB0eXBl
LgorICAgIG1pbWVUeXBlID0gV2ViU2V0dGluZ3M6OmdldE5vcm1hbGl6ZWRNSU1FVHlwZShtaW1l
VHlwZSk7CisKKyAgICBPYmplY3RDb250ZW50VHlwZSBkZWZhdWx0VHlwZSA9IEZyYW1lTG9hZGVy
OjpkZWZhdWx0T2JqZWN0Q29udGVudFR5cGUodXJsLCBtaW1lVHlwZSwgc2hvdWxkUHJlZmVyUGx1
Z0luc0ZvckltYWdlcyk7CisgICAgaWYgKGRlZmF1bHRUeXBlICE9IE9iamVjdENvbnRlbnROb25l
KQorICAgICAgICByZXR1cm4gZGVmYXVsdFR5cGU7CisKKyAgICBpZiAoV2ViU2V0dGluZ3M6Omlz
U3VwcG9ydGVkT2JqZWN0TUlNRVR5cGUobWltZVR5cGUpKQorICAgICAgICByZXR1cm4gT2JqZWN0
Q29udGVudE90aGVyUGx1Z2luOworCisgICAgcmV0dXJuIE9iamVjdENvbnRlbnROb25lOworfQor
Cit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hXaWxsQ2xvc2UoKQor
eworICAgIG1fd2ViUGFnZVByaXZhdGUtPm1faW5wdXRIYW5kbGVyLT5mcmFtZVVubG9hZGVkKG1f
ZnJhbWUpOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6c2V0TWFpbkRv
Y3VtZW50RXJyb3IoRG9jdW1lbnRMb2FkZXIqLCBjb25zdCBSZXNvdXJjZUVycm9yJiBlcnJvcikK
K3sKKyAgICBpZiAoIW1fcGx1Z2luVmlldykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wbHVn
aW5WaWV3LT5kaWRGYWlsKGVycm9yKTsKKyAgICBtX3BsdWdpblZpZXcgPSAwOworICAgIG1faGFz
U2VudFJlc3BvbnNlVG9QbHVnaW4gPSBmYWxzZTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVu
dEJsYWNrQmVycnk6OnBvc3RQcm9ncmVzc1N0YXJ0ZWROb3RpZmljYXRpb24oKQoreworICAgIGlm
ICghaXNNYWluRnJhbWUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gTmV3IGxvYWQgc3Rh
cnRlZCwgc28gY2xlYXIgdGhlIGVycm9yLgorICAgIG1fbG9hZEVycm9yID0gUmVzb3VyY2VFcnJv
cigpOworICAgIG1fc2VudFJlYWR5VG9SZW5kZXIgPSBmYWxzZTsKKyAgICBtX3dlYlBhZ2VQcml2
YXRlLT5tX2NsaWVudC0+bm90aWZ5TG9hZFN0YXJ0ZWQoKTsKK30KKwordm9pZCBGcmFtZUxvYWRl
ckNsaWVudEJsYWNrQmVycnk6OnBvc3RQcm9ncmVzc0VzdGltYXRlQ2hhbmdlZE5vdGlmaWNhdGlv
bigpCit7CisgICAgaWYgKCFpc01haW5GcmFtZSgpIHx8ICFtX2ZyYW1lLT5wYWdlKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5ub3RpZnlMb2Fk
UHJvZ3Jlc3MobV9mcmFtZS0+cGFnZSgpLT5wcm9ncmVzcygpLT5lc3RpbWF0ZWRQcm9ncmVzcygp
ICogMTAwKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNo
RGlkRmlyc3RWaXN1YWxseU5vbkVtcHR5TGF5b3V0KCkKK3sKKyAgICBpZiAoIWlzTWFpbkZyYW1l
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgImRpc3BhdGNoRGlkRmlyc3RWaXN1YWxs
eU5vbkVtcHR5TGF5b3V0Iik7CisKKyAgICByZWFkeVRvUmVuZGVyKHRydWUpOworCisgICAgLy8g
RklYTUU6IFdlIHNob3VsZG4ndCBiZSBnZXR0aW5nIGhlcmUgaWYgd2UgYXJlIG5vdCBpbiB0aGUg
Q29tbWl0dGVkIHN0YXRlIGJ1dCB3ZSBhcmUKKyAgICAvLyBzbyB3ZSBjYW4gbm90IGFzc2VydCBv
biB0aGF0IHJpZ2h0IG5vdy4gQnV0IHdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIGxvYWQuCisg
ICAgLy8gUklNIEJ1ZyAjNTU1CisgICAgaWYgKG1fd2ViUGFnZVByaXZhdGUtPmxvYWRTdGF0ZSgp
ID09IFdlYlBhZ2VQcml2YXRlOjpDb21taXR0ZWQpIHsKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0
ZS0+em9vbVRvSW5pdGlhbFNjYWxlT25Mb2FkKCk7IC8vIFNldCB0aGUgcHJvcGVyIHpvb20gbGV2
ZWwgZmlyc3QuCisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fYmFja2luZ1N0b3JlLT5kLT5j
bGVhclZpc2libGVab29tKCk7IC8vIENsZWFyIHRoZSB2aXNpYmxlIHpvb20gc2luY2Ugd2UncmUg
ZXhwbGljaXRseSByZW5kZXJpbmcrYmxpdHRpbmcgYmVsb3cuCisgICAgICAgIG1fd2ViUGFnZVBy
aXZhdGUtPm1fYmFja2luZ1N0b3JlLT5kLT5yZW5kZXJWaXNpYmxlQ29udGVudHMoKTsKKyAgICB9
CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+bm90aWZ5Rmlyc3RWaXN1YWxseU5v
bkVtcHR5TGF5b3V0KCk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpw
b3N0UHJvZ3Jlc3NGaW5pc2hlZE5vdGlmaWNhdGlvbigpCit7CisgICAgaWYgKCFpc01haW5GcmFt
ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBFbXB0eSBwYWdlcyB3aWxsIG5ldmVyIGhh
dmUgY2FsbGVkCisgICAgLy8gZGlzcGF0Y2hEaWRGaXJzdFZpc3VhbGx5Tm9uRW1wdHlMYXlvdXQs
IHNpbmNlIHRoZXkncmUgdmlzdWFsbHkgZW1wdHksIHNvCisgICAgLy8gd2UgbWF5IG5lZWQgdG8g
Y2FsbCByZWFkeVRvUmVuZGVyIG5vdy4KKyAgICByZWFkeVRvUmVuZGVyKGZhbHNlKTsKKworICAg
IC8vIEZJWE1FOiBTZW5kIHVwIGEgcmVhbCBzdGF0dXMgY29kZS4KKyAgICBtX3dlYlBhZ2VQcml2
YXRlLT5tX2NsaWVudC0+bm90aWZ5TG9hZEZpbmlzaGVkKG1fbG9hZEVycm9yLmlzTnVsbCgpID8g
MCA6IC0xKTsKKworICAgIC8vIE5vdGlmeSBwbHVnaW5zIHRoYXQgYXJlIHdhaXRpbmcgZm9yIHRo
ZSBwYWdlIHRvIGZ1bGx5IGxvYWQgYmVmb3JlIHN0YXJ0aW5nIHRoYXQKKyAgICAvLyB0aGUgbG9h
ZCBoYXMgY29tcGxldGVkLgorICAgIG1fd2ViUGFnZVByaXZhdGUtPm5vdGlmeVBhZ2VPbkxvYWQo
KTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkQ2xl
YXJXaW5kb3dPYmplY3RJbldvcmxkKERPTVdyYXBwZXJXb3JsZCogd29ybGQpCit7CisgICAgaWYg
KHdvcmxkICE9IG1haW5UaHJlYWROb3JtYWxXb3JsZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBQcm92aWRlIHRoZSBleHRlbnNpb24gb2JqZWN0IGZpcnN0IGluIGNhc2UgdGhlIGNsaWVu
dCBvciBvdGhlcnMgd2FudCB0byB1c2UgaXQuCisgICAgLy8gRklYTUU6IENvbmRpdGlvbmFsbHkg
YXR0YWNoIGV4dGVuc2lvbiBvYmplY3QgYmFzZWQgb24gc29tZSBmbGFnIG9yIHdoZXRoZXIgb3Ig
bm90IHdlCisgICAgLy8gYXJlIGJyb3dzZXIgb3Igc29tZXRoaW5nIGVsc2UuCisgICAgYXR0YWNo
RXh0ZW5zaW9uT2JqZWN0VG9GcmFtZShtX2ZyYW1lLCBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVu
dCk7CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+bm90aWZ5V2luZG93T2JqZWN0
Q2xlYXJlZCgpOworCisgICAgaWYgKG1fd2ViUGFnZVByaXZhdGUtPm1fZHVtcFJlbmRlclRyZWUp
IHsKKyAgICAgICAgSlNHbG9iYWxDb250ZXh0UmVmIGNvbnRleHQgPSB0b0dsb2JhbFJlZihtX2Zy
YW1lLT5zY3JpcHQoKS0+Z2xvYmFsT2JqZWN0KG1haW5UaHJlYWROb3JtYWxXb3JsZCgpKS0+Z2xv
YmFsRXhlYygpKTsKKyAgICAgICAgSlNPYmplY3RSZWYgd2luZG93T2JqZWN0ID0gdG9SZWYobV9m
cmFtZS0+c2NyaXB0KCktPmdsb2JhbE9iamVjdChtYWluVGhyZWFkTm9ybWFsV29ybGQoKSkpOwor
ICAgICAgICBBU1NFUlQod2luZG93T2JqZWN0KTsKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0ZS0+
bV9kdW1wUmVuZGVyVHJlZS0+ZGlkQ2xlYXJXaW5kb3dPYmplY3RJbldvcmxkKHdvcmxkLCBjb250
ZXh0LCB3aW5kb3dPYmplY3QpOworICAgIH0KK30KKworYm9vbCBGcmFtZUxvYWRlckNsaWVudEJs
YWNrQmVycnk6OnNob3VsZEdvVG9IaXN0b3J5SXRlbShIaXN0b3J5SXRlbSopIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpz
aG91bGRTdG9wTG9hZGluZ0Zvckhpc3RvcnlJdGVtKEhpc3RvcnlJdGVtKikgY29uc3QKK3sKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6Omlu
dmFsaWRhdGVCYWNrRm9yd2FyZExpc3QoKSBjb25zdAoreworICAgIG5vdGlmeUJhY2tGb3J3YXJk
TGlzdENoYW5nZWQoKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6Om5v
dGlmeUJhY2tGb3J3YXJkTGlzdENoYW5nZWQoKSBjb25zdAoreworICAgIEJhY2tGb3J3YXJkTGlz
dEltcGwqIGJhY2tGb3J3YXJkTGlzdCA9IHN0YXRpY19jYXN0PEJhY2tGb3J3YXJkTGlzdEltcGwq
PihtX3dlYlBhZ2VQcml2YXRlLT5tX3BhZ2UtPmJhY2tGb3J3YXJkKCktPmNsaWVudCgpKTsKKyAg
ICBBU1NFUlQoYmFja0ZvcndhcmRMaXN0KTsKKworICAgIHVuc2lnbmVkIGxpc3RTaXplID0gYmFj
a0ZvcndhcmRMaXN0LT5lbnRyaWVzKCkuc2l6ZSgpOworICAgIHVuc2lnbmVkIGN1cnJlbnRJbmRl
eCA9IGJhY2tGb3J3YXJkTGlzdC0+YmFja0xpc3RDb3VudCgpOworICAgIG1fd2ViUGFnZVByaXZh
dGUtPm1fY2xpZW50LT5yZXNldEJhY2tGb3J3YXJkTGlzdChsaXN0U2l6ZSwgY3VycmVudEluZGV4
KTsKK30KKworRnJhbWUqIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6ZGlzcGF0Y2hDcmVh
dGVQYWdlKGNvbnN0IE5hdmlnYXRpb25BY3Rpb24mIG5hdmlnYXRpb24pCit7CisgICAgV2ViUGFn
ZSogd2ViUGFnZSA9IG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5jcmVhdGVXaW5kb3coMCwg
MCwgLTEsIC0xLCBXZWJQYWdlQ2xpZW50OjpGbGFnV2luZG93RGVmYXVsdCwgbmF2aWdhdGlvbi51
cmwoKS5zdHJpbmcoKSwgV2ViU3RyaW5nKCkpOworICAgIGlmICghd2ViUGFnZSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICByZXR1cm4gd2ViUGFnZS0+ZC0+bV9wYWdlLT5tYWluRnJhbWUoKTsK
K30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRldGFjaGVkRnJvbVBhcmVu
dDIoKQoreworICAgIEJhY2tpbmdTdG9yZUNsaWVudCogYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJh
bWUgPSBtX3dlYlBhZ2VQcml2YXRlLT5iYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZShtX2ZyYW1l
KTsKKyAgICBpZiAoYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUpIHsKKyAgICAgICAgZGVsZXRl
IGJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lOworICAgICAgICBiYWNraW5nU3RvcmVDbGllbnRG
b3JGcmFtZSA9IDA7CisgICAgfQorCisgICAgaWYgKG1fZnJhbWUtPmRvY3VtZW50KCkpCisgICAg
ICAgIG1fd2ViUGFnZVByaXZhdGUtPmNsZWFyRG9jdW1lbnREYXRhKG1fZnJhbWUtPmRvY3VtZW50
KCkpOworCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9pbnB1dEhhbmRsZXItPmZyYW1lVW5sb2Fk
ZWQobV9mcmFtZSk7CisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlmeUZyYW1l
RGV0YWNoZWQobV9mcmFtZSk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5
OjpkaXNwYXRjaFdpbGxTZW5kUmVxdWVzdChEb2N1bWVudExvYWRlciogZG9jTG9hZGVyLCBsb25n
IHVuc2lnbmVkIGludCwgUmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0LCBjb25zdCBSZXNvdXJjZVJl
c3BvbnNlJikKK3sKKyAgICAvLyBJZiB0aGUgcmVxdWVzdCBpcyBiZWluZyBsb2FkZWQgYnkgdGhl
IHByb3Zpc2lvbmFsIGRvY3VtZW50IGxvYWRlciwgdGhlbgorICAgIC8vIGl0IGlzIGEgbmV3IHRv
cCBsZXZlbCByZXF1ZXN0IHdoaWNoIGhhcyBub3QgYmVlbiBjb21taXRlZC4KKyAgICBib29sIGlz
TWFpblJlc291cmNlTG9hZCA9IGRvY0xvYWRlciAmJiBkb2NMb2FkZXIgPT0gZG9jTG9hZGVyLT5m
cmFtZUxvYWRlcigpLT5wcm92aXNpb25hbERvY3VtZW50TG9hZGVyKCk7CisKKyAgICAvLyBBbnkg
cHJvY2Vzc2luZyB3aGljaCBpcyBkb25lIGZvciBhbGwgbG9hZHMgKGJvdGggbWFpbiBhbmQgc3Vi
cmVzb3VyY2UpIHNob3VsZCBnbyBoZXJlLgorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3
b3JrUmVxdWVzdCBwbGF0Zm9ybVJlcXVlc3Q7CisgICAgcmVxdWVzdC5pbml0aWFsaXplUGxhdGZv
cm1SZXF1ZXN0KHBsYXRmb3JtUmVxdWVzdCwgZmFsc2UgLyppc0luaXRpYWwqLyk7CisgICAgbV93
ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPnBvcHVsYXRlQ3VzdG9tSGVhZGVycyhwbGF0Zm9ybVJl
cXVlc3QpOworICAgIGNvbnN0IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6
SGVhZGVyTGlzdCYgaGVhZGVyTGlzdHMgPSBwbGF0Zm9ybVJlcXVlc3QuZ2V0SGVhZGVyTGlzdFJl
ZigpOworICAgIGZvciAoQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpIZWFk
ZXJMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGhlYWRlckxpc3RzLmJlZ2luKCk7IGl0ICE9IGhl
YWRlckxpc3RzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGhlYWRlclN0cmlu
ZyA9IGl0LT5maXJzdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgaGVhZGVyVmFsdWVTdHJpbmcgPSBp
dC0+c2Vjb25kOworICAgICAgICByZXF1ZXN0LnNldEhUVFBIZWFkZXJGaWVsZChTdHJpbmcoaGVh
ZGVyU3RyaW5nLmNfc3RyKCkpLCBTdHJpbmcoaGVhZGVyVmFsdWVTdHJpbmcuY19zdHIoKSkpOwor
ICAgIH0KKyAgICBpZiAoY29va2llc0VuYWJsZWQoKSkgeworICAgICAgICBTdHJpbmcgY29va2ll
UGFpcnMgPSBjb29raWVNYW5hZ2VyKCkuZ2V0Q29va2llKHJlcXVlc3QudXJsKCksIFdpdGhIdHRw
T25seUNvb2tpZXMpOworICAgICAgICBpZiAoIWNvb2tpZVBhaXJzLmlzRW1wdHkoKSkgeworICAg
ICAgICAgICAgLy8gV2Ugb25seSBtb2RpZnkgdGhlIFdlYkNvcmUgcmVxdWVzdCB0byBtYWtlIHRo
ZSBjb29raWVzIHZpc2libGUgaW4gaW5zcGVjdG9yLgorICAgICAgICAgICAgcmVxdWVzdC5zZXRI
VFRQSGVhZGVyRmllbGQoU3RyaW5nKCJDb29raWUiKSwgY29va2llUGFpcnMpOworICAgICAgICB9
CisgICAgfQorICAgIGlmICghaXNNYWluUmVzb3VyY2VMb2FkKSB7CisgICAgICAgIC8vIERvIG5v
dGhpbmcgZm9yIG5vdy4KKyAgICAgICAgLy8gQW55IHByb2Nlc3Npbmcgd2hpY2ggaXMgZG9uZSBv
bmx5IGZvciBzdWJyZXNvdXJjZXMgc2hvdWxkIGdvIGhlcmUuCisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICAvLyBBbGwgcHJvY2Vzc2luZyBiZXlvbmQgdGhpcyBwb2ludCBpcyBkb25lIG9u
bHkgZm9yIG1haW4gcmVzb3VyY2UgbG9hZHMuCisKKyAgICBpZiAobV9jbGllbnRSZWRpcmVjdElz
UGVuZGluZyAmJiBpc01haW5GcmFtZSgpKSB7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbFVybCA9
IG1fZnJhbWUtPmRvY3VtZW50KCktPnVybCgpLnN0cmluZygpOworICAgICAgICBTdHJpbmcgZmlu
YWxVcmwgPSByZXF1ZXN0LnVybCgpLnN0cmluZygpOworCisgICAgICAgIG1fd2ViUGFnZVByaXZh
dGUtPm1fY2xpZW50LT5ub3RpZnlDbGllbnRSZWRpcmVjdChvcmlnaW5hbFVybC5jaGFyYWN0ZXJz
KCksIG9yaWdpbmFsVXJsLmxlbmd0aCgpLAorICAgICAgICAgICAgZmluYWxVcmwuY2hhcmFjdGVy
cygpLCBmaW5hbFVybC5sZW5ndGgoKSk7CisgICAgfQorCisgICAgLy8gRklYTUU6IFVwZGF0ZSB0
aGUgcmVxdWVzdCB0eXBlLiBTZWUgUFIgIzExOTc5Mi4KKyAgICBpZiAoZG9jTG9hZGVyLT5mcmFt
ZUxvYWRlcigpLT5pc0xvYWRpbmdNYWluRnJhbWUoKSkKKyAgICAgICAgcmVxdWVzdC5zZXRUYXJn
ZXRUeXBlKFJlc291cmNlUmVxdWVzdDo6VGFyZ2V0SXNNYWluRnJhbWUpOworICAgIGVsc2UKKyAg
ICAgICAgcmVxdWVzdC5zZXRUYXJnZXRUeXBlKFJlc291cmNlUmVxdWVzdDo6VGFyZ2V0SXNTdWJm
cmFtZSk7CisKKyAgICBGcmFtZUxvYWRlciogbG9hZGVyID0gbV9mcmFtZS0+bG9hZGVyKCk7Cisg
ICAgQVNTRVJUKGxvYWRlcik7CisgICAgaWYgKGlzQmFja0ZvcndhcmRMb2FkVHlwZShsb2FkZXIt
PmxvYWRUeXBlKCkpKSB7CisgICAgICAgIC8vIERvIG5vdCB1c2UgdGhlIHBhc3NlZCBEb2N1bWVu
dExvYWRlciBiZWNhdXNlIGl0IGlzIHRoZSBsb2FkZXIgdGhhdAorICAgICAgICAvLyB3aWxsIGJl
IHVzZWQgZm9yIHRoZSBuZXcgcmVxdWVzdCAodGhlIERFU1RJTkFUSU9OIG9mIHRoZSBoaXN0b3J5
CisgICAgICAgIC8vIG5hdmlnYXRpb24gLSB3ZSB3YW50IHRvIHVzZSB0aGUgY3VycmVudCBEb2N1
bWVudExvYWRlciB0byByZWNvcmQgdGhlCisgICAgICAgIC8vIFNPVVJDRSkuCisgICAgICAgIERv
Y3VtZW50TG9hZGVyKiBkb2NMb2FkZXIgPSBtX2ZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2Fk
ZXIoKTsKKyAgICAgICAgQVNTRVJUKGRvY0xvYWRlcik7CisgICAgICAgIG1faGlzdG9yeU5hdmln
YXRpb25Tb3VyY2VVUkxzLmFkZChkb2NMb2FkZXItPnVybCgpKTsKKyAgICAgICAgbV9oaXN0b3J5
TmF2aWdhdGlvblNvdXJjZVVSTHMuYWRkKGRvY0xvYWRlci0+b3JpZ2luYWxVUkwoKSk7CisgICAg
fQorfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6bG9hZEljb25FeHRlcm5h
bGx5KGNvbnN0IFN0cmluZyYgb3JpZ2luYWxQYWdlVXJsLCBjb25zdCBTdHJpbmcmIGZpbmFsUGFn
ZVVybCwgY29uc3QgU3RyaW5nJiBpY29uVXJsKQoreworICAgIG1fd2ViUGFnZVByaXZhdGUtPm1f
Y2xpZW50LT5zZXRJY29uRm9yVXJsKG9yaWdpbmFsUGFnZVVybC51dGY4KCkuZGF0YSgpLCBmaW5h
bFBhZ2VVcmwudXRmOCgpLmRhdGEoKSwgaWNvblVybC51dGY4KCkuZGF0YSgpKTsKK30KKwordm9p
ZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OnNhdmVWaWV3U3RhdGVUb0l0ZW0oSGlzdG9y
eUl0ZW0qIGl0ZW0pCit7CisgICAgaWYgKCFpc01haW5GcmFtZSgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBBU1NFUlQoaXRlbSk7CisgICAgSGlzdG9yeUl0ZW1WaWV3U3RhdGUmIHZpZXdTdGF0
ZSA9IGl0ZW0tPnZpZXdTdGF0ZSgpOworICAgIGlmICh2aWV3U3RhdGUuc2hvdWxkU2F2ZVZpZXdT
dGF0ZSkgeworICAgICAgICB2aWV3U3RhdGUub3JpZW50YXRpb24gPSBtX3dlYlBhZ2VQcml2YXRl
LT5tYWluRnJhbWUoKS0+b3JpZW50YXRpb24oKTsKKyAgICAgICAgdmlld1N0YXRlLmlzWm9vbVRv
Rml0U2NhbGUgPSBtX3dlYlBhZ2VQcml2YXRlLT5jdXJyZW50U2NhbGUoKSA9PSBtX3dlYlBhZ2VQ
cml2YXRlLT56b29tVG9GaXRTY2FsZSgpOworICAgICAgICB2aWV3U3RhdGUuc2NhbGUgPSBtX3dl
YlBhZ2VQcml2YXRlLT5jdXJyZW50U2NhbGUoKTsKKyAgICAgICAgdmlld1N0YXRlLnNob3VsZFJl
Zmxvd0Jsb2NrID0gbV93ZWJQYWdlUHJpdmF0ZS0+bV9zaG91bGRSZWZsb3dCbG9jazsKKyAgICB9
Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpyZXN0b3JlVmlld1N0YXRl
KCkKK3sKKyAgICBpZiAoIWlzTWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEhp
c3RvcnlJdGVtKiBjdXJyZW50SXRlbSA9IG1fZnJhbWUtPmxvYWRlcigpLT5oaXN0b3J5KCktPmN1
cnJlbnRJdGVtKCk7CisgICAgQVNTRVJUKGN1cnJlbnRJdGVtKTsKKworICAgIGlmICghY3VycmVu
dEl0ZW0pCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlYlBhZ2VQcml2YXRlIGlzIG1lc3Np
bmcgdXAgRnJhbWVWaWV3Ojp3YXNTY3JvbGxlZEJ5VXNlcigpIGJ5IHNlbmRpbmcKKyAgICAvLyBz
Y3JvbGwgZXZlbnRzIHRoYXQgbG9vayBsaWtlIHRoZXkgd2VyZSB1c2VyIGdlbmVyYXRlZCBhbGwg
dGhlIHRpbWUuCisgICAgLy8KKyAgICAvLyBFdmVuIGlmIHRoZSB1c2VyIGRpZCBub3Qgc2Nyb2xs
LCBGcmFtZVZpZXcgaXMgZ29ubmEgdGhpbmsgdGhleSBkaWQuCisgICAgLy8gU28gd2UgdXNlIG91
ciBvd24gYm9va2tlZXBpbmcgY29kZSB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2Ugd2VyZQor
ICAgIC8vIGFjdHVhbGx5IHNjcm9sbGVkIGJ5IHRoZSB1c2VyIGR1cmluZyBsb2FkLgorICAgIC8v
CisgICAgLy8gSWYgdGhlIHVzZXIgZGlkIHNjcm9sbCB0aG91Z2gsIGFsbCBhcmUgZ29pbmcgdG8g
YmUgaW4gYWdyZWVtZW50IGFib3V0CisgICAgLy8gdGhhdCwgYW5kIHRoZSB3b3JzdCB0aGluZyB0
aGF0IGNvdWxkIGhhcHBlbiBpcyB0aGF0CisgICAgLy8gSGlzdG9yeUNvbnRyb2xsZXI6OnJlc3Rv
cmVTY3JvbGxQb3NpdGlvbkFuZFZpZXdTdGF0ZSBjYWxscworICAgIC8vIHNldFNjcm9sbFBvc2l0
aW9uIHdpdGggdGhlIHRoZSBzYW1lIHBvaW50LCB3aGljaCBpcyBhIE5PT1AuCisgICAgSW50U2l6
ZSBjb250ZW50c1NpemUgPSBjdXJyZW50SXRlbS0+Y29udGVudHNTaXplKCk7CisgICAgSW50UG9p
bnQgc2Nyb2xsUG9zaXRpb24gPSBjdXJyZW50SXRlbS0+c2Nyb2xsUG9pbnQoKTsKKyAgICBpZiAo
bV93ZWJQYWdlUHJpdmF0ZS0+bV91c2VyUGVyZm9ybWVkTWFudWFsU2Nyb2xsKQorICAgICAgICBz
Y3JvbGxQb3NpdGlvbiA9IG1fd2ViUGFnZVByaXZhdGUtPnNjcm9sbFBvc2l0aW9uKCk7CisKKyAg
ICAvLyBXZSBuZWVkIHRvIHJlc2V0IHRoaXMgdmFyaWFibGUgYWZ0ZXIgdGhlIHZpZXcgc3RhdGUg
aGFzIGJlZW4gcmVzdG9yZWQuCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+bV9kaWRSZXN0b3JlRnJv
bVBhZ2VDYWNoZSA9IGZhbHNlOworICAgIEhpc3RvcnlJdGVtVmlld1N0YXRlJiB2aWV3U3RhdGUg
PSBjdXJyZW50SXRlbS0+dmlld1N0YXRlKCk7CisKKyAgICAvLyBBbHNvLCB0cnkgdG8ga2VlcCB0
aGUgdXNlcnMgem9vbSBpZiBhbnkuCisgICAgZG91YmxlIHNjYWxlID0gdmlld1N0YXRlLnNjYWxl
OworICAgIGJvb2wgc2hvdWxkUmVmbG93QmxvY2sgPSB2aWV3U3RhdGUuc2hvdWxkUmVmbG93Qmxv
Y2s7CisgICAgaWYgKG1fd2ViUGFnZVByaXZhdGUtPm1fdXNlclBlcmZvcm1lZE1hbnVhbFpvb20p
IHsKKyAgICAgICAgc2NhbGUgPSBtX3dlYlBhZ2VQcml2YXRlLT5jdXJyZW50U2NhbGUoKTsKKyAg
ICAgICAgc2hvdWxkUmVmbG93QmxvY2sgPSBtX3dlYlBhZ2VQcml2YXRlLT5tX3Nob3VsZFJlZmxv
d0Jsb2NrOworICAgIH0KKworICAgIGJvb2wgc2Nyb2xsQ2hhbmdlZCA9IHNjcm9sbFBvc2l0aW9u
ICE9IG1fd2ViUGFnZVByaXZhdGUtPnNjcm9sbFBvc2l0aW9uKCk7CisgICAgYm9vbCBzY2FsZUNo
YW5nZWQgPSBzY2FsZSAhPSBtX3dlYlBhZ2VQcml2YXRlLT5jdXJyZW50U2NhbGUoKTsKKyAgICBi
b29sIHJlZmxvd0NoYW5nZWQgPSBzaG91bGRSZWZsb3dCbG9jayAhPSBtX3dlYlBhZ2VQcml2YXRl
LT5tX3Nob3VsZFJlZmxvd0Jsb2NrOworICAgIGJvb2wgb3JpZW50YXRpb25DaGFuZ2VkID0gdmll
d1N0YXRlLm9yaWVudGF0aW9uICUgMTgwICE9IG1fd2ViUGFnZVByaXZhdGUtPm1haW5GcmFtZSgp
LT5vcmllbnRhdGlvbigpICUgMTgwOworCisgICAgaWYgKCFzY3JvbGxDaGFuZ2VkICYmICFzY2Fs
ZUNoYW5nZWQgJiYgIXJlZmxvd0NoYW5nZWQgJiYgIW9yaWVudGF0aW9uQ2hhbmdlZCkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgLy8gV2hlbiByb3RhdGUgaGFwcGVucywgb25seSB6b29tIHdoZW4g
cHJldmlvdXMgcGFnZSB3YXMgem9vbVRvRml0U2NhbGUsIG90aGVyd2lzZSBrZWVwIG9sZCBzY2Fs
ZS4KKyAgICBpZiAob3JpZW50YXRpb25DaGFuZ2VkICYmIHZpZXdTdGF0ZS5pc1pvb21Ub0ZpdFNj
YWxlKQorICAgICAgICBzY2FsZSA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6U2Ny
ZWVuOjp3aWR0aCgpICogc2NhbGUgLyBzdGF0aWNfY2FzdDxkb3VibGU+KEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpHcmFwaGljczo6U2NyZWVuOjpoZWlnaHQoKSk7CisgICAgbV93ZWJQYWdlUHJpdmF0
ZS0+bV9iYWNraW5nU3RvcmUtPmQtPnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVz
KCk7IC8vIGRvbid0IGZsYXNoIGNoZWNrZXJib2FyZCBmb3IgdGhlIHNldFNjcm9sbFBvc2l0aW9u
IGNhbGwKKyAgICBtX2ZyYW1lLT52aWV3KCktPnNldENvbnRlbnRzU2l6ZUZyb21IaXN0b3J5KGNv
bnRlbnRzU2l6ZSk7CisKKyAgICAvLyBIZXJlIHdlIG5lZWQgdG8gc2V0IHNjcm9sbCBwb3NpdGlv
biB3aGF0IHdlIGFza2VkIGZvci4KKyAgICAvLyBTbyB3ZSB1c2UgU2Nyb2xsVmlldzo6c2V0Q2Fu
T3ZlcnNjcm9sbCh0cnVlKS4KKyAgICBib29sIG9sZENhbk92ZXJzY3JvbGwgPSBtX2ZyYW1lLT52
aWV3KCktPmNhbk92ZXJTY3JvbGwoKTsKKyAgICBtX2ZyYW1lLT52aWV3KCktPnNldENhbk92ZXJz
Y3JvbGwodHJ1ZSk7CisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+c2V0U2Nyb2xsUG9zaXRpb24oc2Ny
b2xsUG9zaXRpb24pOworICAgIG1fZnJhbWUtPnZpZXcoKS0+c2V0Q2FuT3ZlcnNjcm9sbChvbGRD
YW5PdmVyc2Nyb2xsKTsKKworICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fc2hvdWxkUmVmbG93Qmxv
Y2sgPSB2aWV3U3RhdGUuc2hvdWxkUmVmbG93QmxvY2s7CisKKyAgICAvLyBXaWxsIHJlc3RvcmUg
dXBkYXRlcyB0byBiYWNraW5nc3RvcmUgZ3VhcmFudGVlZCEKKyAgICBpZiAoIW1fd2ViUGFnZVBy
aXZhdGUtPnpvb21BYm91dFBvaW50KHNjYWxlLCBtX2ZyYW1lLT52aWV3KCktPnNjcm9sbFBvc2l0
aW9uKCksIHRydWUgLyogZW5mb3JjZVNjYWxlQ2xhbXBpbmcgKi8sIHRydWUgLypmb3JjZVJlbmRl
cmluZyovLCB0cnVlIC8qaXNSZXN0b3Jpbmdab29tTGV2ZWwqLykpIHsKKyAgICAgICAgLy8gSWYg
d2UncmUgYWxyZWFkeSBhdCB0aGF0IHNjYWxlLCB0aGVuIHdlIHNob3VsZCBzdGlsbCBmb3JjZSBy
ZW5kZXJpbmcgc2luY2UKKyAgICAgICAgLy8gb3VyIHNjcm9sbCBwb3NpdGlvbiBjaGFuZ2VkLgor
ICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2JhY2tpbmdTdG9yZS0+ZC0+cmVuZGVyVmlzaWJs
ZUNvbnRlbnRzKCk7CisKKyAgICAgICAgLy8gV2UgbmVlZCB0byBub3RpZnkgdGhlIGNsaWVudCBv
ZiB0aGUgc2Nyb2xsIHBvc2l0aW9uIGFuZCBjb250ZW50IHNpemUgY2hhbmdlKHMpIGFib3ZlIGV2
ZW4gaWYgd2UgZGlkbid0IHNjYWxlLgorICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5ub3RpZnlU
cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZUNoYW5nZWQoKTsKKyAgICAgICAgbV93ZWJQYWdlUHJpdmF0
ZS0+bm90aWZ5VHJhbnNmb3JtZWRTY3JvbGxDaGFuZ2VkKCk7CisgICAgfQorfQorCitQb2xpY3lB
Y3Rpb24gRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OjpkZWNpZGVQb2xpY3lGb3JFeHRlcm5h
bExvYWQoY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0LCBib29sIGlzRnJhZ21lbnRTY3Jv
bGwpCit7CisgICAgY29uc3QgS1VSTCYgdXJsID0gcmVxdWVzdC51cmwoKTsKKyAgICBTdHJpbmcg
cGF0dGVybiA9IG1fd2ViUGFnZVByaXZhdGUtPmZpbmRQYXR0ZXJuU3RyaW5nRm9yVXJsKHVybCk7
CisgICAgaWYgKCFwYXR0ZXJuLmlzRW1wdHkoKSkgeworICAgICAgICBtX3dlYlBhZ2VQcml2YXRl
LT5tX2NsaWVudC0+aGFuZGxlU3RyaW5nUGF0dGVybihwYXR0ZXJuLmNoYXJhY3RlcnMoKSwgcGF0
dGVybi5sZW5ndGgoKSk7CisgICAgICAgIHJldHVybiBQb2xpY3lJZ25vcmU7CisgICAgfQorCisg
ICAgaWYgKG1fd2ViUGFnZVByaXZhdGUtPm1fd2ViU2V0dGluZ3MtPmFyZUxpbmtzSGFuZGxlZEV4
dGVybmFsbHkoKQorICAgICAgICAgICAgJiYgaXNNYWluRnJhbWUoKQorICAgICAgICAgICAgJiYg
IXJlcXVlc3QubXVzdEhhbmRsZUludGVybmFsbHkoKQorICAgICAgICAgICAgJiYgIWlzRnJhZ21l
bnRTY3JvbGwpIHsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0
IHBsYXRmb3JtUmVxdWVzdDsKKyAgICAgICAgcmVxdWVzdC5pbml0aWFsaXplUGxhdGZvcm1SZXF1
ZXN0KHBsYXRmb3JtUmVxdWVzdCk7CisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50
LT5oYW5kbGVFeHRlcm5hbExpbmsocGxhdGZvcm1SZXF1ZXN0LCByZXF1ZXN0LmFuY2hvclRleHQo
KS5jaGFyYWN0ZXJzKCksIHJlcXVlc3QuYW5jaG9yVGV4dCgpLmxlbmd0aCgpLCBtX2NsaWVudFJl
ZGlyZWN0SXNQZW5kaW5nKTsKKyAgICAgICAgcmV0dXJuIFBvbGljeUlnbm9yZTsKKyAgICB9CisK
KyAgICByZXR1cm4gUG9saWN5VXNlOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tC
ZXJyeTo6d2lsbERlZmVyTG9hZGluZygpCit7CisgICAgbV9kZWZlcnJlZEpvYnNUaW1lci0+c3Rv
cCgpOworCisgICAgaWYgKCFpc01haW5GcmFtZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBt
X3dlYlBhZ2VQcml2YXRlLT53aWxsRGVmZXJMb2FkaW5nKCk7Cit9CisKK3ZvaWQgRnJhbWVMb2Fk
ZXJDbGllbnRCbGFja0JlcnJ5OjpkaWRSZXN1bWVMb2FkaW5nKCkKK3sKKyAgICBpZiAoIW1fZGVm
ZXJyZWRNYW51YWxTY3JpcHQuaXNOdWxsKCkpCisgICAgICAgIG1fZGVmZXJyZWRKb2JzVGltZXIt
PnN0YXJ0T25lU2hvdCgwKTsKKworICAgIGlmICghaXNNYWluRnJhbWUoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgbV93ZWJQYWdlUHJpdmF0ZS0+ZGlkUmVzdW1lTG9hZGluZygpOworfQorCit2
b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6c2V0RGVmZXJyZWRNYW51YWxTY3JpcHQo
Y29uc3QgS1VSTCYgc2NyaXB0KQoreworICAgIEFTU0VSVCghbV9kZWZlcnJlZEpvYnNUaW1lci0+
aXNBY3RpdmUoKSk7CisgICAgbV9kZWZlcnJlZE1hbnVhbFNjcmlwdCA9IHNjcmlwdDsKK30KKwor
dm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRlZmVycmVkSm9ic1RpbWVyRmlyZWQo
VGltZXI8RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5PiopCit7CisgICAgQVNTRVJUKCFtX2Zy
YW1lLT5wYWdlKCktPmRlZmVyc0xvYWRpbmcoKSk7CisKKyAgICBpZiAoIW1fZGVmZXJyZWRNYW51
YWxTY3JpcHQuaXNOdWxsKCkpIHsKKyAgICAgICAgLy8gRXhlY3V0aW5nIHRoZSBzY3JpcHQgd2ls
bCBzZXQgZGVmZXJyZWQgbG9hZGluZywgd2hpY2ggY291bGQgdHJpZ2dlciB0aGlzIHRpbWVyIGFn
YWluIGlmIGEgc2NyaXB0IGlzIHNldC4gU28gY2xlYXIgdGhlIHNjcmlwdCBmaXJzdC4KKyAgICAg
ICAgS1VSTCBzY3JpcHQgPSBtX2RlZmVycmVkTWFudWFsU2NyaXB0OworICAgICAgICBtX2RlZmVy
cmVkTWFudWFsU2NyaXB0ID0gS1VSTCgpOworCisgICAgICAgIG1fZnJhbWUtPnNjcmlwdCgpLT5l
eGVjdXRlSWZKYXZhU2NyaXB0VVJMKHNjcmlwdCk7CisgICAgfQorCisgICAgQVNTRVJUKCFtX2Zy
YW1lLT5wYWdlKCktPmRlZmVyc0xvYWRpbmcoKSk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGll
bnRCbGFja0JlcnJ5OjpyZWFkeVRvUmVuZGVyKGJvb2wgcGFnZUlzVmlzdWFsbHlOb25FbXB0eSkK
K3sKKyAgICAvLyBPbmx5IHNlbmQgdGhlIG5vdGlmaWNhdGlvbiBvbmNlLgorICAgIGlmICghbV9z
ZW50UmVhZHlUb1JlbmRlcikgeworICAgICAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+
bm90aWZ5TG9hZFJlYWR5VG9SZW5kZXIocGFnZUlzVmlzdWFsbHlOb25FbXB0eSk7CisgICAgICAg
IG1fc2VudFJlYWR5VG9SZW5kZXIgPSB0cnVlOworICAgIH0KK30KKworUGFzc1JlZlB0cjxGcmFt
ZU5ldHdvcmtpbmdDb250ZXh0PiBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmNyZWF0ZU5l
dHdvcmtpbmdDb250ZXh0KCkKK3sKKyAgICByZXR1cm4gRnJhbWVOZXR3b3JraW5nQ29udGV4dEJs
YWNrQmVycnk6OmNyZWF0ZShtX2ZyYW1lKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJs
YWNrQmVycnk6OmF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKGNvbnN0IFN0cmluZyYgcmVhbG0sIFN0
cmluZyYgdXNlcm5hbWUsIFN0cmluZyYgcGFzc3dvcmQpCit7CisgICAgV2ViU3RyaW5nIHdlYlBh
Z2VVc2VybmFtZTsKKyAgICBXZWJTdHJpbmcgd2ViUGFnZVBhc3N3b3JkOworCisgICAgbV93ZWJQ
YWdlUHJpdmF0ZS0+bV9jbGllbnQtPmF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKHJlYWxtLmNoYXJh
Y3RlcnMoKSwgcmVhbG0ubGVuZ3RoKCksIHdlYlBhZ2VVc2VybmFtZSwgd2ViUGFnZVBhc3N3b3Jk
KTsKKworICAgIHVzZXJuYW1lID0gd2ViUGFnZVVzZXJuYW1lOworICAgIHBhc3N3b3JkID0gd2Vi
UGFnZVBhc3N3b3JkOworfQorCit2b2lkIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTo6c3Rh
cnREb3dubG9hZChjb25zdCBSZXNvdXJjZVJlcXVlc3QmIHJlcXVlc3QsIGNvbnN0IFN0cmluZyYg
LypzdWdnZXN0ZWROYW1lKi8pCit7CisgICAgLy8gRklYTUU6IHVzZSB0aGUgc3VnZ2VzdGVkTmFt
ZT8KKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5sb2FkKHJlcXVlc3QudXJsKCkuc3RyaW5nKCkudXRm
OCgpLmRhdGEoKSwgMCwgIkdFVCIsIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVz
dDo6VXNlUHJvdG9jb2xDYWNoZVBvbGljeSwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCB0cnVl
LCAiIik7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpkb3dubG9hZChS
ZXNvdXJjZUhhbmRsZSogaGFuZGxlLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmLCBjb25zdCBSZXNv
dXJjZVJlcXVlc3QmLCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByKQoreworICAgIEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpGaWx0ZXJTdHJlYW0qIHN0cmVhbSA9IE5ldHdvcmtNYW5hZ2VyOjppbnN0
YW5jZSgpLT5zdHJlYW1Gb3JIYW5kbGUoaGFuZGxlKTsKKyAgICBBU1NFUlQoc3RyZWFtKTsKKwor
ICAgIG1fd2ViUGFnZVByaXZhdGUtPm1fY2xpZW50LT5kb3dubG9hZFJlcXVlc3RlZChzdHJlYW0s
IHIuc3VnZ2VzdGVkRmlsZW5hbWUoKSk7Cit9CisKK3ZvaWQgRnJhbWVMb2FkZXJDbGllbnRCbGFj
a0JlcnJ5OjpkaXNwYXRjaERpZFJlY2VpdmVJY29uKCkKK3sKKyAgICBTdHJpbmcgdXJsID0gbV9m
cmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCkuc3RyaW5nKCk7CisgICAgSW1hZ2UqIGltZyA9IGljb25E
YXRhYmFzZSgpLnN5bmNocm9ub3VzSWNvbkZvclBhZ2VVUkwodXJsLCBJbnRTaXplKDEwLCAxMCkp
OworICAgIGlmICghaW1nIHx8ICFpbWctPmRhdGEoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
TmF0aXZlSW1hZ2VTa2lhKiBiaXRtYXAgPSBpbWctPm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1l
KCk7CisgICAgaWYgKCFiaXRtYXApCisgICAgICAgIHJldHVybjsKKyAgICBiaXRtYXAtPmxvY2tQ
aXhlbHMoKTsKKyAgICBTdHJpbmcgaWNvblVybCA9IGljb25EYXRhYmFzZSgpLnN5bmNocm9ub3Vz
SWNvblVSTEZvclBhZ2VVUkwodXJsKTsKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2NsaWVudC0+
c2V0RmF2aWNvbihpbWctPndpZHRoKCksIGltZy0+aGVpZ2h0KCksICh1bnNpZ25lZCBjaGFyKili
aXRtYXAtPmdldFBpeGVscygpLCBpY29uVXJsLnV0ZjgoKS5kYXRhKCkpOworICAgIGJpdG1hcC0+
dW5sb2NrUGl4ZWxzKCk7Cit9CisKK2Jvb2wgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Ojpj
YW5DYWNoZVBhZ2UoKSBjb25zdAoreworICAgIC8vIFdlIHdvbid0IGNhY2hlIHBhZ2VzIGNvbnRh
aW5pbmcgdmlkZW8gb3IgYXVkaW8uCisgICAgQVNTRVJUKG1fZnJhbWUtPmRvY3VtZW50KCkpOwor
ICAgIFJlZlB0cjxOb2RlTGlzdD4gbm9kZUxpc3QgPSBtX2ZyYW1lLT5kb2N1bWVudCgpLT5nZXRF
bGVtZW50c0J5VGFnTmFtZShIVE1MTmFtZXM6OnZpZGVvVGFnLmxvY2FsTmFtZSgpKTsKKyAgICBp
ZiAobm9kZUxpc3QuZ2V0KCktPmxlbmd0aCgpID4gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIG5vZGVMaXN0ID0gbV9mcmFtZS0+ZG9jdW1lbnQoKS0+Z2V0RWxlbWVudHNCeVRhZ05hbWUo
SFRNTE5hbWVzOjphdWRpb1RhZy5sb2NhbE5hbWUoKSk7CisgICAgaWYgKG5vZGVMaXN0LmdldCgp
LT5sZW5ndGgoKSA+IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFRoZSBtdWx0
aXBhcnQgb2YgIm11bHRpcGFydC94LW1peGVkLXJlcGxhY2UiIG9ubHkgc3VwcG9ydHMgaW1hZ2Us
IGNvcnJlY3Q/CisgICAgLy8gRklYTUU6IERvIHdlIGhhdmUgYSBiZXR0ZXIgcGxhY2UgdG8gaGFu
ZGxlIHRoaXMgY2FzZT8KKyAgICBub2RlTGlzdCA9IG1fZnJhbWUtPmRvY3VtZW50KCktPmdldEVs
ZW1lbnRzQnlUYWdOYW1lKEhUTUxOYW1lczo6aW1nVGFnLmxvY2FsTmFtZSgpKTsKKyAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0KCktPmxlbmd0aCgpOyArK2kpIHsKKyAg
ICAgICAgSFRNTEltYWdlRWxlbWVudCogbm9kZSA9IHN0YXRpY19jYXN0PEhUTUxJbWFnZUVsZW1l
bnQqPihub2RlTGlzdC5nZXQoKS0+aXRlbShpKSk7CisgICAgICAgIENhY2hlZEltYWdlKiBjYWNo
ZWRpbWFnZSA9IG5vZGUgPyBub2RlLT5jYWNoZWRJbWFnZSgpIDogMDsKKyAgICAgICAgaWYgKGNh
Y2hlZGltYWdlICYmIGNhY2hlZGltYWdlLT5yZXNwb25zZSgpLmlzTXVsdGlwYXJ0UGF5bG9hZCgp
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30K
Kwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OnByb3Zpc2lvbmFsTG9hZFN0YXJ0
ZWQoKQoreworICAgIC8vIFdlIHdvdWxkIGxpa2UgdG8gaGlkZSB0aGUgdmlydHVhbCBrZXlib2Fy
ZCBiZWZvcmUgaXQgbmF2aWdhdGVzIHRvIGFub3RoZXIgcGFnZQorICAgIC8vIHNvIHRoYXQgdGhl
IHNjcm9sbCBvZmZzZXQgd2l0aG91dCBrZXlib2FyZCBzaG93biB3aWxsIGJlIHNhdmVkIGluIHRo
ZSBoaXN0b3J5IGl0ZW0uCisgICAgLy8gVGhlbiB3aGVuIHRoZSB1c2VyIG5hdmlnYXRlcyBiYWNr
LCBpdCB3aWxsIHNjcm9sbCB0byB0aGUgcmlnaHQgcG9zaXRpb24uCisgICAgaWYgKGlzTWFpbkZy
YW1lKCkpCisgICAgICAgIG1fd2ViUGFnZVByaXZhdGUtPnNob3dWaXJ0dWFsS2V5Ym9hcmQoZmFs
c2UpOworfQorCisvLyBXZSBkb24ndCBuZWVkIHRvIHByb3ZpZGUgdGhlIGVycm9yIG1lc3NhZ2Ug
c3RyaW5nLCB0aGF0IHdpbGwgYmUgaGFuZGxlZCBpbiBCcm93c2VyRXJyb3JQYWdlIGFjY29yZGlu
ZyB0byB0aGUgZXJyb3IgY29kZS4KK1Jlc291cmNlRXJyb3IgRnJhbWVMb2FkZXJDbGllbnRCbGFj
a0JlcnJ5OjpjYW5ub3RTaG93VVJMRXJyb3IoY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0
KQoreworICAgIC8vIEZJWE1FOiBXaHkgYXJlIHdlIG5vdCBwYXNzaW5nIHRoZSBkb21haW4gdG8g
dGhlIFJlc291cmNlRXJyb3I/IFNlZSBQUiAjMTE5Nzg5LgorICAgIHJldHVybiBSZXNvdXJjZUVy
cm9yKFN0cmluZygpLCBXZWJLaXRFcnJvckNhbm5vdFNob3dVUkwsIHJlcXVlc3QudXJsKCkuc3Ry
aW5nKCksIFN0cmluZygpKTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6
OmRpZFJlc3RvcmVGcm9tUGFnZUNhY2hlKCkKK3sKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5tX2Rp
ZFJlc3RvcmVGcm9tUGFnZUNhY2hlID0gdHJ1ZTsKK30KKwordm9pZCBGcmFtZUxvYWRlckNsaWVu
dEJsYWNrQmVycnk6OmRpc3BhdGNoV2lsbFVwZGF0ZUFwcGxpY2F0aW9uQ2FjaGUoY29uc3QgUmVz
b3VyY2VSZXF1ZXN0JikKK3sKKyAgICBBU1NFUlQoaXNNYWluRnJhbWUoKSk7CisgICAgaWYgKCFp
c01haW5GcmFtZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3dlYlBhZ2VQcml2YXRlLT5t
X2NsaWVudC0+bm90aWZ5V2lsbFVwZGF0ZUFwcGxpY2F0aW9uQ2FjaGUoKTsKK30KKwordm9pZCBG
cmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk6OmRpc3BhdGNoRGlkTG9hZEZyb21BcHBsaWNhdGlv
bkNhY2hlKGNvbnN0IFJlc291cmNlUmVxdWVzdCYpCit7CisgICAgQVNTRVJUKGlzTWFpbkZyYW1l
KCkpOworICAgIGlmICghaXNNYWluRnJhbWUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV93
ZWJQYWdlUHJpdmF0ZS0+bV9jbGllbnQtPm5vdGlmeURpZExvYWRGcm9tQXBwbGljYXRpb25DYWNo
ZSgpOworfQorCit9IC8vIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2ti
ZXJyeS9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkuaCBiL1NvdXJj
ZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJDb3JlU3VwcG9ydC9GcmFtZUxvYWRlckNsaWVudEJsYWNr
QmVycnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5hM2ZjZmQ5YmQxMmQ1OTU5NGE0ODNkNTlkNjJkNGNiZmVmYWNl
OGM2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYkNvcmVT
dXBwb3J0L0ZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeS5oCkBAIC0wLDAgKzEsMjM1IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1v
dGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlm
eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3Jp
dGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisK
KyNpZm5kZWYgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5X2gKKyNkZWZpbmUgRnJhbWVMb2Fk
ZXJDbGllbnRCbGFja0JlcnJ5X2gKKworI2luY2x1ZGUgIkRvY3VtZW50TG9hZGVyLmgiCisjaW5j
bHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJGcmFtZUxvYWRlckNsaWVudC5oIgorI2luY2x1ZGUg
Ik5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiV2lkZ2V0LmgiCisKK25hbWVzcGFjZSBCbGFj
a0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworY2xhc3MgV2ViUGFnZVByaXZhdGU7Cit9Cit9
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgRnJhbWVOZXR3b3JraW5nQ29udGV4dDsK
K2NsYXNzIEdlb2xvY2F0aW9uOworCitjbGFzcyBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkg
OiBwdWJsaWMgRnJhbWVMb2FkZXJDbGllbnQgeworcHVibGljOgorICAgIEZyYW1lTG9hZGVyQ2xp
ZW50QmxhY2tCZXJyeSgpOworICAgIH5GcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkoKTsKKwor
ICAgIHZvaWQgc2V0RnJhbWUoRnJhbWUqIGZyYW1lLCBCbGFja0JlcnJ5OjpXZWJLaXQ6OldlYlBh
Z2VQcml2YXRlKiB3ZWJQYWdlUHJpdmF0ZSkgeyBtX2ZyYW1lID0gZnJhbWU7IG1fd2ViUGFnZVBy
aXZhdGUgPSB3ZWJQYWdlUHJpdmF0ZTsgfQorCisgICAgaW50IHBsYXllcklkKCkgY29uc3Q7Cisg
ICAgYm9vbCBjb29raWVzRW5hYmxlZCgpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIGZyYW1l
TG9hZGVyRGVzdHJveWVkKCk7CisgICAgdmlydHVhbCBib29sIGhhc1dlYlZpZXcoKSBjb25zdCB7
IHJldHVybiB0cnVlOyB9CisgICAgdmlydHVhbCB2b2lkIG1ha2VSZXByZXNlbnRhdGlvbihEb2N1
bWVudExvYWRlciopIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBmb3Jj
ZUxheW91dCgpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBmb3JjZUxh
eW91dEZvck5vbkhUTUwoKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQg
c2V0Q29waWVzT25TY3JvbGwoKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZv
aWQgZGV0YWNoZWRGcm9tUGFyZW50MigpOworICAgIHZpcnR1YWwgdm9pZCBkZXRhY2hlZEZyb21Q
YXJlbnQzKCkgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGFzc2lnbklk
ZW50aWZpZXJUb0luaXRpYWxSZXF1ZXN0KGxvbmcgdW5zaWduZWQgaW50LCBEb2N1bWVudExvYWRl
ciosIGNvbnN0IFJlc291cmNlUmVxdWVzdCYpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZp
cnR1YWwgdm9pZCBkaXNwYXRjaFdpbGxTZW5kUmVxdWVzdChEb2N1bWVudExvYWRlciosIGxvbmcg
dW5zaWduZWQgaW50LCBSZXNvdXJjZVJlcXVlc3QmLCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJik7
CisgICAgdmlydHVhbCBib29sIHNob3VsZFVzZUNyZWRlbnRpYWxTdG9yYWdlKERvY3VtZW50TG9h
ZGVyKiwgbG9uZyB1bnNpZ25lZCBpbnQpIHsgbm90SW1wbGVtZW50ZWQoKTsgcmV0dXJuIGZhbHNl
OyB9CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hh
bGxlbmdlKERvY3VtZW50TG9hZGVyKiwgbG9uZyB1bnNpZ25lZCBpbnQsIGNvbnN0IEF1dGhlbnRp
Y2F0aW9uQ2hhbGxlbmdlJikgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lk
IGRpc3BhdGNoRGlkQ2FuY2VsQXV0aGVudGljYXRpb25DaGFsbGVuZ2UoRG9jdW1lbnRMb2FkZXIq
LCBsb25nIHVuc2lnbmVkIGludCwgY29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmKSB7IG5v
dEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRSZWNlaXZlUmVz
cG9uc2UoRG9jdW1lbnRMb2FkZXIqLCBsb25nIHVuc2lnbmVkIGludCwgY29uc3QgUmVzb3VyY2VS
ZXNwb25zZSYpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZFJlY2VpdmVDb250ZW50TGVu
Z3RoKERvY3VtZW50TG9hZGVyKiwgbG9uZyB1bnNpZ25lZCBpbnQsIGludCkgeyBub3RJbXBsZW1l
bnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkRmluaXNoTG9hZGluZyhEb2N1
bWVudExvYWRlciosIGxvbmcgdW5zaWduZWQgaW50KSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAg
ICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRGYWlsTG9hZGluZyhEb2N1bWVudExvYWRlciosIGxv
bmcgdW5zaWduZWQgaW50LCBjb25zdCBSZXNvdXJjZUVycm9yJikgeyBub3RJbXBsZW1lbnRlZCgp
OyB9CisgICAgdmlydHVhbCBib29sIGRpc3BhdGNoRGlkTG9hZFJlc291cmNlRnJvbU1lbW9yeUNh
Y2hlKERvY3VtZW50TG9hZGVyKiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiwgY29uc3QgUmVzb3Vy
Y2VSZXNwb25zZSYsIGludCkgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gZmFsc2U7IH0KKyAg
ICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRIYW5kbGVPbmxvYWRFdmVudHMoKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZGlzcGF0Y2hEaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbExv
YWQoKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRD
YW5jZWxDbGllbnRSZWRpcmVjdCgpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaFdpbGxQZXJm
b3JtQ2xpZW50UmVkaXJlY3QoY29uc3QgS1VSTCYsIGRvdWJsZSwgZG91YmxlKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZGlzcGF0Y2hEaWRDaGFuZ2VMb2NhdGlvbldpdGhpblBhZ2UoKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZGlzcGF0Y2hEaWRQdXNoU3RhdGVXaXRoaW5QYWdlKCk7CisgICAgdmlydHVhbCB2
b2lkIGRpc3BhdGNoRGlkUmVwbGFjZVN0YXRlV2l0aGluUGFnZSgpOworICAgIHZpcnR1YWwgdm9p
ZCBkaXNwYXRjaERpZFBvcFN0YXRlV2l0aGluUGFnZSgpOworICAgIHZpcnR1YWwgdm9pZCBkaXNw
YXRjaFdpbGxDbG9zZSgpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZFJlY2VpdmVJY29u
KCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkU3RhcnRQcm92aXNpb25hbExvYWQoKTsK
KyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRSZWNlaXZlVGl0bGUoY29uc3QgU3RyaW5nV2l0
aERpcmVjdGlvbiYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRUaXRsZShjb25zdCBTdHJpbmdXaXRo
RGlyZWN0aW9uJiB0aXRsZSwgY29uc3QgS1VSTCYpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRj
aERpZENvbW1pdExvYWQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRGYWlsUHJvdmlz
aW9uYWxMb2FkKGNvbnN0IFJlc291cmNlRXJyb3ImKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0
Y2hEaWRGYWlsTG9hZChjb25zdCBSZXNvdXJjZUVycm9yJik7CisgICAgdmlydHVhbCB2b2lkIGRp
c3BhdGNoRGlkRmluaXNoRG9jdW1lbnRMb2FkKCk7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNo
RGlkRmluaXNoTG9hZCgpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZEZpcnN0TGF5b3V0
KCkgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkRmly
c3RWaXN1YWxseU5vbkVtcHR5TGF5b3V0KCk7CisgICAgdmlydHVhbCBGcmFtZSogZGlzcGF0Y2hD
cmVhdGVQYWdlKGNvbnN0IE5hdmlnYXRpb25BY3Rpb24mKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlz
cGF0Y2hTaG93KCkgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlz
cGF0Y2hEZWNpZGVQb2xpY3lGb3JSZXNwb25zZShGcmFtZVBvbGljeUZ1bmN0aW9uLCBjb25zdCBS
ZXNvdXJjZVJlc3BvbnNlJiwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0Jik7CisgICAgdmlydHVhbCB2
b2lkIGRpc3BhdGNoRGVjaWRlUG9saWN5Rm9yTmV3V2luZG93QWN0aW9uKEZyYW1lUG9saWN5RnVu
Y3Rpb24sIGNvbnN0IE5hdmlnYXRpb25BY3Rpb24mLCBjb25zdCBSZXNvdXJjZVJlcXVlc3QmLCBQ
YXNzUmVmUHRyPEZvcm1TdGF0ZT4sIGNvbnN0IFN0cmluZyYgZnJhbWVOYW1lKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZGlzcGF0Y2hEZWNpZGVQb2xpY3lGb3JOYXZpZ2F0aW9uQWN0aW9uKEZyYW1lUG9s
aWN5RnVuY3Rpb24sIGNvbnN0IE5hdmlnYXRpb25BY3Rpb24mLCBjb25zdCBSZXNvdXJjZVJlcXVl
c3QmLCBQYXNzUmVmUHRyPEZvcm1TdGF0ZT4pOworICAgIHZpcnR1YWwgdm9pZCBjYW5jZWxQb2xp
Y3lDaGVjaygpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaFVuYWJsZVRvSW1wbGVtZW50UG9s
aWN5KGNvbnN0IFJlc291cmNlRXJyb3ImKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0
dWFsIHZvaWQgZGlzcGF0Y2hXaWxsU3VibWl0Rm9ybShGcmFtZVBvbGljeUZ1bmN0aW9uLCBQYXNz
UmVmUHRyPEZvcm1TdGF0ZT4pOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZExvYWRNYWlu
UmVzb3VyY2UoRG9jdW1lbnRMb2FkZXIqKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0
dWFsIHZvaWQgcmV2ZXJ0VG9Qcm92aXNpb25hbFN0YXRlKERvY3VtZW50TG9hZGVyKikgeyBub3RJ
bXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIHNldE1haW5Eb2N1bWVudEVycm9yKERv
Y3VtZW50TG9hZGVyKiwgY29uc3QgUmVzb3VyY2VFcnJvciYpOworICAgIHZpcnR1YWwgdm9pZCBw
b3N0UHJvZ3Jlc3NTdGFydGVkTm90aWZpY2F0aW9uKCk7CisgICAgdmlydHVhbCB2b2lkIHBvc3RQ
cm9ncmVzc0VzdGltYXRlQ2hhbmdlZE5vdGlmaWNhdGlvbigpOworICAgIHZpcnR1YWwgdm9pZCBw
b3N0UHJvZ3Jlc3NGaW5pc2hlZE5vdGlmaWNhdGlvbigpOworICAgIHZpcnR1YWwgdm9pZCBzZXRN
YWluRnJhbWVEb2N1bWVudFJlYWR5KGJvb2wpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZp
cnR1YWwgdm9pZCBzdGFydERvd25sb2FkKGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIGNvbnN0IFN0
cmluZyYgc3VnZ2VzdGVkTmFtZSA9IFN0cmluZygpKTsKKyAgICB2aXJ0dWFsIHZvaWQgd2lsbENo
YW5nZVRpdGxlKERvY3VtZW50TG9hZGVyKikgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmly
dHVhbCB2b2lkIGRpZENoYW5nZVRpdGxlKERvY3VtZW50TG9hZGVyKikgeyBub3RJbXBsZW1lbnRl
ZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdHRlZExvYWQoRG9jdW1lbnRMb2FkZXIqLCBj
b25zdCBjaGFyKiwgaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgZmluaXNoZWRMb2FkaW5nKERvY3Vt
ZW50TG9hZGVyKik7CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZUdsb2JhbEhpc3RvcnkoKSB7IG5v
dEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlR2xvYmFsSGlzdG9yeVJl
ZGlyZWN0TGlua3MoKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIGJvb2wgc2hv
dWxkR29Ub0hpc3RvcnlJdGVtKEhpc3RvcnlJdGVtKikgY29uc3Q7CisgICAgdmlydHVhbCBib29s
IHNob3VsZFN0b3BMb2FkaW5nRm9ySGlzdG9yeUl0ZW0oSGlzdG9yeUl0ZW0qKSBjb25zdDsKKyAg
ICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRBZGRCYWNrRm9yd2FyZEl0ZW0oSGlzdG9yeUl0ZW0q
KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRSZW1vdmVCYWNrRm9yd2FyZEl0
ZW0oSGlzdG9yeUl0ZW0qKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEaWRDaGFu
Z2VCYWNrRm9yd2FyZEluZGV4KCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoV2ls
bFVwZGF0ZUFwcGxpY2F0aW9uQ2FjaGUoY29uc3QgUmVzb3VyY2VSZXF1ZXN0Jik7CisgICAgdmly
dHVhbCB2b2lkIGRpc3BhdGNoRGlkTG9hZEZyb21BcHBsaWNhdGlvbkNhY2hlKGNvbnN0IFJlc291
cmNlUmVxdWVzdCYpOworICAgIHZpcnR1YWwgdm9pZCBkaWREaXNwbGF5SW5zZWN1cmVDb250ZW50
KCkgeyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIGRpZFJ1bkluc2VjdXJl
Q29udGVudChTZWN1cml0eU9yaWdpbiosIGNvbnN0IEtVUkwmKSB7IG5vdEltcGxlbWVudGVkKCk7
IH0KKyAgICB2aXJ0dWFsIFJlc291cmNlRXJyb3IgaW50ZXJydXB0ZWRGb3JQb2xpY3lDaGFuZ2VF
cnJvcihjb25zdCBSZXNvdXJjZVJlcXVlc3QmKSB7IG5vdEltcGxlbWVudGVkKCk7IHJldHVybiBS
ZXNvdXJjZUVycm9yKGVtcHR5U3RyaW5nKCksIDAsIGVtcHR5U3RyaW5nKCksIGVtcHR5U3RyaW5n
KCkpOyB9CisgICAgdmlydHVhbCBSZXNvdXJjZUVycm9yIGNhbmNlbGxlZEVycm9yKGNvbnN0IFJl
c291cmNlUmVxdWVzdCYpIHsgbm90SW1wbGVtZW50ZWQoKTsgcmV0dXJuIFJlc291cmNlRXJyb3Io
ZW1wdHlTdHJpbmcoKSwgMCwgZW1wdHlTdHJpbmcoKSwgZW1wdHlTdHJpbmcoKSk7IH0KKyAgICB2
aXJ0dWFsIFJlc291cmNlRXJyb3IgYmxvY2tlZEVycm9yKGNvbnN0IFJlc291cmNlUmVxdWVzdCYp
IHsgbm90SW1wbGVtZW50ZWQoKTsgcmV0dXJuIFJlc291cmNlRXJyb3IoZW1wdHlTdHJpbmcoKSwg
MCwgZW1wdHlTdHJpbmcoKSwgZW1wdHlTdHJpbmcoKSk7IH0KKyAgICB2aXJ0dWFsIFJlc291cmNl
RXJyb3IgY2Fubm90U2hvd1VSTEVycm9yKGNvbnN0IFJlc291cmNlUmVxdWVzdCYpOworICAgIHZp
cnR1YWwgUmVzb3VyY2VFcnJvciBpbnRlcnJ1cHRGb3JQb2xpY3lDaGFuZ2VFcnJvcihjb25zdCBS
ZXNvdXJjZVJlcXVlc3QmKSB7IG5vdEltcGxlbWVudGVkKCk7IHJldHVybiBSZXNvdXJjZUVycm9y
KGVtcHR5U3RyaW5nKCksIDAsIGVtcHR5U3RyaW5nKCksIGVtcHR5U3RyaW5nKCkpOyB9CisgICAg
dmlydHVhbCBSZXNvdXJjZUVycm9yIGNhbm5vdFNob3dNSU1FVHlwZUVycm9yKGNvbnN0IFJlc291
cmNlUmVzcG9uc2UmKSB7IG5vdEltcGxlbWVudGVkKCk7IHJldHVybiBSZXNvdXJjZUVycm9yKGVt
cHR5U3RyaW5nKCksIDAsIGVtcHR5U3RyaW5nKCksIGVtcHR5U3RyaW5nKCkpOyB9CisgICAgdmly
dHVhbCBSZXNvdXJjZUVycm9yIGZpbGVEb2VzTm90RXhpc3RFcnJvcihjb25zdCBSZXNvdXJjZVJl
c3BvbnNlJikgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gUmVzb3VyY2VFcnJvcihlbXB0eVN0
cmluZygpLCAwLCBlbXB0eVN0cmluZygpLCBlbXB0eVN0cmluZygpKTsgfQorICAgIHZpcnR1YWwg
UmVzb3VyY2VFcnJvciBwbHVnaW5XaWxsSGFuZGxlTG9hZEVycm9yKGNvbnN0IFJlc291cmNlUmVz
cG9uc2UmKSB7IG5vdEltcGxlbWVudGVkKCk7IHJldHVybiBSZXNvdXJjZUVycm9yKGVtcHR5U3Ry
aW5nKCksIDAsIGVtcHR5U3RyaW5nKCksIGVtcHR5U3RyaW5nKCkpOyB9CisgICAgdmlydHVhbCBi
b29sIHNob3VsZEZhbGxCYWNrKGNvbnN0IFJlc291cmNlRXJyb3ImKSB7IG5vdEltcGxlbWVudGVk
KCk7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBjYW5IYW5kbGVSZXF1ZXN0KGNv
bnN0IFJlc291cmNlUmVxdWVzdCYpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBjYW5TaG93TUlN
RVR5cGUoY29uc3QgU3RyaW5nJikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGNhblNob3dNSU1F
VHlwZUFzSFRNTChjb25zdCBTdHJpbmcmKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcmVwcmVz
ZW50YXRpb25FeGlzdHNGb3JVUkxTY2hlbWUoY29uc3QgU3RyaW5nJikgY29uc3QgeyBub3RJbXBs
ZW1lbnRlZCgpOyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIFN0cmluZyBnZW5lcmF0ZWRN
SU1FVHlwZUZvclVSTFNjaGVtZShjb25zdCBTdHJpbmcmKSBjb25zdCB7IG5vdEltcGxlbWVudGVk
KCk7IHJldHVybiBTdHJpbmcoKTsgfQorICAgIHZpcnR1YWwgdm9pZCBmcmFtZUxvYWRDb21wbGV0
ZWQoKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2F2ZVZpZXdTdGF0
ZVRvSXRlbShIaXN0b3J5SXRlbSopOworICAgIHZpcnR1YWwgdm9pZCByZXN0b3JlVmlld1N0YXRl
KCk7CisgICAgdmlydHVhbCB2b2lkIHByb3Zpc2lvbmFsTG9hZFN0YXJ0ZWQoKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZGlkRmluaXNoTG9hZCgpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorICAgIHZpcnR1
YWwgdm9pZCBwcmVwYXJlRm9yRGF0YVNvdXJjZVJlcGxhY2VtZW50KCkgeyBub3RJbXBsZW1lbnRl
ZCgpOyB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPERvY3VtZW50TG9hZGVyPiBjcmVhdGVEb2N1
bWVudExvYWRlcihjb25zdCBSZXNvdXJjZVJlcXVlc3QmLCBjb25zdCBTdWJzdGl0dXRlRGF0YSYp
OworICAgIHZpcnR1YWwgdm9pZCBzZXRUaXRsZShjb25zdCBTdHJpbmcmLCBjb25zdCBLVVJMJikg
eyBub3RJbXBsZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCBTdHJpbmcgdXNlckFnZW50KGNvbnN0
IEtVUkwmKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2F2ZVBsYXRmb3JtRGF0YVRvQ2FjaGVkRnJhbWUo
Q2FjaGVkRnJhbWUqKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgdHJh
bnNpdGlvblRvQ29tbWl0dGVkRnJvbUNhY2hlZEZyYW1lKENhY2hlZEZyYW1lKikgeyBub3RJbXBs
ZW1lbnRlZCgpOyB9CisgICAgdmlydHVhbCB2b2lkIHRyYW5zaXRpb25Ub0NvbW1pdHRlZEZvck5l
d1BhZ2UoKTsKKyAgICB2aXJ0dWFsIGJvb2wgY2FuQ2FjaGVQYWdlKCkgY29uc3Q7CisgICAgdmly
dHVhbCB2b2lkIGRpZFNhdmVUb1BhZ2VDYWNoZSgpIHsgfQorICAgIHZpcnR1YWwgdm9pZCBkaWRS
ZXN0b3JlRnJvbVBhZ2VDYWNoZSgpOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERpZEJlY29t
ZUZyYW1lc2V0KGJvb2wpIHsgfQorICAgIHZpcnR1YWwgdm9pZCBkb3dubG9hZChSZXNvdXJjZUhh
bmRsZSosIGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIGNv
bnN0IFJlc291cmNlUmVzcG9uc2UmKTsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8RnJhbWU+IGNy
ZWF0ZUZyYW1lKGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmLCBIVE1MRnJhbWVPd25lckVsZW1l
bnQqLCBjb25zdCBTdHJpbmcmLCBib29sLCBpbnQsIGludCk7CisgICAgdmlydHVhbCB2b2lkIGRp
ZFRyYW5zZmVyQ2hpbGRGcmFtZVRvTmV3RG9jdW1lbnQoUGFnZSopOworICAgIHZpcnR1YWwgUGFz
c1JlZlB0cjxXaWRnZXQ+IGNyZWF0ZVBsdWdpbihjb25zdCBJbnRTaXplJiwgSFRNTFBsdWdJbkVs
ZW1lbnQqLCBjb25zdCBLVVJMJiwgY29uc3QgVmVjdG9yPFN0cmluZz4mLCBjb25zdCBWZWN0b3I8
U3RyaW5nPiYsIGNvbnN0IFN0cmluZyYsIGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCByZWRpcmVj
dERhdGFUb1BsdWdpbihXaWRnZXQqKTsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8V2lkZ2V0PiBj
cmVhdGVKYXZhQXBwbGV0V2lkZ2V0KGNvbnN0IEludFNpemUmLCBIVE1MQXBwbGV0RWxlbWVudCos
IGNvbnN0IEtVUkwmLCBjb25zdCBWZWN0b3I8U3RyaW5nPiYsIGNvbnN0IFZlY3RvcjxTdHJpbmc+
JikgeyBub3RJbXBsZW1lbnRlZCgpOyByZXR1cm4gMDsgfQorCisgICAgdmlydHVhbCBPYmplY3RD
b250ZW50VHlwZSBvYmplY3RDb250ZW50VHlwZShjb25zdCBLVVJMJiwgY29uc3QgU3RyaW5nJiBt
aW1lVHlwZSwgYm9vbCBzaG91bGRQcmVmZXJQbHVnSW5zRm9ySW1hZ2VzKTsKKyAgICB2aXJ0dWFs
IFN0cmluZyBvdmVycmlkZU1lZGlhVHlwZSgpIGNvbnN0IHsgbm90SW1wbGVtZW50ZWQoKTsgcmV0
dXJuIFN0cmluZygpOyB9CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGlkQ2xlYXJXaW5kb3dP
YmplY3RJbldvcmxkKERPTVdyYXBwZXJXb3JsZCopOworICAgIHZpcnR1YWwgdm9pZCBkb2N1bWVu
dEVsZW1lbnRBdmFpbGFibGUoKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKyAgICB2aXJ0dWFsIHZv
aWQgZGlkUGVyZm9ybUZpcnN0TmF2aWdhdGlvbigpIGNvbnN0IHsgbm90SW1wbGVtZW50ZWQoKTsg
fQorICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckZvckljb25Ob3RpZmljYXRpb24oYm9vbCkgeyBu
b3RJbXBsZW1lbnRlZCgpOyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkTG9hZEljb25FeHRl
cm5hbGx5KCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIHZvaWQgbG9hZEljb25FeHRl
cm5hbGx5KGNvbnN0IFN0cmluZyYgb3JpZ2luYWxQYWdlVXJsLCBjb25zdCBTdHJpbmcmIGZpbmFs
UGFnZVVybCwgY29uc3QgU3RyaW5nJiBpY29uVXJsKTsKKworICAgIHZpcnR1YWwgdm9pZCBkaWRE
ZXRlY3RYU1MoY29uc3QgS1VSTCYsIGJvb2wpIHsgfQorICAgIHZpcnR1YWwgdm9pZCB0cmFuc2Zl
ckxvYWRpbmdSZXNvdXJjZUZyb21QYWdlKFJlc291cmNlTG9hZGVyKiwgY29uc3QgUmVzb3VyY2VS
ZXF1ZXN0JiwgUGFnZSopOworICAgIHZpcnR1YWwgdm9pZCBkaWRUcmFuc2ZlckNoaWxkRnJhbWVU
b05ld0RvY3VtZW50KCkgeyBub3RJbXBsZW1lbnRlZCgpOyB9OworICAgIHZpcnR1YWwgdm9pZCBk
aXNwYXRjaERpZENoYW5nZUljb25zKEljb25UeXBlKSB7IG5vdEltcGxlbWVudGVkKCk7IH07Cisg
ICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoV2lsbFNlbmRTdWJtaXRFdmVudChIVE1MRm9ybUVsZW1l
bnQqKSB7IG5vdEltcGxlbWVudGVkKCk7IH07CisKKyAgICB2aXJ0dWFsIHZvaWQgd2lsbERlZmVy
TG9hZGluZygpOworICAgIHZpcnR1YWwgdm9pZCBkaWRSZXN1bWVMb2FkaW5nKCk7CisgICAgdmly
dHVhbCB2b2lkIGF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKGNvbnN0IFN0cmluZyYgcmVhbG0sIFN0
cmluZyYgdXNlcm5hbWUsIFN0cmluZyYgcGFzc3dvcmQpOworCisgICAgdmlydHVhbCBQYXNzUmVm
UHRyPEZyYW1lTmV0d29ya2luZ0NvbnRleHQ+IGNyZWF0ZU5ldHdvcmtpbmdDb250ZXh0KCk7CisK
KyAgICAgLy8gU2NoZWR1bGUgYSBzY3JpcHQgdGhhdCB3YXMgbG9hZGVkIG1hbnVhbGx5IGJ5IHRo
ZSB1c2VyIChlZy4gYQorICAgICAvLyBib29rbWFya2xldCkgd2hpbGUgcGFnZSBsb2FkaW5nIHdh
cyBkZWZlcnJlZC4KKyAgICB2b2lkIHNldERlZmVycmVkTWFudWFsU2NyaXB0KGNvbnN0IEtVUkwm
KTsKKworICAgIHZvaWQgcmVhZHlUb1JlbmRlcihib29sIHBhZ2VJc1Zpc3VhbGx5Tm9uRW1wdHkp
OworCisgICAgdm9pZCBkb1BlbmRpbmdGcmFnbWVudFNjcm9sbCgpOworCisgICAgLy8gVXNlZCB0
byBzdG9wIG1lZGlhIGZpbGVzIGZyb20gbG9hZGluZyBiZWNhdXNlIHdlIGRvbid0IG5lZWQgdG8g
aGF2ZSB0aGUgZW50aXJlIGZpbGUgbG9hZGVkIGJ5IFdlYktpdC4KKyAgICB2b2lkIHNldENhbmNl
bExvYWRPbk5leHREYXRhKCkgeyBtX2NhbmNlbExvYWRPbk5leHREYXRhID0gdHJ1ZTsgfQorICAg
IGJvb2wgc2hvdWxkQ2FuY2VsTG9hZE9uTmV4dERhdGEoKSBjb25zdCB7IHJldHVybiBtX2NhbmNl
bExvYWRPbk5leHREYXRhOyB9CisKKyAgICB2b2lkIHN1cHByZXNzQ2hpbGRGcmFtZUNyZWF0aW9u
KCkgeyBtX2NoaWxkRnJhbWVDcmVhdGlvblN1cHByZXNzZWQgPSB0cnVlOyB9CisKK3ByaXZhdGU6
CisgICAgdm9pZCByZWNlaXZlZERhdGEoY29uc3QgY2hhciosIGludCwgY29uc3QgU3RyaW5nJik7
CisgICAgdm9pZCBkaWRGaW5pc2hPckZhaWxMb2FkaW5nKGNvbnN0IFJlc291cmNlRXJyb3ImKTsK
KyAgICBib29sIGlzTWFpbkZyYW1lKCkgY29uc3Q7CisKKyAgICB2b2lkIGludmFsaWRhdGVCYWNr
Rm9yd2FyZExpc3QoKSBjb25zdDsKKyAgICB2b2lkIG5vdGlmeUJhY2tGb3J3YXJkTGlzdENoYW5n
ZWQoKSBjb25zdDsKKworICAgIFBvbGljeUFjdGlvbiBkZWNpZGVQb2xpY3lGb3JFeHRlcm5hbExv
YWQoY29uc3QgUmVzb3VyY2VSZXF1ZXN0ICYsIGJvb2wgaXNGcmFnbWVudFNjcm9sbCk7CisgICAg
dm9pZCBkZWxheVBvbGljeUNoZWNrVW50aWxGcmFnbWVudEV4aXN0cyhjb25zdCBTdHJpbmcmIGZy
YWdtZW50LCBGcmFtZVBvbGljeUZ1bmN0aW9uKTsKKworICAgIHZvaWQgZGVmZXJyZWRKb2JzVGlt
ZXJGaXJlZChUaW1lcjxGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk+Kik7CisKKyAgICBGcmFt
ZSogbV9mcmFtZTsKKyAgICBSZXNvdXJjZUVycm9yIG1fbG9hZEVycm9yOworICAgIEJsYWNrQmVy
cnk6OldlYktpdDo6V2ViUGFnZVByaXZhdGUqIG1fd2ViUGFnZVByaXZhdGU7CisKKyAgICBUaW1l
cjxGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk+KiBtX2RlZmVycmVkSm9ic1RpbWVyOworICAg
IEtVUkwgbV9kZWZlcnJlZE1hbnVhbFNjcmlwdDsKKyAgICBHZW9sb2NhdGlvbiogbV9nZW9sb2Nh
dGlvbjsKKyAgICBib29sIG1fc2VudFJlYWR5VG9SZW5kZXI7CisKKyAgICBGcmFtZVBvbGljeUZ1
bmN0aW9uIG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsUG9saWN5RnVuY3Rpb247CisgICAgU3RyaW5n
IG1fcGVuZGluZ0ZyYWdtZW50U2Nyb2xsOworCisgICAgYm9vbCBtX2xvYWRpbmdFcnJvclBhZ2U7
CisgICAgYm9vbCBtX2NsaWVudFJlZGlyZWN0SXNQZW5kaW5nOworICAgIGJvb2wgbV9jaGlsZEZy
YW1lQ3JlYXRpb25TdXBwcmVzc2VkOworCisgICAgLy8gVGhpcyBzZXQgaW5jbHVkZXMgdGhlIG9y
aWdpbmFsIGFuZCBmaW5hbCB1cmxzIGZvciBzZXJ2ZXIgcmVkaXJlY3RzLgorICAgIEhhc2hTZXQ8
S1VSTD4gbV9oaXN0b3J5TmF2aWdhdGlvblNvdXJjZVVSTHM7CisgICAgSGFzaFNldDxLVVJMPiBt
X3JlZGlyZWN0VVJMc1RvU2tpcER1ZVRvSGlzdG9yeU5hdmlnYXRpb247CisKKyAgICAvLyBQbHVn
aW4gdmlldyB0byByZWRpcmVjdCBkYXRhIHRvLgorICAgIFBsdWdpblZpZXcqIG1fcGx1Z2luVmll
dzsKKyAgICBib29sIG1faGFzU2VudFJlc3BvbnNlVG9QbHVnaW47CisKKyAgICAvLyBVc2VkIHRv
IHN0b3AgbWVkaWEgZmlsZXMgZnJvbSBsb2FkaW5nIGJlY2F1c2Ugd2UgZG9uJ3QgbmVlZCB0byBo
YXZlIHRoZSBlbnRpcmUgZmlsZSBsb2FkZWQgYnkgV2ViS2l0LgorICAgIGJvb2wgbV9jYW5jZWxM
b2FkT25OZXh0RGF0YTsKK307CisKK30gLy8gV2ViQ29yZQorCisjZW5kaWYgLy8gRnJhbWVMb2Fk
ZXJDbGllbnRCbGFja0JlcnJ5X2gK
</data>

          </attachment>
      

    </bug>

</bugzilla>