<?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>78136</bug_id>
          
          <creation_ts>2012-02-08 11:55:49 -0800</creation_ts>
          <short_desc>Initial upstreaming of selection handling code for BlackBerry port</short_desc>
          <delta_ts>2012-02-13 23:31:41 -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="Nima Ghanavatian">nima.ghanavatian</reporter>
          <assigned_to name="Nima Ghanavatian">nima.ghanavatian</assigned_to>
          <cc>rwlbuis</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>552354</commentid>
    <comment_count>0</comment_count>
    <who name="Nima Ghanavatian">nima.ghanavatian</who>
    <bug_when>2012-02-08 11:55:49 -0800</bug_when>
    <thetext>Upstreaming SelectionHandler.cpp and SelectionHandler.h for the BlackBerry port</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552378</commentid>
    <comment_count>1</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-08 12:17:13 -0800</bug_when>
    <thetext>Assign to Nima.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553156</commentid>
    <comment_count>2</comment_count>
      <attachid>126301</attachid>
    <who name="Nima Ghanavatian">nima.ghanavatian</who>
    <bug_when>2012-02-09 07:42:46 -0800</bug_when>
    <thetext>Created attachment 126301
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553194</commentid>
    <comment_count>3</comment_count>
      <attachid>126301</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-09 08:37:53 -0800</bug_when>
    <thetext>Comment on attachment 126301
Patch

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

Looks good, but can be cleaned up a bit more.

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp:131
&gt; +    IntPoint framePosition = m_webPage-&gt;frameOffset(m_webPage-&gt;focusedOrMainFrame());

The above can go into the if below, since if the if turns out to be false, these declarations are not needed.

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp:250
&gt; +        if (character)

You can combine the above two statements

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp:334
&gt; +    FrameSelection* controller = focusedFrame-&gt;selection();

controller can be moved until after the if.

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp:380
&gt; +    FrameSelection* controller = focusedFrame-&gt;selection();

Ditto.

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp:607
&gt; +    ASSERT(m_webPage &amp;&amp; m_webPage-&gt;focusedOrMainFrame() &amp;&amp; m_webPage-&gt;focusedOrMainFrame()-&gt;selection());

Should ASSERT be moved up? We could crash in debug mode if m_webPage is null without any help.

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp:678
&gt; +    (isStartCaret) ? return !isRTL : return isRTL;

No need for parentheses.

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp:725
&gt; +        // Compare start and end and update.

end and?

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.h:2
&gt; + * Copyright (C) 2010, 2011 Research In Motion Limited. All rights reserved.

Once you change anything here better add 2012.

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.h:24
&gt; +#include &quot;TextGranularity.h&quot;

You probably can get away with doing a forward reference to TextGranularity, and including it in the cpp.

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.h:56
&gt; +    bool findNextString(const WTF::String&amp;, bool);

Would it be possible to use either WebString or WTF::String exclusively here? Could make the API more consistant.

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.h:70
&gt; +    bool lastUpdatedEndPointIsValid() const { return m_lastUpdatedEndPointIsValid; }

Better do a new line here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555342</commentid>
    <comment_count>4</comment_count>
      <attachid>126786</attachid>
    <who name="Nima Ghanavatian">nima.ghanavatian</who>
    <bug_when>2012-02-13 09:46:04 -0800</bug_when>
    <thetext>Created attachment 126786
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555425</commentid>
    <comment_count>5</comment_count>
      <attachid>126786</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-13 11:33:43 -0800</bug_when>
    <thetext>Comment on attachment 126786
Patch

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

Looks good, some things still need fixing.

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp:58
&gt; +using namespace WebCore;

This means you can get rid of all the WebCore:: prefixes below.

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp:316
&gt; +        // Extend x to bottom without modifying x.

Extend y?

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp:646
&gt; +    if (renderer)

You can do if (RenderObject* renderer =  ... ) here

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.h:68
&gt; +    void caretPositionChanged();

caretPositionChanged should be private, it is not used outside of SelectionHandler.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555476</commentid>
    <comment_count>6</comment_count>
      <attachid>126808</attachid>
    <who name="Nima Ghanavatian">nima.ghanavatian</who>
    <bug_when>2012-02-13 12:48:58 -0800</bug_when>
    <thetext>Created attachment 126808
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555484</commentid>
    <comment_count>7</comment_count>
      <attachid>126808</attachid>
    <who name="Nima Ghanavatian">nima.ghanavatian</who>
    <bug_when>2012-02-13 12:58:26 -0800</bug_when>
    <thetext>Comment on attachment 126808
Patch

submitted wrong patch =(
correct one coming shortly</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555530</commentid>
    <comment_count>8</comment_count>
      <attachid>126821</attachid>
    <who name="Nima Ghanavatian">nima.ghanavatian</who>
    <bug_when>2012-02-13 13:40:31 -0800</bug_when>
    <thetext>Created attachment 126821
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555555</commentid>
    <comment_count>9</comment_count>
      <attachid>126821</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-13 13:57:11 -0800</bug_when>
    <thetext>Comment on attachment 126821
Patch

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

Almost there, just a few things to fix.

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp:46
&gt; +#include &lt;BlackBerryPlatformIntRectRegion.h&gt;

already included in header.

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp:141
&gt; +

Maybe remove the empty line.

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp:608
&gt; +    ASSERT(m_webPage &amp;&amp; m_inputHandler);

you probably mean m_webPage-&gt;m_inputHandler.

&gt; Source/WebKit/blackberry/WebKitSupport/SelectionHandler.h:34
&gt; +class TextGranularity;

Not needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555578</commentid>
    <comment_count>10</comment_count>
      <attachid>126832</attachid>
    <who name="Nima Ghanavatian">nima.ghanavatian</who>
    <bug_when>2012-02-13 14:06:04 -0800</bug_when>
    <thetext>Created attachment 126832
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555585</commentid>
    <comment_count>11</comment_count>
      <attachid>126832</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-13 14:09:24 -0800</bug_when>
    <thetext>Comment on attachment 126832
Patch

Looks good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555995</commentid>
    <comment_count>12</comment_count>
      <attachid>126832</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-13 23:31:36 -0800</bug_when>
    <thetext>Comment on attachment 126832
Patch

Clearing flags on attachment: 126832

Committed r107674: &lt;http://trac.webkit.org/changeset/107674&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555996</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-13 23:31:41 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126301</attachid>
            <date>2012-02-09 07:42:46 -0800</date>
            <delta_ts>2012-02-13 09:46:00 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78136-20120209104017.patch</filename>
            <type>text/plain</type>
            <size>47206</size>
            <attacher name="Nima Ghanavatian">nima.ghanavatian</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3MTEzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDljM2E2NmRhNThjMjhhYjI5
YzQwMjQ5YzBhNTcwYTg2YTA1N2IwNTIuLjVkNGRiNmE1YWEzZjBjM2RhMDhlMjUwNzM0MTM5YmY3
YmNkNjJjZTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTItMDItMDggIE5pbWEgR2hh
bmF2YXRpYW4gIDxuZ2hhbmF2YXRpYW5AcmltLmNvbT4KKworICAgICAgICBJbml0aWFsIHVwc3Ry
ZWFtaW5nIG9mIHNlbGVjdGlvbiBoYW5kbGluZyBjb2RlIGZvciBCbGFja0JlcnJ5IHBvcnQKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc4MTM2CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW5pdGlhbCB1cHN0
cmVhbWluZywgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJLaXRTdXBw
b3J0L1NlbGVjdGlvbkhhbmRsZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBibGFja2JlcnJ5L1dl
YktpdFN1cHBvcnQvU2VsZWN0aW9uSGFuZGxlci5oOiBBZGRlZC4KKwogMjAxMi0wMi0wOCAgUm9i
IEJ1aXMgIDxyYnVpc0ByaW0uY29tPgogCiAgICAgICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBE
dW1wUmVuZGVyVHJlZUJsYWNrQmVycnkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2ti
ZXJyeS9XZWJLaXRTdXBwb3J0L1NlbGVjdGlvbkhhbmRsZXIuY3BwIGIvU291cmNlL1dlYktpdC9i
bGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvU2VsZWN0aW9uSGFuZGxlci5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
ZDViOWM2ZTE0NzgxMmU5MTVkZGUzYzdiYjQ3MmY2YjA1NTY0MDhmYgotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1NlbGVjdGlvbkhhbmRs
ZXIuY3BwCkBAIC0wLDAgKzEsOTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDEx
LCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAy
MTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTZWxl
Y3Rpb25IYW5kbGVyLmgiCisKKyNpbmNsdWRlICJET01TdXBwb3J0LmgiCisjaW5jbHVkZSAiRG9j
dW1lbnQuaCIKKyNpbmNsdWRlICJFZGl0b3IuaCIKKyNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIK
KyNpbmNsdWRlICJGYXRGaW5nZXJzLmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJG
cmFtZVNlbGVjdGlvbi5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxB
bmNob3JFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTEFyZWFFbGVtZW50LmgiCisjaW5jbHVkZSAi
SGl0VGVzdFJlc3VsdC5oIgorI2luY2x1ZGUgIklucHV0SGFuZGxlci5oIgorI2luY2x1ZGUgIklu
dFJlY3QuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUmVuZGVyUGFydC5oIgorI2lu
Y2x1ZGUgIlRvdWNoRXZlbnRIYW5kbGVyLmgiCisjaW5jbHVkZSAiV2ViUGFnZS5oIgorI2luY2x1
ZGUgIldlYlBhZ2VDbGllbnQuaCIKKyNpbmNsdWRlICJXZWJQYWdlX3AuaCIKKworI2luY2x1ZGUg
Imh0bWxlZGl0aW5nLmgiCisjaW5jbHVkZSAidmlzaWJsZV91bml0cy5oIgorCisjaW5jbHVkZSA8
QmxhY2tCZXJyeVBsYXRmb3JtSW50UmVjdFJlZ2lvbi5oPgorCisjaW5jbHVkZSA8c3lzL2tleWNv
ZGVzLmg+CisKKyNkZWZpbmUgU0hPV0RFQlVHX1NFTEVDVElPTkhBTkRMRVIgMAorCisjaWYgU0hP
V0RFQlVHX1NFTEVDVElPTkhBTkRMRVIKKyNkZWZpbmUgREVCVUdfU0VMRUNUSU9OKHNldmVyaXR5
LCBmb3JtYXQsIC4uLikgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZ0Fsd2F5cyhzZXZlcml0eSwg
Zm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIERFQlVHX1NFTEVDVElPTihz
ZXZlcml0eSwgZm9ybWF0LCAuLi4pCisjZW5kaWYgLy8gU0hPV0RFQlVHX1NFTEVDVElPTkhBTkRM
RVIKKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsK
K25hbWVzcGFjZSBXZWJLaXQgeworCitTZWxlY3Rpb25IYW5kbGVyOjpTZWxlY3Rpb25IYW5kbGVy
KFdlYlBhZ2VQcml2YXRlKiBwYWdlKQorICAgIDogbV93ZWJQYWdlKHBhZ2UpCisgICAgLCBtX3Nl
bGVjdGlvbkFjdGl2ZShmYWxzZSkKKyAgICAsIG1fY2FyZXRBY3RpdmUoZmFsc2UpCisgICAgLCBt
X2xhc3RVcGRhdGVkRW5kUG9pbnRJc1ZhbGlkKGZhbHNlKQoreworfQorCitTZWxlY3Rpb25IYW5k
bGVyOjp+U2VsZWN0aW9uSGFuZGxlcigpCit7Cit9CisKK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6
Y2FuY2VsU2VsZWN0aW9uKCkKK3sKKyAgICBtX3NlbGVjdGlvbkFjdGl2ZSA9IGZhbHNlOworICAg
IG1fbGFzdFNlbGVjdGlvblJlZ2lvbiA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVn
aW9uKCk7CisKKyAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xl
dmVsSW5mbywgIlNlbGVjdGlvbkhhbmRsZXI6OmNhbmNlbFNlbGVjdGlvbiIpOworCisgICAgaWYg
KG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXItPmlzSW5wdXRNb2RlKCkpCisgICAgICAgIG1fd2Vi
UGFnZS0+bV9pbnB1dEhhbmRsZXItPmNhbmNlbFNlbGVjdGlvbigpOworICAgIGVsc2UKKyAgICAg
ICAgbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+c2VsZWN0aW9uKCktPmNsZWFyKCk7
Cit9CisKK1dlYlN0cmluZyBTZWxlY3Rpb25IYW5kbGVyOjpzZWxlY3RlZFRleHQoKSBjb25zdAor
eworICAgIHJldHVybiBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5lZGl0b3IoKS0+
c2VsZWN0ZWRUZXh0KCk7Cit9CisKK2Jvb2wgU2VsZWN0aW9uSGFuZGxlcjo6ZmluZE5leHRTdHJp
bmcoY29uc3QgV1RGOjpTdHJpbmcmIHNlYXJjaFN0cmluZywgYm9vbCBmb3J3YXJkKQoreworICAg
IGlmIChzZWFyY2hTdHJpbmcuaXNFbXB0eSgpKSB7CisgICAgICAgIGNhbmNlbFNlbGVjdGlvbigp
OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQVNTRVJUKG1fd2ViUGFnZS0+
bV9wYWdlKTsKKworICAgIG1fd2ViUGFnZS0+bV9wYWdlLT51bm1hcmtBbGxUZXh0TWF0Y2hlcygp
OworCisgICAgYm9vbCByZXN1bHQgPSBtX3dlYlBhZ2UtPm1fcGFnZS0+ZmluZFN0cmluZyhzZWFy
Y2hTdHJpbmcsIFdURjo6VGV4dENhc2VJbnNlbnNpdGl2ZSwgZm9yd2FyZCA/IFdlYkNvcmU6OkZp
bmREaXJlY3Rpb25Gb3J3YXJkIDogV2ViQ29yZTo6RmluZERpcmVjdGlvbkJhY2t3YXJkLCB0cnVl
IC8qIHNob3VsZCB3cmFwICovKTsKKyAgICBpZiAocmVzdWx0ICYmIG1fd2ViUGFnZS0+Zm9jdXNl
ZE9yTWFpbkZyYW1lKCktPnNlbGVjdGlvbigpLT5zZWxlY3Rpb25UeXBlKCkgPT0gVmlzaWJsZVNl
bGVjdGlvbjo6Tm9TZWxlY3Rpb24pIHsKKyAgICAgICAgLy8gV29yZCB3YXMgZm91bmQgYnV0IGNv
dWxkIG5vdCBiZSBzZWxlY3RlZCBvbiB0aGlzIHBhZ2UuCisgICAgICAgIHJlc3VsdCA9IG1fd2Vi
UGFnZS0+bV9wYWdlLT5tYXJrQWxsTWF0Y2hlc0ZvclRleHQoc2VhcmNoU3RyaW5nLCBXVEY6OlRl
eHRDYXNlSW5zZW5zaXRpdmUsIHRydWUgLyogc2hvdWxkIGhpZ2hsaWdodCAqLywgMCAvKiBsaW1p
dCB0byBtYXRjaCAwID0gdW5saW1pdGVkICovKTsKKyAgICB9CisKKyAgICAvLyBEZWZvY3VzIHRo
ZSBpbnB1dCBmaWVsZCBpZiBvbmUgaXMgYWN0aXZlLgorICAgIGlmIChtX3dlYlBhZ2UtPm1faW5w
dXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpKQorICAgICAgICBtX3dlYlBhZ2UtPm1faW5wdXRIYW5k
bGVyLT5ub2RlRm9jdXNlZCgwKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgU2Vs
ZWN0aW9uSGFuZGxlcjo6Z2V0Q29uc29saWRhdGVkUmVnaW9uT2ZUZXh0UXVhZHNGb3JTZWxlY3Rp
b24oY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYgc2VsZWN0aW9uLCBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6SW50UmVjdFJlZ2lvbiYgcmVnaW9uKSBjb25zdAoreworICAgIEFTU0VSVChyZWdpb24uaXNF
bXB0eSgpKTsKKworICAgIGlmICghc2VsZWN0aW9uLmlzUmFuZ2UoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgQVNTRVJUKHNlbGVjdGlvbi5maXJzdFJhbmdlKCkpOworCisgICAgRnJhbWVWaWV3
KiBmcmFtZVZpZXcgPSBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpLT52aWV3KCk7CisK
KyAgICAvLyBmcmFtZVJlY3QgaXMgaW4gZnJhbWUgY29vcmRpbmF0ZXMuCisgICAgSW50UmVjdCBm
cmFtZVJlY3QoSW50UG9pbnQoMCwgMCksIGZyYW1lVmlldy0+Y29udGVudHNTaXplKCkpOworCisg
ICAgLy8gZnJhbWVQb3NpdGlvbiBpcyBpbiBtYWluIGZyYW1lIGNvb3JkaW5hdGVzLgorICAgIElu
dFBvaW50IGZyYW1lUG9zaXRpb24gPSBtX3dlYlBhZ2UtPmZyYW1lT2Zmc2V0KG1fd2ViUGFnZS0+
Zm9jdXNlZE9yTWFpbkZyYW1lKCkpOworCisgICAgVmVjdG9yPEZsb2F0UXVhZD4gcXVhZExpc3Q7
CisgICAgRE9NU3VwcG9ydDo6dmlzaWJsZVRleHRRdWFkcygqKHNlbGVjdGlvbi5maXJzdFJhbmdl
KCkpLCBxdWFkTGlzdCwgdHJ1ZSAvKiB1c2Ugc2VsZWN0aW9uIGhlaWdodCAqLyk7CisKKyAgICBp
ZiAoIXF1YWRMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAvLyBUaGUgcmFuZ2VzIHJlY3QgbGlz
dCBpcyBiYXNlZCBvbiByZW5kZXIgZWxlbWVudHMgYW5kIG1heSBpbmNsdWRlIG11bHRpcGxlIGFk
amFjZW50IHJlY3RzLgorICAgICAgICAvLyBVc2UgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJl
Y3RSZWdpb24gdG8gY29uc29saWRhdGUgdGhlc2UgcmVjdHMgaW50byBiYW5kcyBhcyB3ZWxsIGFz
IGEgY29udGFpbmVyIHRvIHBhc3MKKyAgICAgICAgLy8gdG8gdGhlIGNsaWVudC4KKworICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcXVhZExpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAg
ICAgICAgIEludFJlY3QgZW5jbG9zaW5nUmVjdCA9IHF1YWRMaXN0W2ldLmVuY2xvc2luZ0JvdW5k
aW5nQm94KCk7CisgICAgICAgICAgICBlbmNsb3NpbmdSZWN0LmludGVyc2VjdChmcmFtZVJlY3Qp
OworICAgICAgICAgICAgZW5jbG9zaW5nUmVjdC5tb3ZlKGZyYW1lUG9zaXRpb24ueCgpLCBmcmFt
ZVBvc2l0aW9uLnkoKSk7CisgICAgICAgICAgICByZWdpb24gPSB1bmlvblJlZ2lvbnMocmVnaW9u
LCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbihlbmNsb3NpbmdSZWN0KSk7Cisg
ICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVBvc2l0
aW9uRm9yUG9pbnRJZ25vcmluZ0NsaXBwaW5nKGNvbnN0IEZyYW1lJiBmcmFtZSwgY29uc3QgSW50
UG9pbnQmIGZyYW1lUG9pbnQpCit7CisgICAgLy8gRnJhbWU6OnZpc2libGVQb3NpdGlvbkF0UG9p
bnQgaGFyZC1jb2RlcyBpZ25vcmVDbGlwcGluZz1mYWxzZSBpbiB0aGUKKyAgICAvLyBjYWxsIHRv
IGhpdFRlc3RSZXN1bHRBdFBvaW50LiBUaGlzIGhhcyBhIGJ1ZyB3aGVyZSBzb21lIHBhZ2VzIChz
dWNoIGFzCisgICAgLy8gbWV0YWZpbHRlcikgd2lsbCByZXR1cm4gdGhlIHdyb25nIFZpc2libGVQ
b3NpdGlvbiBmb3IgcG9pbnRzIHRoYXQgYXJlCisgICAgLy8gb3V0c2lkZSB0aGUgdmlzaWJsZSBy
ZWN0LiBUbyB3b3JrIGFyb3VuZCB0aGUgYnVnLCB0aGlzIGlzIGEgY29weSBvZgorICAgIC8vIHZp
c2libGVQb3NpdGlvbkF0UG9pbnQgd2hpY2ggd2hpY2ggcGFzc2VzIGlnbm9yZUNsaXBwaW5nPXRy
dWUuCisgICAgLy8gU2VlIFJJTSBCdWcgIzQzMTUuCisgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQg
PSBmcmFtZS5ldmVudEhhbmRsZXIoKS0+aGl0VGVzdFJlc3VsdEF0UG9pbnQoZnJhbWVQb2ludCwg
dHJ1ZSAvKiBhbGxvd1NoYWRvd0NvbnRlbnQgKi8sIHRydWUgLyogaWdub3JlQ2xpcHBpbmcgKi8p
OworCisgICAgTm9kZSogbm9kZSA9IHJlc3VsdC5pbm5lck5vZGUoKTsKKyAgICBpZiAoIW5vZGUp
CisgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKKworICAgIFJlbmRlck9iamVjdCog
cmVuZGVyZXIgPSBub2RlLT5yZW5kZXJlcigpOworICAgIGlmICghcmVuZGVyZXIpCisgICAgICAg
IHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKKworICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxl
UG9zID0gcmVuZGVyZXItPnBvc2l0aW9uRm9yUG9pbnQocmVzdWx0LmxvY2FsUG9pbnQoKSk7Cisg
ICAgaWYgKHZpc2libGVQb3MuaXNOdWxsKCkpCisgICAgICAgIHZpc2libGVQb3MgPSBWaXNpYmxl
UG9zaXRpb24oUG9zaXRpb24oY3JlYXRlTGVnYWN5RWRpdGluZ1Bvc2l0aW9uKG5vZGUsIDApKSk7
CisKKyAgICByZXR1cm4gdmlzaWJsZVBvczsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGRp
cmVjdGlvbk9mUG9pbnRSZWxhdGl2ZVRvUmVjdChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgcG9p
bnQsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIHJlY3QpCit7CisgICAgQVNTRVJUKCFyZWN0LmNv
bnRhaW5zKHBvaW50KSk7CisKKyAgICAvLyBQYWRkaW5nIHRvIHByZXZlbnQgYWNjaWRlbnRhbCB0
cmlnZ2VyIG9mIHVwL2Rvd24gd2hlbiBpbnRlbmRpbmcgdG8gZG8gaG9yaXpvbnRhbCBtb3ZlbWVu
dC4KKyAgICBjb25zdCBpbnQgdmVydGljYWxQYWRkaW5nID0gNTsKKworICAgIC8vIERvIGhlaWdo
dCBtb3ZlbWVudCBjaGVjayBmaXJzdCBidXQgYWRkIHBhZGRpbmcuIFdlIG1heSBiZSBvZmYgb24g
Ym90aCB4ICYgeSBheGlzIGFuZCBvbmx5CisgICAgLy8gd2FudCB0byBtb3ZlIGluIG9uZSBkaXJl
Y3Rpb24gYXQgYSB0aW1lLgorICAgIGlmIChwb2ludC55KCkgKyB2ZXJ0aWNhbFBhZGRpbmcgPCBy
ZWN0LnkoKSkKKyAgICAgICAgcmV0dXJuIEtFWUNPREVfVVA7CisgICAgaWYgKHBvaW50LnkoKSA+
IHJlY3QubWF4WSgpICsgdmVydGljYWxQYWRkaW5nKQorICAgICAgICByZXR1cm4gS0VZQ09ERV9E
T1dOOworICAgIGlmIChwb2ludC54KCkgPCByZWN0LmxvY2F0aW9uKCkueCgpKQorICAgICAgICBy
ZXR1cm4gS0VZQ09ERV9MRUZUOworICAgIGlmIChwb2ludC54KCkgPiByZWN0Lm1heFgoKSkKKyAg
ICAgICAgcmV0dXJuIEtFWUNPREVfUklHSFQ7CisKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBT
ZWxlY3Rpb25IYW5kbGVyOjpzaG91bGRVcGRhdGVTZWxlY3Rpb25PckNhcmV0Rm9yUG9pbnQoY29u
c3QgV2ViQ29yZTo6SW50UG9pbnQmIHBvaW50LCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBjYXJl
dFJlY3QsIGJvb2wgc3RhcnRDYXJldCkgY29uc3QKK3sKKyAgICBBU1NFUlQobV93ZWJQYWdlLT5t
X2lucHV0SGFuZGxlci0+aXNJbnB1dE1vZGUoKSk7CisKKyAgICAvLyBJZiB0aGUgcG9pbnQgaXNu
J3QgdmFsaWQgZG9uJ3QgYmxvY2sgY2hhbmdlIGFzIGl0IGlzIG5vdCBhY3R1YWxseSBjaGFuZ2lu
Zy4KKyAgICBpZiAocG9pbnQgPT0gRE9NU3VwcG9ydDo6SW52YWxpZFBvaW50KQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKworICAgIFZpc2libGVTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IG1f
d2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnNlbGVjdGlvbigpLT5zZWxlY3Rpb24oKTsK
KworICAgIC8vIElmIHRoZSBpbnB1dCBmaWVsZCBpcyBzaW5nbGUgbGluZSBvciB3ZSBhcmUgb24g
dGhlIGZpcnN0IG9yIGxhc3QKKyAgICAvLyBsaW5lIG9mIGEgbXVsdGlsaW5lIGlucHV0IGZpZWxk
IG9ubHkgaG9yaXpvbnRhbCBtb3ZlbWVudCBpcyBzdXBwb3J0ZWQuCisgICAgYm9vbCBhYm92ZUNh
cmV0ID0gcG9pbnQueSgpIDwgY2FyZXRSZWN0LnkoKTsKKyAgICBib29sIGJlbG93Q2FyZXQgPSBw
b2ludC55KCkgPj0gY2FyZXRSZWN0Lm1heFkoKTsKKworICAgIERFQlVHX1NFTEVDVElPTihCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiU2VsZWN0aW9uSGFuZGxlcjo6c2hvdWxk
VXBkYXRlU2VsZWN0aW9uT3JDYXJldEZvclBvaW50IG11bHRpbGluZSA9ICVzIGFib3ZlID0gJXMg
YmVsb3cgPSAlcyBmaXJzdCBsaW5lID0gJXMgbGFzdCBsaW5lID0gJXMgc3RhcnQgPSAlcyBcbiIK
KyAgICAgICAgICAgICwgbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNNdWx0aWxpbmVJbnB1
dE1vZGUoKSA/ICJ0cnVlIiA6ICJmYWxzZSIsIGFib3ZlQ2FyZXQgPyAidHJ1ZSIgOiAiZmFsc2Ui
LCBiZWxvd0NhcmV0ID8gInRydWUiIDogImZhbHNlIgorICAgICAgICAgICAgLCBpblNhbWVMaW5l
KGN1cnJlbnRTZWxlY3Rpb24udmlzaWJsZVN0YXJ0KCksIHN0YXJ0T2ZFZGl0YWJsZUNvbnRlbnQo
Y3VycmVudFNlbGVjdGlvbi52aXNpYmxlU3RhcnQoKSkpID8gInRydWUiIDogImZhbHNlIgorICAg
ICAgICAgICAgLCBpblNhbWVMaW5lKGN1cnJlbnRTZWxlY3Rpb24udmlzaWJsZUVuZCgpLCBlbmRP
ZkVkaXRhYmxlQ29udGVudChjdXJyZW50U2VsZWN0aW9uLnZpc2libGVFbmQoKSkpID8gInRydWUi
IDogImZhbHNlIgorICAgICAgICAgICAgLCBzdGFydENhcmV0ID8gInRydWUiIDogImZhbHNlIik7
CisKKyAgICBpZiAoIW1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXItPmlzTXVsdGlsaW5lSW5wdXRN
b2RlKCkgJiYgKGFib3ZlQ2FyZXQgfHwgYmVsb3dDYXJldCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBpZiAoc3RhcnRDYXJldCAmJiBpblNhbWVMaW5lKGN1cnJlbnRTZWxlY3Rpb24udmlz
aWJsZVN0YXJ0KCksIHN0YXJ0T2ZFZGl0YWJsZUNvbnRlbnQoY3VycmVudFNlbGVjdGlvbi52aXNp
YmxlU3RhcnQoKSkpICYmIGFib3ZlQ2FyZXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBp
ZiAoIXN0YXJ0Q2FyZXQgJiYgaW5TYW1lTGluZShjdXJyZW50U2VsZWN0aW9uLnZpc2libGVFbmQo
KSwgZW5kT2ZFZGl0YWJsZUNvbnRlbnQoY3VycmVudFNlbGVjdGlvbi52aXNpYmxlRW5kKCkpKSAm
JiBiZWxvd0NhcmV0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKwordm9pZCBTZWxlY3Rpb25IYW5kbGVyOjpzZXRDYXJldFBvc2l0aW9uKGNvbnN0IFdlYkNv
cmU6OkludFBvaW50ICZwb3NpdGlvbikKK3sKKyAgICBpZiAoIW1fd2ViUGFnZS0+bV9pbnB1dEhh
bmRsZXItPmlzSW5wdXRNb2RlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fY2FyZXRBY3Rp
dmUgPSB0cnVlOworCisgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpM
b2dMZXZlbEluZm8sICJTZWxlY3Rpb25IYW5kbGVyOjpzZXRDYXJldFBvc2l0aW9uIHJlcXVlc3Rl
ZCBwb2ludCAlZCwgJWQiLCBwb3NpdGlvbi54KCksIHBvc2l0aW9uLnkoKSk7CisKKyAgICBGcmFt
ZSogZm9jdXNlZEZyYW1lID0gbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICBG
cmFtZVNlbGVjdGlvbiogY29udHJvbGxlciA9IGZvY3VzZWRGcmFtZS0+c2VsZWN0aW9uKCk7Cisg
ICAgSW50UG9pbnQgcmVsYXRpdmVQb2ludCA9IERPTVN1cHBvcnQ6OmNvbnZlcnRQb2ludFRvRnJh
bWUobV93ZWJQYWdlLT5tYWluRnJhbWUoKSwgZm9jdXNlZEZyYW1lLCBwb3NpdGlvbik7CisgICAg
SW50UmVjdCBjdXJyZW50Q2FyZXRSZWN0ID0gY29udHJvbGxlci0+c2VsZWN0aW9uKCkudmlzaWJs
ZVN0YXJ0KCkuYWJzb2x1dGVDYXJldEJvdW5kcygpOworCisgICAgaWYgKHJlbGF0aXZlUG9pbnQg
PT0gRE9NU3VwcG9ydDo6SW52YWxpZFBvaW50IHx8ICFzaG91bGRVcGRhdGVTZWxlY3Rpb25PckNh
cmV0Rm9yUG9pbnQocmVsYXRpdmVQb2ludCwgY3VycmVudENhcmV0UmVjdCkpIHsKKyAgICAgICAg
c2VsZWN0aW9uUG9zaXRpb25DaGFuZ2VkKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZUNhcmV0UG9zaXRpb24oZm9jdXNlZEZyYW1lLT52aXNp
YmxlUG9zaXRpb25Gb3JQb2ludChyZWxhdGl2ZVBvaW50KSk7CisKKyAgICBpZiAoIURPTVN1cHBv
cnQ6OmlzUG9zaXRpb25Jbk5vZGUobV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+ZG9j
dW1lbnQoKS0+Zm9jdXNlZE5vZGUoKSwgdmlzaWJsZUNhcmV0UG9zaXRpb24uZGVlcEVxdWl2YWxl
bnQoKSkpIHsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgY2hhcmFjdGVyID0gZGlyZWN0aW9uT2ZQ
b2ludFJlbGF0aXZlVG9SZWN0KHJlbGF0aXZlUG9pbnQsIGN1cnJlbnRDYXJldFJlY3QpOworICAg
ICAgICBpZiAoY2hhcmFjdGVyKQorICAgICAgICAgICAgbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxl
ci0+aGFuZGxlTmF2aWdhdGlvbk1vdmUoY2hhcmFjdGVyLCBmYWxzZSAvKiBzaGlmdERvd24gKi8s
IGZhbHNlIC8qIGFsdERvd24gKi8sIGZhbHNlIC8qIGNhbkV4aXRGaWVsZCAqLyk7CisKKyAgICAg
ICAgc2VsZWN0aW9uUG9zaXRpb25DaGFuZ2VkKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBWaXNpYmxlU2VsZWN0aW9uIG5ld1NlbGVjdGlvbih2aXNpYmxlQ2FyZXRQb3NpdGlvbik7
CisgICAgaWYgKGNvbnRyb2xsZXItPnNlbGVjdGlvbigpID09IG5ld1NlbGVjdGlvbikgeworICAg
ICAgICBzZWxlY3Rpb25Qb3NpdGlvbkNoYW5nZWQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIGNvbnRyb2xsZXItPnNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb24pOworCisgICAgREVC
VUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJTZWxlY3Rp
b25IYW5kbGVyOjpzZXRDYXJldFBvc2l0aW9uIHBvaW50IHZhbGlkLCBjdXJzb3IgdXBkYXRlZCIp
OworfQorCisvLyBUaGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgd2UgYXJlIG5vdCByZWR1Y2luZyB0
aGUgc2VsZWN0aW9uIHRvIGEgY2FyZXQgc2VsZWN0aW9uLgorc3RhdGljIGJvb2wgZG9lc05hdmln
YXRpb25FdmVudEVuZFNlbGVjdGlvbihjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiBzZWxlY3Rpb24s
IHVuc2lnbmVkIHNob3J0IGNoYXJhY3RlcikKK3sKKyAgICBGcmFtZVNlbGVjdGlvbiB0ZW1wU2Vs
ZWN0aW9uOworICAgIHRlbXBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7CisgICAg
c3dpdGNoIChjaGFyYWN0ZXIpIHsKKyAgICBjYXNlIEtFWUNPREVfTEVGVDoKKyAgICAgICAgdGVt
cFNlbGVjdGlvbi5tb2RpZnkoRnJhbWVTZWxlY3Rpb246OkFsdGVyYXRpb25FeHRlbmQsIERpcmVj
dGlvbkxlZnQsIENoYXJhY3RlckdyYW51bGFyaXR5KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBLRVlDT0RFX1JJR0hUOgorICAgICAgICB0ZW1wU2VsZWN0aW9uLm1vZGlmeShGcmFtZVNlbGVj
dGlvbjo6QWx0ZXJhdGlvbkV4dGVuZCwgRGlyZWN0aW9uUmlnaHQsIENoYXJhY3RlckdyYW51bGFy
aXR5KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLRVlDT0RFX1VQOgorICAgICAgICB0ZW1w
U2VsZWN0aW9uLm1vZGlmeShGcmFtZVNlbGVjdGlvbjo6QWx0ZXJhdGlvbkV4dGVuZCwgRGlyZWN0
aW9uQmFja3dhcmQsIExpbmVHcmFudWxhcml0eSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
S0VZQ09ERV9ET1dOOgorICAgICAgICB0ZW1wU2VsZWN0aW9uLm1vZGlmeShGcmFtZVNlbGVjdGlv
bjo6QWx0ZXJhdGlvbkV4dGVuZCwgRGlyZWN0aW9uRm9yd2FyZCwgTGluZUdyYW51bGFyaXR5KTsK
KyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisg
ICAgcmV0dXJuIHRlbXBTZWxlY3Rpb24uc2VsZWN0aW9uKCkuc2VsZWN0aW9uVHlwZSgpICE9IFZp
c2libGVTZWxlY3Rpb246OlJhbmdlU2VsZWN0aW9uOworfQorCitzdGF0aWMgVmlzaWJsZVBvc2l0
aW9uIGRpcmVjdGlvbmFsVmlzaWJsZVBvc2l0aW9uQXRFeHRlbnRPZkJveChGcmFtZSogZnJhbWUs
IGNvbnN0IEludFJlY3QmIGJvdW5kaW5nQm94LCB1bnNpZ25lZCBzaG9ydCBkaXJlY3Rpb24sIGNv
bnN0IEludFBvaW50JiBiYXNlUG9pbnQpCit7CisgICAgQVNTRVJUKGZyYW1lKTsKKworICAgIGlm
ICghZnJhbWUpCisgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKKworICAgIHN3aXRj
aCAoZGlyZWN0aW9uKSB7CisgICAgY2FzZSBLRVlDT0RFX0xFRlQ6CisgICAgICAgIC8vIEV4dGVu
ZCB4IHRvIHN0YXJ0IHdpdGhvdXQgbW9kaWZ5aW5nIHkuCisgICAgICAgIHJldHVybiBmcmFtZS0+
dmlzaWJsZVBvc2l0aW9uRm9yUG9pbnQoSW50UG9pbnQoYm91bmRpbmdCb3gueCgpLCBiYXNlUG9p
bnQueSgpKSk7CisgICAgY2FzZSBLRVlDT0RFX1JJR0hUOgorICAgICAgICAvLyBFeHRlbmQgeCB0
byBlbmQgd2l0aG91dCBtb2RpZnlpbmcgeS4KKyAgICAgICAgcmV0dXJuIGZyYW1lLT52aXNpYmxl
UG9zaXRpb25Gb3JQb2ludChJbnRQb2ludChib3VuZGluZ0JveC5tYXhYKCksIGJhc2VQb2ludC55
KCkpKTsKKyAgICBjYXNlIEtFWUNPREVfVVA6CisgICAgICAgIC8vIEV4dGVuZCB5IHRvIHRvcCB3
aXRob3V0IG1vZGlmeWluZyB4LgorICAgICAgICByZXR1cm4gZnJhbWUtPnZpc2libGVQb3NpdGlv
bkZvclBvaW50KEludFBvaW50KGJhc2VQb2ludC54KCksIGJvdW5kaW5nQm94LnkoKSkpOworICAg
IGNhc2UgS0VZQ09ERV9ET1dOOgorICAgICAgICAvLyBFeHRlbmQgeCB0byBib3R0b20gd2l0aG91
dCBtb2RpZnlpbmcgeC4KKyAgICAgICAgcmV0dXJuIGZyYW1lLT52aXNpYmxlUG9zaXRpb25Gb3JQ
b2ludChJbnRQb2ludChiYXNlUG9pbnQueCgpLCBib3VuZGluZ0JveC5tYXhZKCkpKTsKKyAgICBk
ZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZnJhbWUtPnZpc2li
bGVQb3NpdGlvbkZvclBvaW50KEludFBvaW50KGJhc2VQb2ludC54KCksIGJhc2VQb2ludC55KCkp
KTsKK30KKworc3RhdGljIGJvb2wgcG9pbnRJc091dHNpZGVPZkJvdW5kaW5nQm94SW5EaXJlY3Rp
b24odW5zaWduZWQgZGlyZWN0aW9uLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgc2VsZWN0aW9u
UG9pbnQsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIGJvdW5kaW5nQm94KQoreworICAgIGlmICgo
ZGlyZWN0aW9uID09IEtFWUNPREVfTEVGVCAmJiBzZWxlY3Rpb25Qb2ludC54KCkgPCBib3VuZGlu
Z0JveC54KCkpCisgICAgICAgIHx8IChkaXJlY3Rpb24gPT0gS0VZQ09ERV9VUCAmJiBzZWxlY3Rp
b25Qb2ludC55KCkgPCBib3VuZGluZ0JveC55KCkpCisgICAgICAgIHx8IChkaXJlY3Rpb24gPT0g
S0VZQ09ERV9SSUdIVCAmJiBzZWxlY3Rpb25Qb2ludC54KCkgPiBib3VuZGluZ0JveC5tYXhYKCkp
CisgICAgICAgIHx8IChkaXJlY3Rpb24gPT0gS0VZQ09ERV9ET1dOICYmIHNlbGVjdGlvblBvaW50
LnkoKSA+IGJvdW5kaW5nQm94Lm1heFkoKSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAg
cmV0dXJuIGZhbHNlOworfQorCit1bnNpZ25lZCBzaG9ydCBTZWxlY3Rpb25IYW5kbGVyOjpleHRl
bmRTZWxlY3Rpb25Ub0ZpZWxkQm91bmRhcnkoYm9vbCBpc1N0YXJ0SGFuZGxlLCBjb25zdCBXZWJD
b3JlOjpJbnRQb2ludCYgc2VsZWN0aW9uUG9pbnQsIFdlYkNvcmU6OlZpc2libGVTZWxlY3Rpb24m
IG5ld1NlbGVjdGlvbikKK3sKKyAgICBGcmFtZSogZm9jdXNlZEZyYW1lID0gbV93ZWJQYWdlLT5m
b2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICBGcmFtZVNlbGVjdGlvbiogY29udHJvbGxlciA9IGZv
Y3VzZWRGcmFtZS0+c2VsZWN0aW9uKCk7CisKKyAgICBpZiAoIWZvY3VzZWRGcmFtZS0+ZG9jdW1l
bnQoKS0+Zm9jdXNlZE5vZGUoKSB8fCAhZm9jdXNlZEZyYW1lLT5kb2N1bWVudCgpLT5mb2N1c2Vk
Tm9kZSgpLT5yZW5kZXJlcigpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEludFJlY3QgY2Fy
ZXRSZWN0ID0gaXNTdGFydEhhbmRsZSA/IGNvbnRyb2xsZXItPnNlbGVjdGlvbigpLnZpc2libGVT
dGFydCgpLmFic29sdXRlQ2FyZXRCb3VuZHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICA6IGNvbnRyb2xsZXItPnNlbGVjdGlvbigpLnZpc2libGVFbmQoKS5hYnNvbHV0
ZUNhcmV0Qm91bmRzKCk7CisKKyAgICBJbnRSZWN0IG5vZGVCb3VuZGluZ0JveCA9IGZvY3VzZWRG
cmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKS0+cmVuZGVyZXIoKS0+YWJzb2x1dGVCb3Vu
ZGluZ0JveFJlY3QoKTsKKworICAgIC8vIFN0YXJ0IGhhbmRsZSBpcyBvdXRzaWRlIG9mIHRoZSBm
aWVsZC4gVHJlYXQgaXQgYXMgdGhlIGNoYW5nZWQgaGFuZGxlIGFuZCBtb3ZlCisgICAgLy8gcmVs
YXRpdmUgdG8gdGhlIHN0YXJ0IGNhcmV0IHJlY3QuCisgICAgdW5zaWduZWQgc2hvcnQgY2hhcmFj
dGVyID0gZGlyZWN0aW9uT2ZQb2ludFJlbGF0aXZlVG9SZWN0KHNlbGVjdGlvblBvaW50LCBjYXJl
dFJlY3QpOworCisgICAgLy8gUHJldmVudCBpbmNvcnJlY3QgbW92ZW1lbnQsIGhhbmRsZXMgY2Fu
IG9ubHkgZXh0ZW5kIHRoZSBzZWxlY3Rpb24gdGhpcyB3YXkKKyAgICAvLyB0byBwcmV2ZW50IGlu
dmVyc2lvbiBvZiB0aGUgaGFuZGxlcy4KKyAgICBpZiAoaXNTdGFydEhhbmRsZSAmJiAoY2hhcmFj
dGVyID09IEtFWUNPREVfUklHSFQgfHwgY2hhcmFjdGVyID09IEtFWUNPREVfRE9XTikKKyAgICAg
ICAgfHwgIWlzU3RhcnRIYW5kbGUgJiYgKGNoYXJhY3RlciA9PSBLRVlDT0RFX0xFRlQgfHwgY2hh
cmFjdGVyID09IEtFWUNPREVfVVApKQorICAgICAgICBjaGFyYWN0ZXIgPSAwOworCisgICAgV2Vi
Q29yZTo6VmlzaWJsZVBvc2l0aW9uIG5ld1Zpc2libGVQb3NpdGlvbiA9IGNvbnRyb2xsZXItPnNl
bGVjdGlvbigpLnN0YXJ0KCk7CisgICAgLy8gRXh0ZW5kIHRoZSBzZWxlY3Rpb24gdG8gdGhlIGJv
dW5kcyBvZiB0aGUgYm94IGJlZm9yZSBkb2luZyBpbmNyZW1lbnRhbCBzY3JvbGwgaWYgdGhlIHBv
aW50IGlzIG91dHNpZGUgdGhlIG5vZGUuCisgICAgLy8gRG9uJ3QgZXh0ZW5kIHNlbGVjdGlvbiBh
bmQgaGFuZGxlIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNhbWUgdGltZS4KKyAgICBpZiAocG9pbnRJ
c091dHNpZGVPZkJvdW5kaW5nQm94SW5EaXJlY3Rpb24oY2hhcmFjdGVyLCBzZWxlY3Rpb25Qb2lu
dCwgbm9kZUJvdW5kaW5nQm94KSkKKyAgICAgICAgbmV3VmlzaWJsZVBvc2l0aW9uID0gZGlyZWN0
aW9uYWxWaXNpYmxlUG9zaXRpb25BdEV4dGVudE9mQm94KGZvY3VzZWRGcmFtZSwgbm9kZUJvdW5k
aW5nQm94LCBjaGFyYWN0ZXIsIHNlbGVjdGlvblBvaW50KTsKKworICAgIGlmIChpc1N0YXJ0SGFu
ZGxlKQorICAgICAgICBuZXdTZWxlY3Rpb24gPSBWaXNpYmxlU2VsZWN0aW9uKG5ld1Zpc2libGVQ
b3NpdGlvbiwgbmV3U2VsZWN0aW9uLnZpc2libGVFbmQoKSwgdHJ1ZSAvKmlzRGlyZWN0aW9uYWwq
Lyk7CisgICAgZWxzZQorICAgICAgICBuZXdTZWxlY3Rpb24gPSBWaXNpYmxlU2VsZWN0aW9uKG5l
d1NlbGVjdGlvbi52aXNpYmxlU3RhcnQoKSwgbmV3VmlzaWJsZVBvc2l0aW9uLCB0cnVlIC8qaXNE
aXJlY3Rpb25hbCovKTsKKworICAgIC8vIElmIG5vIHNlbGVjdGlvbiB3aWxsIGJlIGNoYW5nZWQs
IHJldHVybiB0aGUgY2hhcmFjdGVyIHRvIGV4dGVuZCB1c2luZyBuYXZpZ2F0aW9uLgorICAgIGlm
IChjb250cm9sbGVyLT5zZWxlY3Rpb24oKSA9PSBuZXdTZWxlY3Rpb24pCisgICAgICAgIHJldHVy
biBjaGFyYWN0ZXI7CisKKyAgICAvLyBTZWxlY3Rpb24gaGFzIGJlZW4gdXBkYXRlZC4KKyAgICBy
ZXR1cm4gMDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIGhhbmRsZWQuCitib29sIFNlbGVjdGlv
bkhhbmRsZXI6OnVwZGF0ZU9ySGFuZGxlSW5wdXRTZWxlY3Rpb24oV2ViQ29yZTo6VmlzaWJsZVNl
bGVjdGlvbiYgbmV3U2VsZWN0aW9uLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgcmVsYXRpdmVT
dGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICwgY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIHJlbGF0aXZlRW5kKQoreworICAgIEFTU0VSVCht
X3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpKTsKKworICAgIEZyYW1lKiBm
b2N1c2VkRnJhbWUgPSBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIEZyYW1l
U2VsZWN0aW9uKiBjb250cm9sbGVyID0gZm9jdXNlZEZyYW1lLT5zZWxlY3Rpb24oKTsKKworICAg
IE5vZGUqIGZvY3VzZWROb2RlID0gZm9jdXNlZEZyYW1lLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9k
ZSgpOworICAgIGlmICghZm9jdXNlZE5vZGUgfHwgIWZvY3VzZWROb2RlLT5yZW5kZXJlcigpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBJbnRSZWN0IGN1cnJlbnRTdGFydENhcmV0UmVj
dCA9IGNvbnRyb2xsZXItPnNlbGVjdGlvbigpLnZpc2libGVTdGFydCgpLmFic29sdXRlQ2FyZXRC
b3VuZHMoKTsKKyAgICBJbnRSZWN0IGN1cnJlbnRFbmRDYXJldFJlY3QgPSBjb250cm9sbGVyLT5z
ZWxlY3Rpb24oKS52aXNpYmxlRW5kKCkuYWJzb2x1dGVDYXJldEJvdW5kcygpOworCisgICAgLy8g
Q2hlY2sgaWYgdGhlIGhhbmRsZSBtb3ZlbWVudCBpcyB2YWxpZC4KKyAgICBpZiAoIXNob3VsZFVw
ZGF0ZVNlbGVjdGlvbk9yQ2FyZXRGb3JQb2ludChyZWxhdGl2ZVN0YXJ0LCBjdXJyZW50U3RhcnRD
YXJldFJlY3QsIHRydWUgLyogc3RhcnRDYXJldCAqLykKKyAgICAgICAgfHwgIXNob3VsZFVwZGF0
ZVNlbGVjdGlvbk9yQ2FyZXRGb3JQb2ludChyZWxhdGl2ZUVuZCwgY3VycmVudEVuZENhcmV0UmVj
dCwgZmFsc2UgLyogc3RhcnRDYXJldCAqLykpIHsKKyAgICAgICAgc2VsZWN0aW9uUG9zaXRpb25D
aGFuZ2VkKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEludFJlY3Qgbm9k
ZUJvdW5kaW5nQm94ID0gZm9jdXNlZE5vZGUtPnJlbmRlcmVyKCktPmFic29sdXRlQm91bmRpbmdC
b3hSZWN0KCk7CisKKyAgICAvLyBPbmx5IGRvIHNwZWNpYWwgaGFuZGxpbmcgaWYgb25lIGhhbmRs
ZSBpcyBvdXRzaWRlIG9mIHRoZSBub2RlLgorICAgIGJvb2wgc3RhcnRJc091dHNpZGVPZkZpZWxk
ID0gcmVsYXRpdmVTdGFydCAhPSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQgJiYgIW5vZGVCb3Vu
ZGluZ0JveC5jb250YWlucyhyZWxhdGl2ZVN0YXJ0KTsKKyAgICBib29sIGVuZElzT3V0c2lkZU9m
RmllbGQgPSByZWxhdGl2ZUVuZCAhPSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQgJiYgIW5vZGVC
b3VuZGluZ0JveC5jb250YWlucyhyZWxhdGl2ZUVuZCk7CisgICAgaWYgKHN0YXJ0SXNPdXRzaWRl
T2ZGaWVsZCAmJiBlbmRJc091dHNpZGVPZkZpZWxkKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICB1bnNpZ25lZCBzaG9ydCBjaGFyYWN0ZXIgPSAwOworICAgIGlmIChzdGFydElzT3V0c2lk
ZU9mRmllbGQpIHsKKyAgICAgICAgY2hhcmFjdGVyID0gZXh0ZW5kU2VsZWN0aW9uVG9GaWVsZEJv
dW5kYXJ5KHRydWUgLyogaXNTdGFydEhhbmRsZSAqLywgcmVsYXRpdmVTdGFydCwgbmV3U2VsZWN0
aW9uKTsKKyAgICAgICAgaWYgKGNoYXJhY3RlcikgeworICAgICAgICAgICAgLy8gSW52ZXJ0IHRo
ZSBzZWxlY3Rpb24gc28gdGhhdCB0aGUgY3Vyc29yIHBvaW50IGlzIGF0IHRoZSBiZWdpbm5pbmcu
CisgICAgICAgICAgICBjb250cm9sbGVyLT5zZXRTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbihj
b250cm9sbGVyLT5zZWxlY3Rpb24oKS5lbmQoKSwgY29udHJvbGxlci0+c2VsZWN0aW9uKCkuc3Rh
cnQoKSkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChlbmRJc091dHNpZGVPZkZpZWxkKSB7
CisgICAgICAgIGNoYXJhY3RlciA9IGV4dGVuZFNlbGVjdGlvblRvRmllbGRCb3VuZGFyeShmYWxz
ZSAvKiBpc1N0YXJ0SGFuZGxlICovLCByZWxhdGl2ZUVuZCwgbmV3U2VsZWN0aW9uKTsKKyAgICAg
ICAgaWYgKGNoYXJhY3RlcikgeworICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHNlbGVjdGlvbiBz
byB0aGF0IHRoZSBlbmQgaXMgdGhlIGVkaXQgcG9pbnQuCisgICAgICAgICAgICBjb250cm9sbGVy
LT5zZXRTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbihjb250cm9sbGVyLT5zZWxlY3Rpb24oKS5z
dGFydCgpLCBjb250cm9sbGVyLT5zZWxlY3Rpb24oKS5lbmQoKSkpOworICAgICAgICB9CisgICAg
fQorCisgICAgaWYgKCFjaGFyYWN0ZXIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIERF
QlVHX1NFTEVDVElPTihCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiU2VsZWN0
aW9uSGFuZGxlcjo6c2V0U2VsZWN0aW9uIG1ha2luZyBzZWxlY3Rpb24gY2hhbmdlIGF0dGVtcHQg
dXNpbmcgbmF2aWdhdGlvbiIpOworCisgICAgaWYgKCFkb2VzTmF2aWdhdGlvbkV2ZW50RW5kU2Vs
ZWN0aW9uKGNvbnRyb2xsZXItPnNlbGVjdGlvbigpLCBjaGFyYWN0ZXIpKQorICAgICAgICBtX3dl
YlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5oYW5kbGVOYXZpZ2F0aW9uTW92ZShjaGFyYWN0ZXIsIHRy
dWUgLyogc2hpZnREb3duICovLCBmYWxzZSAvKiBhbHREb3duICovLCBmYWxzZSAvKiBjYW5FeGl0
RmllbGQgKi8pOworCisgICAgLy8gTXVzdCBzZW5kIHRoZSBzZWxlY3Rpb25Qb3NpdGlvbkNoYW5n
ZWQgZXZlcnkgdGltZSwgc29tZXRpbWVzIHRoaXMgd2lsbCBkdXBsaWNhdGUgYnV0IGFuIGFjY2Vw
dGVkCisgICAgLy8gaGFuZGxlTmF2aWdhdGlvbk1vdmUgbWF5IG5vdCBtYWtlIGFuIGFjdHVhbCBz
ZWxlY3Rpb24gY2hhbmdlLgorICAgIHNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCgpOworICAgIHJl
dHVybiB0cnVlOworfQorCit2b2lkIFNlbGVjdGlvbkhhbmRsZXI6OnNldFNlbGVjdGlvbihjb25z
dCBXZWJDb3JlOjpJbnRQb2ludCYgc3RhcnQsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBlbmQp
Cit7CisgICAgbV9zZWxlY3Rpb25BY3RpdmUgPSB0cnVlOworCisgICAgQVNTRVJUKG1fd2ViUGFn
ZSk7CisgICAgQVNTRVJUKG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkpOworICAgIEFT
U0VSVChtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5zZWxlY3Rpb24oKSk7CisKKyAg
ICBGcmFtZSogZm9jdXNlZEZyYW1lID0gbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsK
KyAgICBGcmFtZVNlbGVjdGlvbiogY29udHJvbGxlciA9IGZvY3VzZWRGcmFtZS0+c2VsZWN0aW9u
KCk7CisKKyAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVs
SW5mbywgIlNlbGVjdGlvbkhhbmRsZXI6OnNldFNlbGVjdGlvbiBhZGp1c3RlZCBwb2ludHMgJWQs
ICVkLCAlZCwgJWQiLCBzdGFydC54KCksIHN0YXJ0LnkoKSwgZW5kLngoKSwgZW5kLnkoKSk7CisK
KyAgICAvLyBOb3RlIHRoYXQgSW50UG9pbnQoLTEsIC0xKSBpcyBiZWluZyBvdXIgc2VudGluZWwg
c28gZmFyIGZvcgorICAgIC8vIGNsaXBwZWQgb3V0IHNlbGVjdGlvbiBzdGFydGluZyBvciBlbmRp
bmcgbG9jYXRpb24uCisgICAgYm9vbCBzdGFydElzVmFsaWQgPSBzdGFydCAhPSBET01TdXBwb3J0
OjpJbnZhbGlkUG9pbnQ7CisgICAgbV9sYXN0VXBkYXRlZEVuZFBvaW50SXNWYWxpZCA9IGVuZCAh
PSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQ7CisKKyAgICAvLyBBdCBsZWFzdCBvbmUgb2YgdGhl
IGxvY2F0aW9ucyBtdXN0IGJlIHZhbGlkLgorICAgIEFTU0VSVChzdGFydElzVmFsaWQgfHwgbV9s
YXN0VXBkYXRlZEVuZFBvaW50SXNWYWxpZCk7CisKKyAgICBJbnRQb2ludCByZWxhdGl2ZVN0YXJ0
ID0gc3RhcnQ7CisgICAgSW50UG9pbnQgcmVsYXRpdmVFbmQgPSBlbmQ7CisKKyAgICBWaXNpYmxl
U2VsZWN0aW9uIG5ld1NlbGVjdGlvbihjb250cm9sbGVyLT5zZWxlY3Rpb24oKSk7CisKKyAgICAv
LyBXZSBuZWVkIHRoZSBzZWxlY3Rpb24gdG8gYmUgb3JkZXJlZCBiYXNlIHRoZW4gZXh0ZW50Lgor
ICAgIGlmICghY29udHJvbGxlci0+c2VsZWN0aW9uKCkuaXNCYXNlRmlyc3QoKSkKKyAgICAgICAg
Y29udHJvbGxlci0+c2V0U2VsZWN0aW9uKFZpc2libGVTZWxlY3Rpb24oY29udHJvbGxlci0+c2Vs
ZWN0aW9uKCkuc3RhcnQoKSwgY29udHJvbGxlci0+c2VsZWN0aW9uKCkuZW5kKCkpKTsKKworICAg
IGlmIChzdGFydElzVmFsaWQpIHsKKyAgICAgICAgcmVsYXRpdmVTdGFydCA9IERPTVN1cHBvcnQ6
OmNvbnZlcnRQb2ludFRvRnJhbWUobV93ZWJQYWdlLT5tYWluRnJhbWUoKSwgZm9jdXNlZEZyYW1l
LCBzdGFydCk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBzZWxlY3Rpb24gd2l0aCB2YWxpZGF0aW9u
LgorICAgICAgICBuZXdTZWxlY3Rpb24uc2V0QmFzZSh2aXNpYmxlUG9zaXRpb25Gb3JQb2ludEln
bm9yaW5nQ2xpcHBpbmcoKmZvY3VzZWRGcmFtZSwgcmVsYXRpdmVTdGFydCkpOworCisgICAgICAg
IC8vIFJlc2V0IHRoZSBzZWxlY3Rpb24gdXNpbmcgdGhlIGV4aXN0aW5nIGV4dGVudCB3aXRob3V0
IHZhbGlkYXRpb24uCisgICAgICAgIG5ld1NlbGVjdGlvbi5zZXRXaXRob3V0VmFsaWRhdGlvbihu
ZXdTZWxlY3Rpb24uYmFzZSgpLCBjb250cm9sbGVyLT5zZWxlY3Rpb24oKS5lbmQoKSk7CisgICAg
fQorCisgICAgaWYgKG1fbGFzdFVwZGF0ZWRFbmRQb2ludElzVmFsaWQpIHsKKyAgICAgICAgcmVs
YXRpdmVFbmQgPSBET01TdXBwb3J0Ojpjb252ZXJ0UG9pbnRUb0ZyYW1lKG1fd2ViUGFnZS0+bWFp
bkZyYW1lKCksIGZvY3VzZWRGcmFtZSwgZW5kKTsKKworICAgICAgICAvLyBTZXQgdGhlIHNlbGVj
dGlvbiB3aXRoIHZhbGlkYXRpb24uCisgICAgICAgIG5ld1NlbGVjdGlvbi5zZXRFeHRlbnQodmlz
aWJsZVBvc2l0aW9uRm9yUG9pbnRJZ25vcmluZ0NsaXBwaW5nKCpmb2N1c2VkRnJhbWUsIHJlbGF0
aXZlRW5kKSk7CisKKyAgICAgICAgLy8gUmVzZXQgdGhlIHNlbGVjdGlvbiB1c2luZyB0aGUgZXhp
c3RpbmcgYmFzZSB3aXRob3V0IHZhbGlkYXRpb24uCisgICAgICAgIG5ld1NlbGVjdGlvbi5zZXRX
aXRob3V0VmFsaWRhdGlvbihjb250cm9sbGVyLT5zZWxlY3Rpb24oKS5zdGFydCgpLCBuZXdTZWxl
Y3Rpb24uZXh0ZW50KCkpOworICAgIH0KKworICAgIGlmIChtX3dlYlBhZ2UtPm1faW5wdXRIYW5k
bGVyLT5pc0lucHV0TW9kZSgpKSB7CisgICAgICAgIGlmICh1cGRhdGVPckhhbmRsZUlucHV0U2Vs
ZWN0aW9uKG5ld1NlbGVjdGlvbiwgcmVsYXRpdmVTdGFydCwgcmVsYXRpdmVFbmQpKQorICAgICAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjb250cm9sbGVyLT5zZWxlY3Rpb24oKSA9
PSBuZXdTZWxlY3Rpb24pIHsKKyAgICAgICAgc2VsZWN0aW9uUG9zaXRpb25DaGFuZ2VkKCk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIHNpemUgaXMg
cmVkdWNlIHRvIGxlc3MgdGhhbiBhIGNoYXJhY3Rlciwgc2VsZWN0aW9uIHR5cGUgYmVjb21lcwor
ICAgIC8vIENhcmV0LiBBcyBsb25nIGFzIGl0IGlzIHN0aWxsIGEgcmFuZ2UsIGl0J3MgYSB2YWxp
ZCBzZWxlY3Rpb24uIFNlbGVjdGlvbiBjYW5ub3QKKyAgICAvLyBiZSBjYW5jZWxsZWQgdGhyb3Vn
aCB0aGlzIGZ1bmN0aW9uLgorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9u
IHJlZ2lvbjsKKyAgICBnZXRDb25zb2xpZGF0ZWRSZWdpb25PZlRleHRRdWFkc0ZvclNlbGVjdGlv
bihuZXdTZWxlY3Rpb24sIHJlZ2lvbik7CisgICAgY2xpcFJlZ2lvblRvVmlzaWJsZUNvbnRhaW5l
cihyZWdpb24pOworICAgIGlmICghcmVnaW9uLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBDaGVj
ayBpZiB0aGUgaGFuZGxlcyByZXZlcnNlZCBwb3NpdGlvbi4KKyAgICAgICAgaWYgKG1fc2VsZWN0
aW9uQWN0aXZlICYmICFuZXdTZWxlY3Rpb24uaXNCYXNlRmlyc3QoKSkKKyAgICAgICAgICAgIG1f
d2ViUGFnZS0+bV9jbGllbnQtPm5vdGlmeVNlbGVjdGlvbkhhbmRsZXNSZXZlcnNlZCgpOworCisg
ICAgICAgIGNvbnRyb2xsZXItPnNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb24pOworCisgICAgICAg
IERFQlVHX1NFTEVDVElPTihCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiU2Vs
ZWN0aW9uSGFuZGxlcjo6c2V0U2VsZWN0aW9uIHNlbGVjdGlvbiBwb2ludHMgdmFsaWQsIHNlbGVj
dGlvbiB1cGRhdGVkIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUmVxdWVzdGVkIHNlbGVj
dGlvbiByZXN1bHRzIGluIGFuIGVtcHR5IHNlbGVjdGlvbiwgc2tpcCB0aGlzIGNoYW5nZS4KKyAg
ICAgICAgc2VsZWN0aW9uUG9zaXRpb25DaGFuZ2VkKCk7CisKKyAgICAgICAgREVCVUdfU0VMRUNU
SU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbFdhcm4sICJTZWxlY3Rpb25IYW5kbGVy
OjpzZXRTZWxlY3Rpb24gc2VsZWN0aW9uIHBvaW50cyBpbnZhbGlkLCBzZWxlY3Rpb24gbm90IHVw
ZGF0ZWQiKTsKKyAgICB9Cit9CisKKy8vIEZJWE1FIHJlLXVzZSB0aGlzIGluIGNvbnRleHQuIE11
c3QgYmUgdXBkYXRlZCB0byBpbmNsdWRlIGFuIG9wdGlvbiB0byByZXR1cm4gdGhlIGhyZWYuCisv
LyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBtb3ZlZCB0byBhIG5ldyB1bml0IGZpbGUuIE5hbWVz
IHN1Z2dldGlvbnMgaW5jbHVkZSBET01RdWVyaWVzCisvLyBhbmQgTm9kZVR5cGVzLiBGdW5jdGlv
bnMgY3VycmVudGx5IGluIElucHV0SGFuZGxlci5jcHAsIFNlbGVjdGlvbkhhbmRsZXIuY3BwIGFu
ZCBXZWJQYWdlLmNwcAorLy8gY2FuIGFsbCBiZSBtb3ZlZCBpbi4KK3N0YXRpYyBOb2RlKiBlbmNs
b3NpbmdMaW5rRXZlbnRQYXJlbnRGb3JOb2RlKFdlYkNvcmU6Ok5vZGUqIG5vZGUpCit7CisgICAg
aWYgKCFub2RlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIE5vZGUqIGxpbmtOb2RlID0gbm9k
ZS0+ZW5jbG9zaW5nTGlua0V2ZW50UGFyZW50T3JTZWxmKCk7CisgICAgcmV0dXJuIGxpbmtOb2Rl
ICYmIGxpbmtOb2RlLT5pc0xpbmsoKSA/IGxpbmtOb2RlIDogMDsKK30KKwordm9pZCBTZWxlY3Rp
b25IYW5kbGVyOjpzZWxlY3RBdFBvaW50KGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBsb2NhdGlv
bikKK3sKKyAgICAvLyBJZiBwb2ludCBpcyBpbnZhbGlkIHRyaWdnZXIgc2VsZWN0aW9uIGJhc2Vk
IGV4cGFuc2lvbi4KKyAgICBpZiAobG9jYXRpb24gPT0gRE9NU3VwcG9ydDo6SW52YWxpZFBvaW50
KSB7CisgICAgICAgIHNlbGVjdE9iamVjdChXb3JkR3JhbnVsYXJpdHkpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgTm9kZSogdGFyZ2V0Tm9kZTsKKyAgICBXZWJDb3JlOjpJbnRQb2lu
dCB0YXJnZXRQb3NpdGlvbjsKKyAgICAvLyBGSVhNRTogRmFjdG9yeSB0aGlzIGdldCByaWdodCBm
YXQgZmluZ2VyIGNvZGUgaW50byBhIGhlbHBlci4KKyAgICBjb25zdCBGYXRGaW5nZXJzUmVzdWx0
IGxhc3RGYXRGaW5nZXJzUmVzdWx0ID0gbV93ZWJQYWdlLT5tX3RvdWNoRXZlbnRIYW5kbGVyLT5s
YXN0RmF0RmluZ2Vyc1Jlc3VsdCgpOworICAgIGlmIChsYXN0RmF0RmluZ2Vyc1Jlc3VsdC5wb3Np
dGlvbldhc0FkanVzdGVkKCkgJiYgbGFzdEZhdEZpbmdlcnNSZXN1bHQubm9kZUFzRWxlbWVudElm
QXBwbGljYWJsZSgpKSB7CisgICAgICAgIHRhcmdldE5vZGUgPSBsYXN0RmF0RmluZ2Vyc1Jlc3Vs
dC52YWxpZE5vZGUoKTsKKyAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBsYXN0RmF0RmluZ2Vyc1Jl
c3VsdC5hZGp1c3RlZFBvc2l0aW9uKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRmF0RmluZ2Vy
c1Jlc3VsdCBuZXdGYXRGaW5nZXJzUmVzdWx0ID0gRmF0RmluZ2VycyhtX3dlYlBhZ2UsIGxvY2F0
aW9uLCBGYXRGaW5nZXJzOjpUZXh0KS5maW5kQmVzdFBvaW50KCk7CisgICAgICAgIGlmICghbmV3
RmF0RmluZ2Vyc1Jlc3VsdC5wb3NpdGlvbldhc0FkanVzdGVkKCkpCisgICAgICAgICAgICByZXR1
cm47CisKKyAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBuZXdGYXRGaW5nZXJzUmVzdWx0LmFkanVz
dGVkUG9zaXRpb24oKTsKKyAgICAgICAgdGFyZ2V0Tm9kZSA9IG5ld0ZhdEZpbmdlcnNSZXN1bHQu
dmFsaWROb2RlKCk7CisgICAgfQorCisgICAgQVNTRVJUKHRhcmdldE5vZGUpOworCisgICAgLy8g
SWYgdGhlIG5vZGUgYXQgdGhlIHBvaW50IGlzIGEgbGluaywgZm9jdXMgb24gdGhlIGVudGlyZSBs
aW5rLCBub3QgYSB3b3JkLgorICAgIGlmIChOb2RlKiBsaW5rID0gZW5jbG9zaW5nTGlua0V2ZW50
UGFyZW50Rm9yTm9kZSh0YXJnZXROb2RlKSkgeworICAgICAgICBzZWxlY3RPYmplY3QobGluayk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBzZWxlY3RBdFBvaW50IEFQSSBjdXJy
ZW50bHkgb25seSBzdXBwb3J0cyBXb3JkR3JhbnVsYXJpdHkgYnV0IG1heSBiZSBleHRlbmRlZCBp
biB0aGUgZnV0dXJlLgorICAgIHNlbGVjdE9iamVjdCh0YXJnZXRQb3NpdGlvbiwgV29yZEdyYW51
bGFyaXR5KTsKK30KKworc3RhdGljIGJvb2wgZXhwYW5kU2VsZWN0aW9uVG9HcmFudWxhcml0eShG
cmFtZSogZnJhbWUsIFZpc2libGVTZWxlY3Rpb24gc2VsZWN0aW9uLCBUZXh0R3JhbnVsYXJpdHkg
Z3JhbnVsYXJpdHksIGJvb2wgaXNJbnB1dE1vZGUpCit7CisgICAgQVNTRVJUKGZyYW1lKTsKKyAg
ICBBU1NFUlQoZnJhbWUtPnNlbGVjdGlvbigpKTsKKworICAgIGlmICghKHNlbGVjdGlvbi5zdGFy
dCgpLmFuY2hvck5vZGUoKSAmJiBzZWxlY3Rpb24uc3RhcnQoKS5hbmNob3JOb2RlKCktPmlzVGV4
dE5vZGUoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChncmFudWxhcml0eSA9
PSBXb3JkR3JhbnVsYXJpdHkpCisgICAgICAgIHNlbGVjdGlvbiA9IERPTVN1cHBvcnQ6OnZpc2li
bGVTZWxlY3Rpb25Gb3JDbG9zZXN0QWN0dWFsV29yZFN0YXJ0KHNlbGVjdGlvbik7CisKKyAgICBz
ZWxlY3Rpb24uZXhwYW5kVXNpbmdHcmFudWxhcml0eShncmFudWxhcml0eSk7CisgICAgUmVmUHRy
PFJhbmdlPiBuZXdSYW5nZSA9IHNlbGVjdGlvbi50b05vcm1hbGl6ZWRSYW5nZSgpOworICAgIFJl
ZlB0cjxSYW5nZT4gb2xkUmFuZ2UgPSBmcmFtZS0+c2VsZWN0aW9uKCktPnNlbGVjdGlvbigpLnRv
Tm9ybWFsaXplZFJhbmdlKCk7CisgICAgRUFmZmluaXR5IGFmZmluaXR5ID0gZnJhbWUtPnNlbGVj
dGlvbigpLT5hZmZpbml0eSgpOworCisgICAgaWYgKGlzSW5wdXRNb2RlICYmICFmcmFtZS0+ZWRp
dG9yKCktPmNsaWVudCgpLT5zaG91bGRDaGFuZ2VTZWxlY3RlZFJhbmdlKG9sZFJhbmdlLmdldCgp
LCBuZXdSYW5nZS5nZXQoKSwgYWZmaW5pdHksIGZhbHNlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgcmV0dXJuIGZyYW1lLT5zZWxlY3Rpb24oKS0+c2V0U2VsZWN0ZWRSYW5nZShuZXdS
YW5nZS5nZXQoKSwgYWZmaW5pdHksIHRydWUpOworfQorCit2b2lkIFNlbGVjdGlvbkhhbmRsZXI6
OnNlbGVjdE9iamVjdChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgbG9jYXRpb24sIFRleHRHcmFu
dWxhcml0eSBncmFudWxhcml0eSkKK3sKKyAgICBBU1NFUlQobG9jYXRpb24ueCgpID49IDAgJiYg
bG9jYXRpb24ueSgpID49IDApOworICAgIEFTU0VSVChtX3dlYlBhZ2UgJiYgbV93ZWJQYWdlLT5m
b2N1c2VkT3JNYWluRnJhbWUoKSAmJiBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5z
ZWxlY3Rpb24oKSk7CisgICAgRnJhbWUqIGZvY3VzZWRGcmFtZSA9IG1fd2ViUGFnZS0+Zm9jdXNl
ZE9yTWFpbkZyYW1lKCk7CisKKyAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZv
cm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlvbkhhbmRsZXI6OnNlbGVjdE9iamVjdCBhZGp1c3Rl
ZCBwb2ludHMgJWQsICVkIiwgbG9jYXRpb24ueCgpLCBsb2NhdGlvbi55KCkpOworCisgICAgSW50
UG9pbnQgcmVsYXRpdmVQb2ludCA9IERPTVN1cHBvcnQ6OmNvbnZlcnRQb2ludFRvRnJhbWUobV93
ZWJQYWdlLT5tYWluRnJhbWUoKSwgZm9jdXNlZEZyYW1lLCBsb2NhdGlvbik7CisgICAgVmlzaWJs
ZVBvc2l0aW9uIHBvaW50TG9jYXRpb24oZm9jdXNlZEZyYW1lLT52aXNpYmxlUG9zaXRpb25Gb3JQ
b2ludChyZWxhdGl2ZVBvaW50KSk7CisgICAgVmlzaWJsZVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBW
aXNpYmxlU2VsZWN0aW9uKHBvaW50TG9jYXRpb24sIHBvaW50TG9jYXRpb24pOworCisgICAgbV9z
ZWxlY3Rpb25BY3RpdmUgPSBleHBhbmRTZWxlY3Rpb25Ub0dyYW51bGFyaXR5KGZvY3VzZWRGcmFt
ZSwgc2VsZWN0aW9uLCBncmFudWxhcml0eSwgbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNJ
bnB1dE1vZGUoKSk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6c2VsZWN0T2JqZWN0KFdl
YkNvcmU6OlRleHRHcmFudWxhcml0eSBncmFudWxhcml0eSkKK3sKKyAgICAvLyBVc2luZyBjYXJl
dCBsb2NhdGlvbiwgbXVzdCBiZSBpbnNpZGUgYW4gaW5wdXQgZmllbGQuCisgICAgaWYgKCFtX3dl
YlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBBU1NFUlQobV93ZWJQYWdlICYmIG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkg
JiYgbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+c2VsZWN0aW9uKCkpOworICAgIEZy
YW1lKiBmb2N1c2VkRnJhbWUgPSBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpOworCisg
ICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJT
ZWxlY3Rpb25IYW5kbGVyOjpzZWxlY3RPYmplY3QgdXNpbmcgY3VycmVudCBzZWxlY3Rpb24iKTsK
KworICAgIC8vIFVzZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gYXMgdGhlIHNlbGVjdGlvbiBwb2lu
dC4KKyAgICBBU1NFUlQoZm9jdXNlZEZyYW1lLT5zZWxlY3Rpb24oKS0+c2VsZWN0aW9uVHlwZSgp
ICE9IFZpc2libGVTZWxlY3Rpb246Ok5vU2VsZWN0aW9uKTsKKyAgICBtX3NlbGVjdGlvbkFjdGl2
ZSA9IGV4cGFuZFNlbGVjdGlvblRvR3JhbnVsYXJpdHkoZm9jdXNlZEZyYW1lLCBmb2N1c2VkRnJh
bWUtPnNlbGVjdGlvbigpLT5zZWxlY3Rpb24oKSwgZ3JhbnVsYXJpdHksIHRydWUgLyogaXNJbnB1
dE1vZGUgKi8pOworfQorCit2b2lkIFNlbGVjdGlvbkhhbmRsZXI6OnNlbGVjdE9iamVjdChXZWJD
b3JlOjpOb2RlKiBub2RlKQoreworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgbV9zZWxlY3Rpb25BY3RpdmUgPSB0cnVlOworCisgICAgQVNTRVJUKG1fd2ViUGFnZSAmJiBt
X3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpICYmIG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFp
bkZyYW1lKCktPnNlbGVjdGlvbigpKTsKKyAgICBGcmFtZSogZm9jdXNlZEZyYW1lID0gbV93ZWJQ
YWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKworICAgIERFQlVHX1NFTEVDVElPTihCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiU2VsZWN0aW9uSGFuZGxlcjo6c2VsZWN0Tm9k
ZSIpOworCisgICAgVmlzaWJsZVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBWaXNpYmxlU2VsZWN0aW9u
OjpzZWxlY3Rpb25Gcm9tQ29udGVudHNPZk5vZGUobm9kZSk7CisgICAgZm9jdXNlZEZyYW1lLT5z
ZWxlY3Rpb24oKS0+c2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Cit9CisKK3N0YXRpYyBUZXh0RGly
ZWN0aW9uIGRpcmVjdGlvbk9mRW5jbG9zaW5nQmxvY2soRnJhbWVTZWxlY3Rpb24qIHNlbGVjdGlv
bikKK3sKKyAgICBOb2RlKiBlbmNsb3NpbmdCbG9ja05vZGUgPSBlbmNsb3NpbmdCbG9jayhzZWxl
Y3Rpb24tPnNlbGVjdGlvbigpLmV4dGVudCgpLmRlcHJlY2F0ZWROb2RlKCkpOworICAgIGlmICgh
ZW5jbG9zaW5nQmxvY2tOb2RlKQorICAgICAgICByZXR1cm4gTFRSOworCisgICAgUmVuZGVyT2Jq
ZWN0KiByZW5kZXJlciA9IGVuY2xvc2luZ0Jsb2NrTm9kZS0+cmVuZGVyZXIoKTsKKyAgICBpZiAo
cmVuZGVyZXIpCisgICAgICAgIHJldHVybiByZW5kZXJlci0+c3R5bGUoKS0+ZGlyZWN0aW9uKCk7
CisKKyAgICByZXR1cm4gTFRSOworfQorCisvLyBSZXR1cm5zID4gMCBpZiBwMSBpcyAiY2xvc2Vy
IiB0byByZWZlcmVuY2VQb2ludCwgPCAwIGlmIHAyIGlzICJjbG9zZXIiLCAwIGlmIHRoZXkgYXJl
IGVxdWlkaXN0YW50LgorLy8gQmVjYXVzZSB0ZXh0IGlzIHVzdWFsbHkgYXJyYW5nZWQgaW4gaG9y
aXpvbnRhbCByb3dzLCBkaXN0YW5jZSBpcyBtZWFzdXJlZCBhbG9uZyB0aGUgeS1heGlzLCB3aXRo
IHgtYXhpcyB1c2VkIG9ubHkgdG8gYnJlYWsgdGllcy4KKy8vIElmIHJpZ2h0R3Jhdml0eSBpcyB0
cnVlLCB0aGUgcmlnaHQtbW9zdCB4LWNvb3JkaW5hdGUgaXMgY2hvc2VuLCBvdGhlcndpc2UgdGVo
IGxlZnQtbW9zdCBjb29yZGluYXRlIGlzIGNob3Nlbi4KK3N0YXRpYyBpbmxpbmUgaW50IGNvbXBh
cmVQb2ludHNUb1JlZmVyZW5jZVBvaW50KGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBwMSwgY29u
c3QgV2ViQ29yZTo6SW50UG9pbnQmIHAyLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgcmVmZXJl
bmNlUG9pbnQsIGJvb2wgcmlnaHRHcmF2aXR5KQoreworICAgIGludCBkeTEgPSBhYnMocmVmZXJl
bmNlUG9pbnQueSgpIC0gcDEueSgpKTsKKyAgICBpbnQgZHkyID0gYWJzKHJlZmVyZW5jZVBvaW50
LnkoKSAtIHAyLnkoKSk7CisgICAgaWYgKGR5MSAhPSBkeTIpCisgICAgICAgIHJldHVybiBkeTIg
LSBkeTE7CisKKyAgICAvLyBTYW1lIHktY29vcmRpbmF0ZSwgY2hvb3NlIHRoZSBmYXJ0aGVzdCBy
aWdodCAob3IgbGVmdCkgcG9pbnQuCisgICAgaWYgKHAxLngoKSA9PSBwMi54KCkpCisgICAgICAg
IHJldHVybiAwOworCisgICAgaWYgKHAxLngoKSA+IHAyLngoKSkKKyAgICAgICAgcmV0dXJuIHJp
Z2h0R3Jhdml0eSA/IDEgOiAtMTsKKworICAgIHJldHVybiByaWdodEdyYXZpdHkgPyAtMSA6IDE7
Cit9CisKKy8vIE5PVEUvRklYTUU6IER1ZSB0byByNzcyODYsIHdlIGFyZSBnZXR0aW5nIG9mZi1i
eS1vbmUgcmVzdWx0cyBpbiB0aGUgSW50UmVjdCBjbGFzcyBjb3VudGVycGFydCBpbXBsZW1lbnRh
dGlvbiBvZiB0aGUKKy8vICAgICAgICAgICAgIG1ldGhvZHMgYmVsb3cuIEFzIGRvbmUgaW4gcjg5
ODAzLCByNzc5MjggYW5kIGEgZmV3IG90aGVycywgbGV0cyB1c2UgbG9jYWwgbWV0aG9kIHRvIGZp
eCBpdC4KKy8vICAgICAgICAgICAgIFdlIHNob3VsZCBrZWVwIG91ciBleWVzIHZlcnkgb3BlbiBv
biBpdCwgc2luY2UgaXQgY2FuIGFmZmVjdCBCYWNraW5nU3RvcmUgdmVyeSBiYWRseS4KK3N0YXRp
YyBJbnRQb2ludCBtaW5YTWluWUNvcm5lcihjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiByZWN0KSB7
IHJldHVybiByZWN0LmxvY2F0aW9uKCk7IH0gLy8gdHlwaWNhbGx5IHRvcExlZnQKK3N0YXRpYyBJ
bnRQb2ludCBtYXhYTWluWUNvcm5lcihjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiByZWN0KSB7IHJl
dHVybiBXZWJDb3JlOjpJbnRQb2ludChyZWN0LngoKSArIHJlY3Qud2lkdGgoKSAtIDEsIHJlY3Qu
eSgpKTsgfSAvLyB0eXBpY2FsbHkgdG9wUmlnaHQKK3N0YXRpYyBJbnRQb2ludCBtaW5YTWF4WUNv
cm5lcihjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiByZWN0KSB7IHJldHVybiBXZWJDb3JlOjpJbnRQ
b2ludChyZWN0LngoKSwgcmVjdC55KCkgKyByZWN0LmhlaWdodCgpIC0gMSk7IH0gLy8gdHlwaWNh
bGx5IGJvdHRvbUxlZnQKK3N0YXRpYyBJbnRQb2ludCBtYXhYTWF4WUNvcm5lcihjb25zdCBXZWJD
b3JlOjpJbnRSZWN0JiByZWN0KSB7IHJldHVybiBJbnRQb2ludChyZWN0LngoKSArIHJlY3Qud2lk
dGgoKSAtIDEsIHJlY3QueSgpICsgcmVjdC5oZWlnaHQoKSAtIDEpOyB9IC8vIHR5cGljYWxseSBi
b3R0b21SaWdodAorCisvLyBUaGUgY2FyZXQgaXMgYSBvbmUtcGl4ZWwgd2lkZSBsaW5lIGRvd24g
ZWl0aGVyIHRoZSByaWdodCBvciBsZWZ0IGVkZ2Ugb2YgYQorLy8gcmVjdCwgZGVwZW5kaW5nIG9u
IHRoZSB0ZXh0IGRpcmVjdGlvbi4KK3N0YXRpYyBpbmxpbmUgYm9vbCBjYXJldElzT25MZWZ0KGJv
b2wgaXNTdGFydENhcmV0LCBib29sIGlzUlRMKQoreworICAgIChpc1N0YXJ0Q2FyZXQpID8gcmV0
dXJuICFpc1JUTCA6IHJldHVybiBpc1JUTDsKK30KKworc3RhdGljIGlubGluZSBXZWJDb3JlOjpJ
bnRQb2ludCBjYXJldExvY2F0aW9uRm9yUmVjdChjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiByZWN0
LCBib29sIGlzU3RhcnRDYXJldCwgYm9vbCBpc1JUTCkKK3sKKyAgICByZXR1cm4gY2FyZXRJc09u
TGVmdChpc1N0YXJ0Q2FyZXQsIGlzUlRMKSA/IG1pblhNaW5ZQ29ybmVyKHJlY3QpIDogbWF4WE1p
bllDb3JuZXIocmVjdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgV2ViQ29yZTo6SW50UG9pbnQgY2Fy
ZXRDb21wYXJpc29uUG9pbnRGb3JSZWN0KGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIHJlY3QsIGJv
b2wgaXNTdGFydENhcmV0LCBib29sIGlzUlRMKQoreworICAgIGlmIChpc1N0YXJ0Q2FyZXQpCisg
ICAgICAgIHJldHVybiBjYXJldElzT25MZWZ0KGlzU3RhcnRDYXJldCwgaXNSVEwpID8gbWluWE1p
bllDb3JuZXIocmVjdCkgOiBtYXhYTWluWUNvcm5lcihyZWN0KTsKKworICAgIHJldHVybiBjYXJl
dElzT25MZWZ0KGlzU3RhcnRDYXJldCwgaXNSVEwpID8gbWluWE1heFlDb3JuZXIocmVjdCkgOiBt
YXhYTWF4WUNvcm5lcihyZWN0KTsKK30KKworc3RhdGljIHZvaWQgYWRqdXN0Q2FyZXRSZWN0cyhX
ZWJDb3JlOjpJbnRSZWN0JiBzdGFydENhcmV0LCBib29sIGlzU3RhcnRDYXJldENsaXBwZWRPdXQs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYkNvcmU6OkludFJlY3QmIGVuZENhcmV0
LCBib29sIGlzRW5kQ2FyZXRDbGlwcGVkT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBzdGQ6OnZlY3RvcjxCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdD4gcmVjdExp
c3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYkNvcmU6OkludFBvaW50
JiBzdGFydFJlZmVyZW5jZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBXZWJDb3JlOjpJbnRQb2ludCYgZW5kUmVmZXJlbmNlUG9pbnQsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJvb2wgaXNSVEwpCit7CisgICAgLy8gc3RhcnRSZWZlcmVuY2VQb2ludCBp
cyB0aGUgYmVzdCBndWVzcyBhdCB0aGUgdG9wIGxlZnQgb2YgdGhlIHNlbGVjdGlvbjsgZW5kUmVm
ZXJlbmNlUG9pbnQgaXMgdGhlIGJlc3QgZ3Vlc3MgYXQgdGhlIGJvdHRvbSByaWdodC4KKyAgICBp
ZiAoaXNTdGFydENhcmV0Q2xpcHBlZE91dCkKKyAgICAgICAgc3RhcnRDYXJldC5zZXRMb2NhdGlv
bihET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQpOworICAgIGVsc2UgeworICAgICAgICBzdGFydENh
cmV0ID0gcmVjdExpc3RbMF07CisgICAgICAgIHN0YXJ0Q2FyZXQuc2V0TG9jYXRpb24oY2FyZXRM
b2NhdGlvbkZvclJlY3Qoc3RhcnRDYXJldCwgdHJ1ZSwgaXNSVEwpKTsKKyAgICB9CisKKyAgICBp
ZiAoaXNFbmRDYXJldENsaXBwZWRPdXQpCisgICAgICAgIGVuZENhcmV0LnNldExvY2F0aW9uKERP
TVN1cHBvcnQ6OkludmFsaWRQb2ludCk7CisgICAgZWxzZSB7CisgICAgICAgIGVuZENhcmV0ID0g
cmVjdExpc3RbMF07CisgICAgICAgIGVuZENhcmV0LnNldExvY2F0aW9uKGNhcmV0TG9jYXRpb25G
b3JSZWN0KGVuZENhcmV0LCBmYWxzZSwgaXNSVEwpKTsKKyAgICB9CisKKyAgICBpZiAoaXNTdGFy
dENhcmV0Q2xpcHBlZE91dCAmJiBpc0VuZENhcmV0Q2xpcHBlZE91dCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgLy8gUmVzZXQgd2lkdGggdG8gMSBhcyB3ZSBhcmUgc3RyaWN0bHkgaW50ZXJlc3Rl
ZCBpbiBjYXJldCBsb2NhdGlvbi4KKyAgICBzdGFydENhcmV0LnNldFdpZHRoKDEpOworICAgIGVu
ZENhcmV0LnNldFdpZHRoKDEpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IHJlY3RM
aXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIEludFJlY3QgY3VycmVudFJlY3QocmVjdExpc3Rb
aV0pOworICAgICAgICAvLyBDb21wYXJlIHN0YXJ0IGFuZCBlbmQgYW5kIHVwZGF0ZS4KKworICAg
ICAgICBpZiAoIWlzU3RhcnRDYXJldENsaXBwZWRPdXQgJiYgY29tcGFyZVBvaW50c1RvUmVmZXJl
bmNlUG9pbnQoCisgICAgICAgICAgICAgICAgICAgIGNhcmV0Q29tcGFyaXNvblBvaW50Rm9yUmVj
dChjdXJyZW50UmVjdCwgdHJ1ZSwgaXNSVEwpLAorICAgICAgICAgICAgICAgICAgICBjYXJldENv
bXBhcmlzb25Qb2ludEZvclJlY3Qoc3RhcnRDYXJldCwgdHJ1ZSwgaXNSVEwpLAorICAgICAgICAg
ICAgICAgICAgICBzdGFydFJlZmVyZW5jZVBvaW50LCBpc1JUTCkgPiAwKSB7CisgICAgICAgICAg
ICBzdGFydENhcmV0LnNldExvY2F0aW9uKGNhcmV0TG9jYXRpb25Gb3JSZWN0KGN1cnJlbnRSZWN0
LCB0cnVlLCBpc1JUTCkpOworICAgICAgICAgICAgc3RhcnRDYXJldC5zZXRIZWlnaHQoY3VycmVu
dFJlY3QuaGVpZ2h0KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc0VuZENhcmV0Q2xp
cHBlZE91dCAmJiBjb21wYXJlUG9pbnRzVG9SZWZlcmVuY2VQb2ludCgKKyAgICAgICAgICAgICAg
ICAgICAgY2FyZXRDb21wYXJpc29uUG9pbnRGb3JSZWN0KGN1cnJlbnRSZWN0LCBmYWxzZSwgaXNS
VEwpLAorICAgICAgICAgICAgICAgICAgICBjYXJldENvbXBhcmlzb25Qb2ludEZvclJlY3QoZW5k
Q2FyZXQsIGZhbHNlLCBpc1JUTCksCisgICAgICAgICAgICAgICAgICAgIGVuZFJlZmVyZW5jZVBv
aW50LCAhaXNSVEwpID4gMCkgeworICAgICAgICAgICAgZW5kQ2FyZXQuc2V0TG9jYXRpb24oY2Fy
ZXRMb2NhdGlvbkZvclJlY3QoY3VycmVudFJlY3QsIGZhbHNlLCBpc1JUTCkpOworICAgICAgICAg
ICAgZW5kQ2FyZXQuc2V0SGVpZ2h0KGN1cnJlbnRSZWN0LmhlaWdodCgpKTsKKyAgICAgICAgfQor
ICAgIH0KK30KKwordm9pZCBTZWxlY3Rpb25IYW5kbGVyOjpjbGlwUmVnaW9uVG9WaXNpYmxlQ29u
dGFpbmVyKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uJiByZWdpb24pCit7Cisg
ICAgQVNTRVJUKG1fd2ViUGFnZS0+bV9tYWluRnJhbWUgJiYgbV93ZWJQYWdlLT5tX21haW5GcmFt
ZS0+dmlldygpKTsKKworICAgIEZyYW1lKiBmcmFtZSA9IG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFp
bkZyYW1lKCk7CisKKyAgICAvLyBEb24ndCBhbGxvdyB0aGUgcmVnaW9uIHRvIGV4dGVuZCBvdXRz
aWRlIG9mIHRoZSBhbGwgaXRzIGFuY2VzdG9yIGZyYW1lcycgdmlzaWJsZSBhcmVhLgorICAgIGlm
IChmcmFtZSAhPSBtX3dlYlBhZ2UtPm1haW5GcmFtZSgpKSB7CisgICAgICAgIFdlYkNvcmU6Oklu
dFJlY3QgY29udGFpbmluZ0NvbnRlbnRSZWN0OworICAgICAgICBjb250YWluaW5nQ29udGVudFJl
Y3QgPSBtX3dlYlBhZ2UtPmdldFJlY3Vyc2l2ZVZpc2libGVXaW5kb3dSZWN0KGZyYW1lLT52aWV3
KCksIHRydWUgLyogbm8gY2xpcCB0byBtYWluIGZyYW1lIHdpbmRvdyAqLyk7CisgICAgICAgIGNv
bnRhaW5pbmdDb250ZW50UmVjdCA9IG1fd2ViUGFnZS0+bV9tYWluRnJhbWUtPnZpZXcoKS0+d2lu
ZG93VG9Db250ZW50cyhjb250YWluaW5nQ29udGVudFJlY3QpOworICAgICAgICByZWdpb24gPSBp
bnRlcnNlY3RSZWdpb25zKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uKGNvbnRh
aW5pbmdDb250ZW50UmVjdCksIHJlZ2lvbik7CisgICAgfQorCisgICAgLy8gRG9uJ3QgYWxsb3cg
dGhlIHJlZ2lvbiB0byBleHRlbmQgb3V0c2lkZSBvZiB0aGUgaW5wdXQgZmllbGQuCisgICAgaWYg
KG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXItPmlzSW5wdXRNb2RlKCkKKyAgICAgICAgJiYgZnJh
bWUtPmRvY3VtZW50KCktPmZvY3VzZWROb2RlKCkKKyAgICAgICAgJiYgZnJhbWUtPmRvY3VtZW50
KCktPmZvY3VzZWROb2RlKCktPnJlbmRlcmVyKCkpIHsKKworICAgICAgICAvLyBBZGp1c3QgdGhl
IGJvdW5kaW5nIGJveCB0byB0aGUgZnJhbWUgb2Zmc2V0LgorICAgICAgICBJbnRSZWN0IGJvdW5k
aW5nQm94KGZyYW1lLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpLT5yZW5kZXJlcigpLT5hYnNv
bHV0ZUJvdW5kaW5nQm94UmVjdCgpKTsKKyAgICAgICAgYm91bmRpbmdCb3ggPSBtX3dlYlBhZ2Ut
Pm1haW5GcmFtZSgpLT52aWV3KCktPndpbmRvd1RvQ29udGVudHMoZnJhbWUtPnZpZXcoKS0+Y29u
dGVudHNUb1dpbmRvdyhib3VuZGluZ0JveCkpOworCisgICAgICAgIHJlZ2lvbiA9IGludGVyc2Vj
dFJlZ2lvbnMoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb24oYm91bmRpbmdCb3gp
LCByZWdpb24pOworICAgIH0KK30KKworc3RhdGljIFdlYkNvcmU6OkludFBvaW50IHJlZmVyZW5j
ZVBvaW50KGNvbnN0IFdlYkNvcmU6OlZpc2libGVQb3NpdGlvbiYgcG9zaXRpb24sIGNvbnN0IFdl
YkNvcmU6OkludFJlY3QmIGJvdW5kaW5nUmVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICwgY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIGZyYW1lUG9zaXRpb24sIGJv
b2wgaXNTdGFydENhcmV0LCBib29sIGlzUlRMKQoreworICAgIC8vIElmIG9uZSBvZiB0aGUgY2Fy
ZXRzIGlzIGludmFsaWQgKHRoaXMgaGFwcGVucywgZm9yIGluc3RhbmNlLCBpZiB0aGUKKyAgICAv
LyBzZWxlY3Rpb24gZW5kcyBpbiBhbiBlbXB0eSBkaXYpIGZhbGwgYmFjayB0byB1c2luZyB0aGUg
Y29ybmVyIG9mIHRoZQorICAgIC8vIGVudGlyZSByZWdpb24gKHdoaWNoIGlzIGFscmVhZHkgaW4g
ZnJhbWUgY29vcmRpbmF0ZXMgc28gZG9lc24ndCBuZWVkCisgICAgLy8gYWRqdXN0aW5nKS4KKyAg
ICBXZWJDb3JlOjpJbnRSZWN0IHN0YXJ0Q2FyZXRCb3VuZHMocG9zaXRpb24uYWJzb2x1dGVDYXJl
dEJvdW5kcygpKTsKKyAgICBpZiAoc3RhcnRDYXJldEJvdW5kcy5pc0VtcHR5KCkpCisgICAgICAg
IHN0YXJ0Q2FyZXRCb3VuZHMgPSBib3VuZGluZ1JlY3Q7CisgICAgZWxzZQorICAgICAgICBzdGFy
dENhcmV0Qm91bmRzLm1vdmUoZnJhbWVQb3NpdGlvbi54KCksIGZyYW1lUG9zaXRpb24ueSgpKTsK
KworICAgIHJldHVybiBjYXJldENvbXBhcmlzb25Qb2ludEZvclJlY3Qoc3RhcnRDYXJldEJvdW5k
cywgaXNTdGFydENhcmV0LCBpc1JUTCk7Cit9CisKKy8vIE5vdGU6IFRoaXMgaXMgdGhlIG9ubHkg
ZnVuY3Rpb24gaW4gU2VsZWN0aW9uSGFuZGxlciBpbiB3aGljaCB0aGUgY29vcmRpbmF0ZQorLy8g
c3lzdGVtIGlzIG5vdCBlbnRpcmVseSBXZWJLaXQuCit2b2lkIFNlbGVjdGlvbkhhbmRsZXI6OnNl
bGVjdGlvblBvc2l0aW9uQ2hhbmdlZChib29sIHZpc3VhbENoYW5nZU9ubHkpCit7CisgICAgREVC
VUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJTZWxlY3Rp
b25IYW5kbGVyOjpzZWxlY3Rpb25Qb3NpdGlvbkNoYW5nZWQgdmlzaWJsZUNoYW5nZU9ubHkgPSAl
cyIsIHZpc3VhbENoYW5nZU9ubHkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKworICAgIC8vIFRoaXMg
bWV0aG9kIGNhbiBnZXQgY2FsbGVkIGR1cmluZyBXZWJQYWdlIHNodXRkb3duIHByb2Nlc3MuCisg
ICAgLy8gSWYgdGhhdCBpcyB0aGUgY2FzZSwganVzdCBiYWlsIG91dCBzaW5jZSB0aGUgY2xpZW50
IGlzIG5vdAorICAgIC8vIGluIGEgc2FmZSBzdGF0ZSBvZiB0cnVzdCB0byByZXF1ZXN0IGFueXRo
aW5nIGVsc2UgZnJvbSBpdC4KKyAgICBpZiAoIW1fd2ViUGFnZS0+bV9tYWluRnJhbWUpCisgICAg
ICAgIHJldHVybjsKKworICAgIGlmIChtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0
TW9kZSgpICYmIG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXItPnByb2Nlc3NpbmdDaGFuZ2UoKSkg
eworICAgICAgICBtX3dlYlBhZ2UtPm1fY2xpZW50LT5jYW5jZWxTZWxlY3Rpb25WaXN1YWxzKCk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobV9jYXJldEFjdGl2ZSB8fCAobV93
ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNJbnB1dE1vZGUoKSAmJiBtX3dlYlBhZ2UtPmZvY3Vz
ZWRPck1haW5GcmFtZSgpLT5zZWxlY3Rpb24oKS0+aXNDYXJldCgpKSkgeworICAgICAgICAvLyBU
aGlzIG1heSB1cGRhdGUgdGhlIGNhcmV0IHRvIG5vIGxvbmdlciBiZSBhY3RpdmUuCisgICAgICAg
IGNhcmV0UG9zaXRpb25DaGFuZ2VkKCk7CisgICAgfQorCisgICAgLy8gRW50ZXIgc2VsZWN0aW9u
IG1vZGUgaWYgc2VsZWN0aW9uIHR5cGUgaXMgUmFuZ2VTZWxlY3Rpb24sIGFuZCBkaXNhYmxlIHNl
bGVjdGlvbiBpZgorICAgIC8vIHNlbGVjdGlvbiBpcyBhY3RpdmUgYW5kIGJlY29tZXMgY2FyZXQg
c2VsZWN0aW9uLgorICAgIEZyYW1lKiBmcmFtZSA9IG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZy
YW1lKCk7CisgICAgSW50UG9pbnQgZnJhbWVQb3MgPSBtX3dlYlBhZ2UtPmZyYW1lT2Zmc2V0KGZy
YW1lKTsKKyAgICBpZiAobV9zZWxlY3Rpb25BY3RpdmUgJiYgKG1fY2FyZXRBY3RpdmUgfHwgZnJh
bWUtPnNlbGVjdGlvbigpLT5pc05vbmUoKSkpCisgICAgICAgIG1fc2VsZWN0aW9uQWN0aXZlID0g
ZmFsc2U7CisgICAgZWxzZSBpZiAoZnJhbWUtPnNlbGVjdGlvbigpLT5pc1JhbmdlKCkpCisgICAg
ICAgIG1fc2VsZWN0aW9uQWN0aXZlID0gdHJ1ZTsKKyAgICBlbHNlIGlmICghbV9zZWxlY3Rpb25B
Y3RpdmUpCisgICAgICAgIHJldHVybjsKKworICAgIFdlYkNvcmU6OkludFJlY3Qgc3RhcnRDYXJl
dDsKKyAgICBXZWJDb3JlOjpJbnRSZWN0IGVuZENhcmV0OworCisgICAgLy8gR2V0IHRoZSB0ZXh0
IHJlY3RzIGZyb20gdGhlIHNlbGVjdGlvbnMgcmFuZ2UuCisgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OkludFJlY3RSZWdpb24gcmVnaW9uOworICAgIGdldENvbnNvbGlkYXRlZFJlZ2lvbk9mVGV4
dFF1YWRzRm9yU2VsZWN0aW9uKGZyYW1lLT5zZWxlY3Rpb24oKS0+c2VsZWN0aW9uKCksIHJlZ2lv
bik7CisKKyAgICAvLyBJZiB0aGVyZSBpcyBubyBjaGFuZ2UgaW4gc2VsZWN0ZWQgdGV4dCBhbmQg
dGhlIHZpc3VhbCByZWN0cworICAgIC8vIGhhdmUgbm90IGNoYW5nZWQgdGhlbiBkb24ndCBib3Ro
ZXIgbm90aWZ5aW5nIGFueXRoaW5nLgorICAgIGlmICh2aXN1YWxDaGFuZ2VPbmx5ICYmIG1fbGFz
dFNlbGVjdGlvblJlZ2lvbi5pc0VxdWFsKHJlZ2lvbikpCisgICAgICAgIHJldHVybjsKKworICAg
IG1fbGFzdFNlbGVjdGlvblJlZ2lvbiA9IHJlZ2lvbjsKKworICAgIGlmICghcmVnaW9uLmlzRW1w
dHkoKSkgeworICAgICAgICBXZWJDb3JlOjpJbnRSZWN0IHVuY2xpcHBlZFN0YXJ0Q2FyZXQ7Cisg
ICAgICAgIFdlYkNvcmU6OkludFJlY3QgdW5jbGlwcGVkRW5kQ2FyZXQ7CisKKyAgICAgICAgYm9v
bCBpc1JUTCA9IGRpcmVjdGlvbk9mRW5jbG9zaW5nQmxvY2soZnJhbWUtPnNlbGVjdGlvbigpKSA9
PSBSVEw7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8QmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJl
Y3Q+IHJlY3RMaXN0ID0gcmVnaW9uLnJlY3RzKCk7CisKKyAgICAgICAgV2ViQ29yZTo6SW50UG9p
bnQgc3RhcnRDYXJldFJlZmVyZW5jZVBvaW50ID0gcmVmZXJlbmNlUG9pbnQoZnJhbWUtPnNlbGVj
dGlvbigpLT5zZWxlY3Rpb24oKS52aXNpYmxlU3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uLmV4
dGVudHMoKSwgZnJhbWVQb3MsIHRydWUgLyogaXNTdGFydENhcmV0ICovLCBpc1JUTCk7CisgICAg
ICAgIFdlYkNvcmU6OkludFBvaW50IGVuZENhcmV0UmVmZXJlbmNlUG9pbnQgPSByZWZlcmVuY2VQ
b2ludChmcmFtZS0+c2VsZWN0aW9uKCktPnNlbGVjdGlvbigpLnZpc2libGVFbmQoKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmVnaW9uLmV4dGVudHMoKSwgZnJhbWVQb3MsIGZhbHNlIC8qIGlzU3RhcnRDYXJldCAq
LywgaXNSVEwpOworCisgICAgICAgIGFkanVzdENhcmV0UmVjdHModW5jbGlwcGVkU3RhcnRDYXJl
dCwgZmFsc2UgLyogdW5jbGlwcGVkICovLCB1bmNsaXBwZWRFbmRDYXJldCwgZmFsc2UgLyogdW5j
bGlwcGVkICovLCByZWN0TGlzdCwgc3RhcnRDYXJldFJlZmVyZW5jZVBvaW50LCBlbmRDYXJldFJl
ZmVyZW5jZVBvaW50LCBpc1JUTCk7CisKKyAgICAgICAgY2xpcFJlZ2lvblRvVmlzaWJsZUNvbnRh
aW5lcihyZWdpb24pOworCisjaWYgU0hPV0RFQlVHX1NFTEVDVElPTkhBTkRMRVIgLy8gRG9uJ3Qg
cmVseSBqdXN0IG9uIERFQlVHX1NFTEVDVElPTiB0byBhdm9pZCBsb29wLgorICAgICAgICBmb3Ig
KHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHJlY3RMaXN0LnNpemUoKTsgaSsrKQorICAgICAgICAg
ICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2Fs
LCAiUmVjdCBsaXN0IC0gVW5tb2RpZmllZCAjJWQsICglZCwgJWQpICglZCB4ICVkKSIsIGksIHJl
Y3RMaXN0W2ldLngoKSwgcmVjdExpc3RbaV0ueSgpLCByZWN0TGlzdFtpXS53aWR0aCgpLCByZWN0
TGlzdFtpXS5oZWlnaHQoKSk7CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwg
cmVnaW9uLm51bVJlY3RzKCk7IGkrKykKKyAgICAgICAgICAgIERFQlVHX1NFTEVDVElPTihCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIlJlY3QgbGlzdCAgLSBDb25zb2xp
ZGF0ZWQgIyVkLCAoJWQsICVkKSAoJWQgeCAlZCkiLCBpLCByZWdpb24ucmVjdHMoKVtpXS54KCks
IHJlZ2lvbi5yZWN0cygpW2ldLnkoKSwgcmVnaW9uLnJlY3RzKClbaV0ud2lkdGgoKSwgcmVnaW9u
LnJlY3RzKClbaV0uaGVpZ2h0KCkpOworI2VuZGlmCisKKyAgICAgICAgYm9vbCBzaG91bGRDYXJl
QWJvdXRQb3NzaWJsZUNsaXBwZWRPdXRTZWxlY3Rpb24gPSBmcmFtZSAhPSBtX3dlYlBhZ2UtPm1h
aW5GcmFtZSgpIHx8IG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXItPmlzSW5wdXRNb2RlKCk7CisK
KyAgICAgICAgaWYgKCFyZWdpb24uaXNFbXB0eSgpIHx8IHNob3VsZENhcmVBYm91dFBvc3NpYmxl
Q2xpcHBlZE91dFNlbGVjdGlvbikgeworICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBoYW5kbGUg
bWFya2VycyB0byBiZSBhdCB0aGUgZW5kIG9mIHRoZSBwYWludGVkIHJlY3QuIFdoZW4gc2VsZWN0
aW5nIGxpbmtzCisgICAgICAgICAgICAvLyBhbmQgb3RoZXIgZWxlbWVudHMgdGhhdCBtYXkgaGF2
ZSBhIGxhcmdlciB2aXNpYmxlIGFyZWEgdGhhbiBuZWVkcyB0byBiZSByZW5kZXJlZCBhIGdhcAor
ICAgICAgICAgICAgLy8gY2FuIGV4aXN0IGJldHdlZW4gdGhlIGhhbmRsZSBhbmQgb3ZlcmxheSBy
ZWdpb24uCisKKyAgICAgICAgICAgIGJvb2wgc2hvdWxkQ2xpcFN0YXJ0Q2FyZXQgPSAhcmVnaW9u
LmlzUmVjdEluUmVnaW9uKHVuY2xpcHBlZFN0YXJ0Q2FyZXQpOworICAgICAgICAgICAgYm9vbCBz
aG91bGRDbGlwRW5kQ2FyZXQgPSAhcmVnaW9uLmlzUmVjdEluUmVnaW9uKHVuY2xpcHBlZEVuZENh
cmV0KTsKKworICAgICAgICAgICAgLy8gRmluZCB0aGUgdG9wIGNvcm5lciBhbmQgYm90dG9tIGNv
cm5lci4KKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRS
ZWN0PiBjbGlwcGVkUmVjdExpc3QgPSByZWdpb24ucmVjdHMoKTsKKyAgICAgICAgICAgIGFkanVz
dENhcmV0UmVjdHMoc3RhcnRDYXJldCwgc2hvdWxkQ2xpcFN0YXJ0Q2FyZXQsIGVuZENhcmV0LCBz
aG91bGRDbGlwRW5kQ2FyZXQsIGNsaXBwZWRSZWN0TGlzdCwgc3RhcnRDYXJldFJlZmVyZW5jZVBv
aW50LCBlbmRDYXJldFJlZmVyZW5jZVBvaW50LCBpc1JUTCk7CisKKyAgICAgICAgICAgIC8vIFRy
YW5zbGF0ZSB0aGUgY2FyZXQgdmFsdWVzIGFzIHRoZXkgbXVzdCBiZSBpbiB0cmFuc2Zvcm1lZCBj
b29yZGluYXRlcy4KKyAgICAgICAgICAgIGlmICghc2hvdWxkQ2xpcFN0YXJ0Q2FyZXQpIHsKKyAg
ICAgICAgICAgICAgICBzdGFydENhcmV0ID0gbV93ZWJQYWdlLT5tYXBUb1RyYW5zZm9ybWVkKHN0
YXJ0Q2FyZXQpOworICAgICAgICAgICAgICAgIG1fd2ViUGFnZS0+Y2xpcFRvVHJhbnNmb3JtZWRD
b250ZW50c1JlY3Qoc3RhcnRDYXJldCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlm
ICghc2hvdWxkQ2xpcEVuZENhcmV0KSB7CisgICAgICAgICAgICAgICAgZW5kQ2FyZXQgPSBtX3dl
YlBhZ2UtPm1hcFRvVHJhbnNmb3JtZWQoZW5kQ2FyZXQpOworICAgICAgICAgICAgICAgIG1fd2Vi
UGFnZS0+Y2xpcFRvVHJhbnNmb3JtZWRDb250ZW50c1JlY3QoZW5kQ2FyZXQpOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJTZWxlY3Rpb25IYW5kbGVyOjpzZWxlY3Rpb25Qb3Np
dGlvbkNoYW5nZWQgU3RhcnQgUmVjdD0lcyBFbmQgUmVjdD0lcyIsCisgICAgICAgICAgICAgICAg
ICAgICAgICBzdGFydENhcmV0LnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSwgZW5kQ2FyZXQudG9T
dHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIG1fd2ViUGFnZS0+bV9jbGllbnQtPm5vdGlm
eVNlbGVjdGlvbkRldGFpbHNDaGFuZ2VkKHN0YXJ0Q2FyZXQsIGVuZENhcmV0LCByZWdpb24pOwor
fQorCisvLyBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBpbiBXZWJLaXQgY29vcmRpbmF0ZXMu
Cit2b2lkIFNlbGVjdGlvbkhhbmRsZXI6OmNhcmV0UG9zaXRpb25DaGFuZ2VkKCkKK3sKKyAgICBE
RUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVj
dGlvbkhhbmRsZXI6OmNhcmV0UG9zaXRpb25DaGFuZ2VkIik7CisKKyAgICBXZWJDb3JlOjpJbnRS
ZWN0IGNhcmV0TG9jYXRpb247CisgICAgLy8gSWYgdGhlIGlucHV0IGZpZWxkIGlzIG5vdCBhY3Rp
dmUsIHdlIG11c3QgYmUgdHVybmluZyBvZmYgdGhlIGNhcmV0LgorICAgIGlmICghbV93ZWJQYWdl
LT5tX2lucHV0SGFuZGxlci0+aXNJbnB1dE1vZGUoKSAmJiBtX2NhcmV0QWN0aXZlKSB7CisgICAg
ICAgIG1fY2FyZXRBY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgLy8gU2VuZCBhbiBlbXB0eSBjYXJl
dCBjaGFuZ2UgdG8gdHVybiBvZmYgdGhlIGNhcmV0LgorICAgICAgICBtX3dlYlBhZ2UtPm1fY2xp
ZW50LT5ub3RpZnlDYXJldENoYW5nZWQoY2FyZXRMb2NhdGlvbiwgbV93ZWJQYWdlLT5tX3RvdWNo
RXZlbnRIYW5kbGVyLT5sYXN0RmF0RmluZ2Vyc1Jlc3VsdCgpLmlzVGV4dElucHV0KCkgLyogdXNl
clRvdWNoVHJpZ2dlcmVkICovKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VS
VChtX3dlYlBhZ2UgJiYgbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKSAmJiBtX3dlYlBh
Z2UtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5zZWxlY3Rpb24oKSk7CisKKyAgICAvLyBUaGlzIGZ1
bmN0aW9uIHNob3VsZCBvbmx5IHJlYWNoIHRoaXMgcG9pbnQgaWYgaW5wdXQgbW9kZSBpcyBhY3Rp
dmUuCisgICAgQVNTRVJUKG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXItPmlzSW5wdXRNb2RlKCkp
OworCisgICAgaWYgKG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnNlbGVjdGlvbigp
LT5zZWxlY3Rpb25UeXBlKCkgPT0gVmlzaWJsZVNlbGVjdGlvbjo6Q2FyZXRTZWxlY3Rpb24pIHsK
KyAgICAgICAgSW50UG9pbnQgZnJhbWVPZmZzZXQgPSBtX3dlYlBhZ2UtPmZyYW1lT2Zmc2V0KG1f
d2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkpOworCisgICAgICAgIGNhcmV0TG9jYXRpb24g
PSBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5zZWxlY3Rpb24oKS0+c2VsZWN0aW9u
KCkudmlzaWJsZVN0YXJ0KCkuYWJzb2x1dGVDYXJldEJvdW5kcygpOworICAgICAgICBjYXJldExv
Y2F0aW9uLm1vdmUoZnJhbWVPZmZzZXQueCgpLCBmcmFtZU9mZnNldC55KCkpOworCisgICAgICAg
IC8vIENsaXAgYWdhaW5zdCB0aGUgY29udGFpbmluZyBmcmFtZSBhbmQgbm9kZSBib3VuZGFyaWVz
LgorICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiByZWdpb24oY2Fy
ZXRMb2NhdGlvbik7CisgICAgICAgIGNsaXBSZWdpb25Ub1Zpc2libGVDb250YWluZXIocmVnaW9u
KTsKKyAgICAgICAgY2FyZXRMb2NhdGlvbiA9IHJlZ2lvbi5leHRlbnRzKCk7CisgICAgfQorCisg
ICAgbV9jYXJldEFjdGl2ZSA9ICFjYXJldExvY2F0aW9uLmlzRW1wdHkoKTsKKworICAgIERFQlVH
X1NFTEVDVElPTihCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiU2VsZWN0aW9u
SGFuZGxlcjo6Y2FyZXRQb3NpdGlvbkNoYW5nZWQgY2FyZXQgUmVjdCAlZCwgJWQsICVkeCVkIiwK
KyAgICAgICAgICAgICAgICAgICAgICAgIGNhcmV0TG9jYXRpb24ueCgpLCBjYXJldExvY2F0aW9u
LnkoKSwgY2FyZXRMb2NhdGlvbi53aWR0aCgpLCBjYXJldExvY2F0aW9uLmhlaWdodCgpKTsKKwor
ICAgIGNhcmV0TG9jYXRpb24gPSBtX3dlYlBhZ2UtPm1hcFRvVHJhbnNmb3JtZWQoY2FyZXRMb2Nh
dGlvbik7CisgICAgbV93ZWJQYWdlLT5jbGlwVG9UcmFuc2Zvcm1lZENvbnRlbnRzUmVjdChjYXJl
dExvY2F0aW9uKTsKKworICAgIG1fd2ViUGFnZS0+bV9jbGllbnQtPm5vdGlmeUNhcmV0Q2hhbmdl
ZChjYXJldExvY2F0aW9uLCBtX3dlYlBhZ2UtPm1fdG91Y2hFdmVudEhhbmRsZXItPmxhc3RGYXRG
aW5nZXJzUmVzdWx0KCkuaXNUZXh0SW5wdXQoKSAvKiB1c2VyVG91Y2hUcmlnZ2VyZWQgKi8pOwor
fQorCitib29sIFNlbGVjdGlvbkhhbmRsZXI6OnNlbGVjdGlvbkNvbnRhaW5zKGNvbnN0IFdlYkNv
cmU6OkludFBvaW50JiBwb2ludCkKK3sKKyAgICBBU1NFUlQobV93ZWJQYWdlICYmIG1fd2ViUGFn
ZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkgJiYgbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUo
KS0+c2VsZWN0aW9uKCkpOworICAgIHJldHVybiBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFt
ZSgpLT5zZWxlY3Rpb24oKS0+Y29udGFpbnMocG9pbnQpOworfQorCit9Cit9CmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9TZWxlY3Rpb25IYW5kbGVy
LmggYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9TZWxlY3Rpb25IYW5k
bGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uZjIwNDkyODViMGQxYWI1MTg1MWE3ZWEyYmU5N2E4ZjU5NTgyYWU4
NQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBw
b3J0L1NlbGVjdGlvbkhhbmRsZXIuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDEwLCAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAq
IEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3Rv
biwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgU2VsZWN0aW9uSGFuZGxlcl9o
CisjZGVmaW5lIFNlbGVjdGlvbkhhbmRsZXJfaAorCisjaW5jbHVkZSAiQmxhY2tCZXJyeVBsYXRm
b3JtSW50UmVjdFJlZ2lvbi5oIgorI2luY2x1ZGUgIkJsYWNrQmVycnlQbGF0Zm9ybVByaW1pdGl2
ZXMuaCIKKyNpbmNsdWRlICJUZXh0R3JhbnVsYXJpdHkuaCIKKworbmFtZXNwYWNlIFdURiB7Citj
bGFzcyBTdHJpbmc7Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEludFBvaW50Owor
Y2xhc3MgSW50UmVjdDsKK2NsYXNzIE5vZGU7CitjbGFzcyBWaXNpYmxlUG9zaXRpb247CitjbGFz
cyBWaXNpYmxlU2VsZWN0aW9uOworfQorCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7CisKK25hbWVz
cGFjZSBXZWJLaXQgeworCitjbGFzcyBXZWJQYWdlUHJpdmF0ZTsKK2NsYXNzIFdlYlN0cmluZzsK
KworY2xhc3MgU2VsZWN0aW9uSGFuZGxlciB7CitwdWJsaWM6CisgICAgU2VsZWN0aW9uSGFuZGxl
cihXZWJQYWdlUHJpdmF0ZSopOworICAgIH5TZWxlY3Rpb25IYW5kbGVyKCk7CisKKyAgICBib29s
IGlzU2VsZWN0aW9uQWN0aXZlKCkgeyByZXR1cm4gbV9zZWxlY3Rpb25BY3RpdmU7IH0KKyAgICB2
b2lkIHNldFNlbGVjdGlvbkFjdGl2ZShib29sIGFjdGl2ZSkgeyBtX3NlbGVjdGlvbkFjdGl2ZSA9
IGFjdGl2ZTsgfQorCisgICAgdm9pZCBjYW5jZWxTZWxlY3Rpb24oKTsKKyAgICBXZWJTdHJpbmcg
c2VsZWN0ZWRUZXh0KCkgY29uc3Q7CisKKyAgICBib29sIGZpbmROZXh0U3RyaW5nKGNvbnN0IFdU
Rjo6U3RyaW5nJiwgYm9vbCk7CisgICAgYm9vbCBzZWxlY3Rpb25Db250YWlucyhjb25zdCBXZWJD
b3JlOjpJbnRQb2ludCYpOworCisgICAgdm9pZCBzZXRTZWxlY3Rpb24oY29uc3QgV2ViQ29yZTo6
SW50UG9pbnQmIHN0YXJ0LCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgZW5kKTsKKyAgICB2b2lk
IHNlbGVjdEF0UG9pbnQoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmKTsKKyAgICB2b2lkIHNlbGVj
dE9iamVjdChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYsIFdlYkNvcmU6OlRleHRHcmFudWxhcml0
eSk7CisgICAgdm9pZCBzZWxlY3RPYmplY3QoV2ViQ29yZTo6VGV4dEdyYW51bGFyaXR5KTsKKyAg
ICB2b2lkIHNlbGVjdE9iamVjdChXZWJDb3JlOjpOb2RlKik7CisKKyAgICB2b2lkIHNlbGVjdGlv
blBvc2l0aW9uQ2hhbmdlZChib29sIHZpc3VhbENoYW5nZU9ubHkgPSBmYWxzZSk7CisKKyAgICB2
b2lkIHNldENhcmV0UG9zaXRpb24oY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmKTsKKyAgICB2b2lk
IGNhcmV0UG9zaXRpb25DaGFuZ2VkKCk7CisKKyAgICBib29sIGxhc3RVcGRhdGVkRW5kUG9pbnRJ
c1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbV9sYXN0VXBkYXRlZEVuZFBvaW50SXNWYWxpZDsgfQor
cHJpdmF0ZToKKyAgICB2b2lkIGdldENvbnNvbGlkYXRlZFJlZ2lvbk9mVGV4dFF1YWRzRm9yU2Vs
ZWN0aW9uKGNvbnN0IFdlYkNvcmU6OlZpc2libGVTZWxlY3Rpb24mLCBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6SW50UmVjdFJlZ2lvbiYpIGNvbnN0OworICAgIHZvaWQgY2xpcFJlZ2lvblRvVmlzaWJs
ZUNvbnRhaW5lcihCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiYpOworICAgIGJv
b2wgdXBkYXRlT3JIYW5kbGVJbnB1dFNlbGVjdGlvbihXZWJDb3JlOjpWaXNpYmxlU2VsZWN0aW9u
JiBuZXdTZWxlY3Rpb24sIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiByZWxhdGl2ZVN0YXJ0Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgY29uc3QgV2ViQ29yZTo6SW50
UG9pbnQmIHJlbGF0aXZlRW5kKTsKKyAgICBXZWJDb3JlOjpOb2RlKiBET01Db250YWluZXJOb2Rl
Rm9yVmlzaWJsZVBvc2l0aW9uKGNvbnN0IFdlYkNvcmU6OlZpc2libGVQb3NpdGlvbiYpIGNvbnN0
OworICAgIGJvb2wgc2hvdWxkVXBkYXRlU2VsZWN0aW9uT3JDYXJldEZvclBvaW50KGNvbnN0IFdl
YkNvcmU6OkludFBvaW50JiwgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYsIGJvb2wgc3RhcnRDYXJl
dCA9IHRydWUpIGNvbnN0OworICAgIHVuc2lnbmVkIHNob3J0IGV4dGVuZFNlbGVjdGlvblRvRmll
bGRCb3VuZGFyeShib29sIGlzU3RhcnRIYW5kbGUsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBz
ZWxlY3Rpb25Qb2ludCwgV2ViQ29yZTo6VmlzaWJsZVNlbGVjdGlvbiYgbmV3U2VsZWN0aW9uKTsK
KworICAgIFdlYlBhZ2VQcml2YXRlKiBtX3dlYlBhZ2U7CisKKyAgICBib29sIG1fc2VsZWN0aW9u
QWN0aXZlOworICAgIGJvb2wgbV9jYXJldEFjdGl2ZTsKKyAgICBib29sIG1fbGFzdFVwZGF0ZWRF
bmRQb2ludElzVmFsaWQ7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb24g
bV9sYXN0U2VsZWN0aW9uUmVnaW9uOworfTsKKworfQorfQorCisjZW5kaWYgLy8gU2VsZWN0aW9u
SGFuZGxlcl9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126786</attachid>
            <date>2012-02-13 09:46:04 -0800</date>
            <delta_ts>2012-02-13 12:48:53 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78136-20120213124333.patch</filename>
            <type>text/plain</type>
            <size>47612</size>
            <attacher name="Nima Ghanavatian">nima.ghanavatian</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3MTEzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDljM2E2NmRhNThjMjhhYjI5
YzQwMjQ5YzBhNTcwYTg2YTA1N2IwNTIuLjVkNGRiNmE1YWEzZjBjM2RhMDhlMjUwNzM0MTM5YmY3
YmNkNjJjZTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTItMDItMDggIE5pbWEgR2hh
bmF2YXRpYW4gIDxuZ2hhbmF2YXRpYW5AcmltLmNvbT4KKworICAgICAgICBJbml0aWFsIHVwc3Ry
ZWFtaW5nIG9mIHNlbGVjdGlvbiBoYW5kbGluZyBjb2RlIGZvciBCbGFja0JlcnJ5IHBvcnQKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc4MTM2CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW5pdGlhbCB1cHN0
cmVhbWluZywgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJLaXRTdXBw
b3J0L1NlbGVjdGlvbkhhbmRsZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBibGFja2JlcnJ5L1dl
YktpdFN1cHBvcnQvU2VsZWN0aW9uSGFuZGxlci5oOiBBZGRlZC4KKwogMjAxMi0wMi0wOCAgUm9i
IEJ1aXMgIDxyYnVpc0ByaW0uY29tPgogCiAgICAgICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBE
dW1wUmVuZGVyVHJlZUJsYWNrQmVycnkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2ti
ZXJyeS9XZWJLaXRTdXBwb3J0L1NlbGVjdGlvbkhhbmRsZXIuY3BwIGIvU291cmNlL1dlYktpdC9i
bGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvU2VsZWN0aW9uSGFuZGxlci5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
NDE0ZDMxMWQxOGZlZTlkMDhiMWY1NzY1NjY1OGQ0YTU4MTc4NzgwYwotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1NlbGVjdGlvbkhhbmRs
ZXIuY3BwCkBAIC0wLDAgKzEsOTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDEx
LCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAy
MTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTZWxl
Y3Rpb25IYW5kbGVyLmgiCisKKyNpbmNsdWRlICJET01TdXBwb3J0LmgiCisjaW5jbHVkZSAiRG9j
dW1lbnQuaCIKKyNpbmNsdWRlICJFZGl0b3IuaCIKKyNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIK
KyNpbmNsdWRlICJGYXRGaW5nZXJzLmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJG
cmFtZVNlbGVjdGlvbi5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxB
bmNob3JFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTEFyZWFFbGVtZW50LmgiCisjaW5jbHVkZSAi
SGl0VGVzdFJlc3VsdC5oIgorI2luY2x1ZGUgIklucHV0SGFuZGxlci5oIgorI2luY2x1ZGUgIklu
dFJlY3QuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUmVuZGVyUGFydC5oIgorI2lu
Y2x1ZGUgIlRleHRHcmFudWxhcml0eS5oIgorI2luY2x1ZGUgIlRvdWNoRXZlbnRIYW5kbGVyLmgi
CisjaW5jbHVkZSAiV2ViUGFnZS5oIgorI2luY2x1ZGUgIldlYlBhZ2VDbGllbnQuaCIKKyNpbmNs
dWRlICJXZWJQYWdlX3AuaCIKKworI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCisjaW5jbHVkZSAi
dmlzaWJsZV91bml0cy5oIgorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtSW50UmVjdFJl
Z2lvbi5oPgorCisjaW5jbHVkZSA8c3lzL2tleWNvZGVzLmg+CisKKyNkZWZpbmUgU0hPV0RFQlVH
X1NFTEVDVElPTkhBTkRMRVIgMAorCisjaWYgU0hPV0RFQlVHX1NFTEVDVElPTkhBTkRMRVIKKyNk
ZWZpbmUgREVCVUdfU0VMRUNUSU9OKHNldmVyaXR5LCBmb3JtYXQsIC4uLikgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OmxvZ0Fsd2F5cyhzZXZlcml0eSwgZm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykKKyNl
bHNlCisjZGVmaW5lIERFQlVHX1NFTEVDVElPTihzZXZlcml0eSwgZm9ybWF0LCAuLi4pCisjZW5k
aWYgLy8gU0hPV0RFQlVHX1NFTEVDVElPTkhBTkRMRVIKKwordXNpbmcgbmFtZXNwYWNlIFdlYkNv
cmU7CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworCitTZWxl
Y3Rpb25IYW5kbGVyOjpTZWxlY3Rpb25IYW5kbGVyKFdlYlBhZ2VQcml2YXRlKiBwYWdlKQorICAg
IDogbV93ZWJQYWdlKHBhZ2UpCisgICAgLCBtX3NlbGVjdGlvbkFjdGl2ZShmYWxzZSkKKyAgICAs
IG1fY2FyZXRBY3RpdmUoZmFsc2UpCisgICAgLCBtX2xhc3RVcGRhdGVkRW5kUG9pbnRJc1ZhbGlk
KGZhbHNlKQoreworfQorCitTZWxlY3Rpb25IYW5kbGVyOjp+U2VsZWN0aW9uSGFuZGxlcigpCit7
Cit9CisKK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6Y2FuY2VsU2VsZWN0aW9uKCkKK3sKKyAgICBt
X3NlbGVjdGlvbkFjdGl2ZSA9IGZhbHNlOworICAgIG1fbGFzdFNlbGVjdGlvblJlZ2lvbiA9IEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uKCk7CisKKyAgICBERUJVR19TRUxFQ1RJ
T04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlvbkhhbmRsZXI6
OmNhbmNlbFNlbGVjdGlvbiIpOworCisgICAgaWYgKG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXIt
PmlzSW5wdXRNb2RlKCkpCisgICAgICAgIG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXItPmNhbmNl
bFNlbGVjdGlvbigpOworICAgIGVsc2UKKyAgICAgICAgbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWlu
RnJhbWUoKS0+c2VsZWN0aW9uKCktPmNsZWFyKCk7Cit9CisKK1dlYlN0cmluZyBTZWxlY3Rpb25I
YW5kbGVyOjpzZWxlY3RlZFRleHQoKSBjb25zdAoreworICAgIHJldHVybiBtX3dlYlBhZ2UtPmZv
Y3VzZWRPck1haW5GcmFtZSgpLT5lZGl0b3IoKS0+c2VsZWN0ZWRUZXh0KCk7Cit9CisKK2Jvb2wg
U2VsZWN0aW9uSGFuZGxlcjo6ZmluZE5leHRTdHJpbmcoY29uc3QgV1RGOjpTdHJpbmcmIHNlYXJj
aFN0cmluZywgYm9vbCBmb3J3YXJkKQoreworICAgIGlmIChzZWFyY2hTdHJpbmcuaXNFbXB0eSgp
KSB7CisgICAgICAgIGNhbmNlbFNlbGVjdGlvbigpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgQVNTRVJUKG1fd2ViUGFnZS0+bV9wYWdlKTsKKworICAgIG1fd2ViUGFnZS0+
bV9wYWdlLT51bm1hcmtBbGxUZXh0TWF0Y2hlcygpOworCisgICAgYm9vbCByZXN1bHQgPSBtX3dl
YlBhZ2UtPm1fcGFnZS0+ZmluZFN0cmluZyhzZWFyY2hTdHJpbmcsIFdURjo6VGV4dENhc2VJbnNl
bnNpdGl2ZSwgZm9yd2FyZCA/IFdlYkNvcmU6OkZpbmREaXJlY3Rpb25Gb3J3YXJkIDogV2ViQ29y
ZTo6RmluZERpcmVjdGlvbkJhY2t3YXJkLCB0cnVlIC8qIHNob3VsZCB3cmFwICovKTsKKyAgICBp
ZiAocmVzdWx0ICYmIG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnNlbGVjdGlvbigp
LT5zZWxlY3Rpb25UeXBlKCkgPT0gVmlzaWJsZVNlbGVjdGlvbjo6Tm9TZWxlY3Rpb24pIHsKKyAg
ICAgICAgLy8gV29yZCB3YXMgZm91bmQgYnV0IGNvdWxkIG5vdCBiZSBzZWxlY3RlZCBvbiB0aGlz
IHBhZ2UuCisgICAgICAgIHJlc3VsdCA9IG1fd2ViUGFnZS0+bV9wYWdlLT5tYXJrQWxsTWF0Y2hl
c0ZvclRleHQoc2VhcmNoU3RyaW5nLCBXVEY6OlRleHRDYXNlSW5zZW5zaXRpdmUsIHRydWUgLyog
c2hvdWxkIGhpZ2hsaWdodCAqLywgMCAvKiBsaW1pdCB0byBtYXRjaCAwID0gdW5saW1pdGVkICov
KTsKKyAgICB9CisKKyAgICAvLyBEZWZvY3VzIHRoZSBpbnB1dCBmaWVsZCBpZiBvbmUgaXMgYWN0
aXZlLgorICAgIGlmIChtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpKQor
ICAgICAgICBtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5ub2RlRm9jdXNlZCgwKTsKKworICAg
IHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6Z2V0Q29uc29saWRh
dGVkUmVnaW9uT2ZUZXh0UXVhZHNGb3JTZWxlY3Rpb24oY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYg
c2VsZWN0aW9uLCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiYgcmVnaW9uKSBj
b25zdAoreworICAgIEFTU0VSVChyZWdpb24uaXNFbXB0eSgpKTsKKworICAgIGlmICghc2VsZWN0
aW9uLmlzUmFuZ2UoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKHNlbGVjdGlvbi5m
aXJzdFJhbmdlKCkpOworCisgICAgVmVjdG9yPEZsb2F0UXVhZD4gcXVhZExpc3Q7CisgICAgRE9N
U3VwcG9ydDo6dmlzaWJsZVRleHRRdWFkcygqKHNlbGVjdGlvbi5maXJzdFJhbmdlKCkpLCBxdWFk
TGlzdCwgdHJ1ZSAvKiB1c2Ugc2VsZWN0aW9uIGhlaWdodCAqLyk7CisKKyAgICBpZiAoIXF1YWRM
aXN0LmlzRW1wdHkoKSkgeworICAgICAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IG1fd2ViUGFn
ZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnZpZXcoKTsKKworICAgICAgICAvLyBmcmFtZVJlY3Qg
aXMgaW4gZnJhbWUgY29vcmRpbmF0ZXMuCisgICAgICAgIEludFJlY3QgZnJhbWVSZWN0KEludFBv
aW50KDAsIDApLCBmcmFtZVZpZXctPmNvbnRlbnRzU2l6ZSgpKTsKKworICAgICAgICAvLyBmcmFt
ZVBvc2l0aW9uIGlzIGluIG1haW4gZnJhbWUgY29vcmRpbmF0ZXMuCisgICAgICAgIEludFBvaW50
IGZyYW1lUG9zaXRpb24gPSBtX3dlYlBhZ2UtPmZyYW1lT2Zmc2V0KG1fd2ViUGFnZS0+Zm9jdXNl
ZE9yTWFpbkZyYW1lKCkpOworCisgICAgICAgIC8vIFRoZSByYW5nZXMgcmVjdCBsaXN0IGlzIGJh
c2VkIG9uIHJlbmRlciBlbGVtZW50cyBhbmQgbWF5IGluY2x1ZGUgbXVsdGlwbGUgYWRqYWNlbnQg
cmVjdHMuCisgICAgICAgIC8vIFVzZSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lv
biB0byBjb25zb2xpZGF0ZSB0aGVzZSByZWN0cyBpbnRvIGJhbmRzIGFzIHdlbGwgYXMgYSBjb250
YWluZXIgdG8gcGFzcworICAgICAgICAvLyB0byB0aGUgY2xpZW50LgorCisgICAgICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBxdWFkTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAg
SW50UmVjdCBlbmNsb3NpbmdSZWN0ID0gcXVhZExpc3RbaV0uZW5jbG9zaW5nQm91bmRpbmdCb3go
KTsKKyAgICAgICAgICAgIGVuY2xvc2luZ1JlY3QuaW50ZXJzZWN0KGZyYW1lUmVjdCk7CisgICAg
ICAgICAgICBlbmNsb3NpbmdSZWN0Lm1vdmUoZnJhbWVQb3NpdGlvbi54KCksIGZyYW1lUG9zaXRp
b24ueSgpKTsKKyAgICAgICAgICAgIHJlZ2lvbiA9IHVuaW9uUmVnaW9ucyhyZWdpb24sIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uKGVuY2xvc2luZ1JlY3QpKTsKKyAgICAgICAg
fQorICAgIH0KK30KKworc3RhdGljIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zaXRpb25Gb3JQ
b2ludElnbm9yaW5nQ2xpcHBpbmcoY29uc3QgRnJhbWUmIGZyYW1lLCBjb25zdCBJbnRQb2ludCYg
ZnJhbWVQb2ludCkKK3sKKyAgICAvLyBGcmFtZTo6dmlzaWJsZVBvc2l0aW9uQXRQb2ludCBoYXJk
LWNvZGVzIGlnbm9yZUNsaXBwaW5nPWZhbHNlIGluIHRoZQorICAgIC8vIGNhbGwgdG8gaGl0VGVz
dFJlc3VsdEF0UG9pbnQuIFRoaXMgaGFzIGEgYnVnIHdoZXJlIHNvbWUgcGFnZXMgKHN1Y2ggYXMK
KyAgICAvLyBtZXRhZmlsdGVyKSB3aWxsIHJldHVybiB0aGUgd3JvbmcgVmlzaWJsZVBvc2l0aW9u
IGZvciBwb2ludHMgdGhhdCBhcmUKKyAgICAvLyBvdXRzaWRlIHRoZSB2aXNpYmxlIHJlY3QuIFRv
IHdvcmsgYXJvdW5kIHRoZSBidWcsIHRoaXMgaXMgYSBjb3B5IG9mCisgICAgLy8gdmlzaWJsZVBv
c2l0aW9uQXRQb2ludCB3aGljaCB3aGljaCBwYXNzZXMgaWdub3JlQ2xpcHBpbmc9dHJ1ZS4KKyAg
ICAvLyBTZWUgUklNIEJ1ZyAjNDMxNS4KKyAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdCA9IGZyYW1l
LmV2ZW50SGFuZGxlcigpLT5oaXRUZXN0UmVzdWx0QXRQb2ludChmcmFtZVBvaW50LCB0cnVlIC8q
IGFsbG93U2hhZG93Q29udGVudCAqLywgdHJ1ZSAvKiBpZ25vcmVDbGlwcGluZyAqLyk7CisKKyAg
ICBOb2RlKiBub2RlID0gcmVzdWx0LmlubmVyTm9kZSgpOworICAgIGlmICghbm9kZSkKKyAgICAg
ICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOworCisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJl
ciA9IG5vZGUtPnJlbmRlcmVyKCk7CisgICAgaWYgKCFyZW5kZXJlcikKKyAgICAgICAgcmV0dXJu
IFZpc2libGVQb3NpdGlvbigpOworCisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3MgPSBy
ZW5kZXJlci0+cG9zaXRpb25Gb3JQb2ludChyZXN1bHQubG9jYWxQb2ludCgpKTsKKyAgICBpZiAo
dmlzaWJsZVBvcy5pc051bGwoKSkKKyAgICAgICAgdmlzaWJsZVBvcyA9IFZpc2libGVQb3NpdGlv
bihQb3NpdGlvbihjcmVhdGVMZWdhY3lFZGl0aW5nUG9zaXRpb24obm9kZSwgMCkpKTsKKworICAg
IHJldHVybiB2aXNpYmxlUG9zOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZGlyZWN0aW9u
T2ZQb2ludFJlbGF0aXZlVG9SZWN0KGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBwb2ludCwgY29u
c3QgV2ViQ29yZTo6SW50UmVjdCYgcmVjdCkKK3sKKyAgICBBU1NFUlQoIXJlY3QuY29udGFpbnMo
cG9pbnQpKTsKKworICAgIC8vIFBhZGRpbmcgdG8gcHJldmVudCBhY2NpZGVudGFsIHRyaWdnZXIg
b2YgdXAvZG93biB3aGVuIGludGVuZGluZyB0byBkbyBob3Jpem9udGFsIG1vdmVtZW50LgorICAg
IGNvbnN0IGludCB2ZXJ0aWNhbFBhZGRpbmcgPSA1OworCisgICAgLy8gRG8gaGVpZ2h0IG1vdmVt
ZW50IGNoZWNrIGZpcnN0IGJ1dCBhZGQgcGFkZGluZy4gV2UgbWF5IGJlIG9mZiBvbiBib3RoIHgg
JiB5IGF4aXMgYW5kIG9ubHkKKyAgICAvLyB3YW50IHRvIG1vdmUgaW4gb25lIGRpcmVjdGlvbiBh
dCBhIHRpbWUuCisgICAgaWYgKHBvaW50LnkoKSArIHZlcnRpY2FsUGFkZGluZyA8IHJlY3QueSgp
KQorICAgICAgICByZXR1cm4gS0VZQ09ERV9VUDsKKyAgICBpZiAocG9pbnQueSgpID4gcmVjdC5t
YXhZKCkgKyB2ZXJ0aWNhbFBhZGRpbmcpCisgICAgICAgIHJldHVybiBLRVlDT0RFX0RPV047Cisg
ICAgaWYgKHBvaW50LngoKSA8IHJlY3QubG9jYXRpb24oKS54KCkpCisgICAgICAgIHJldHVybiBL
RVlDT0RFX0xFRlQ7CisgICAgaWYgKHBvaW50LngoKSA+IHJlY3QubWF4WCgpKQorICAgICAgICBy
ZXR1cm4gS0VZQ09ERV9SSUdIVDsKKworICAgIHJldHVybiAwOworfQorCitib29sIFNlbGVjdGlv
bkhhbmRsZXI6OnNob3VsZFVwZGF0ZVNlbGVjdGlvbk9yQ2FyZXRGb3JQb2ludChjb25zdCBXZWJD
b3JlOjpJbnRQb2ludCYgcG9pbnQsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIGNhcmV0UmVjdCwg
Ym9vbCBzdGFydENhcmV0KSBjb25zdAoreworICAgIEFTU0VSVChtX3dlYlBhZ2UtPm1faW5wdXRI
YW5kbGVyLT5pc0lucHV0TW9kZSgpKTsKKworICAgIC8vIElmIHRoZSBwb2ludCBpc24ndCB2YWxp
ZCBkb24ndCBibG9jayBjaGFuZ2UgYXMgaXQgaXMgbm90IGFjdHVhbGx5IGNoYW5naW5nLgorICAg
IGlmIChwb2ludCA9PSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQpCisgICAgICAgIHJldHVybiB0
cnVlOworCisgICAgVmlzaWJsZVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gbV93ZWJQYWdl
LT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+c2VsZWN0aW9uKCktPnNlbGVjdGlvbigpOworCisgICAg
Ly8gSWYgdGhlIGlucHV0IGZpZWxkIGlzIHNpbmdsZSBsaW5lIG9yIHdlIGFyZSBvbiB0aGUgZmly
c3Qgb3IgbGFzdAorICAgIC8vIGxpbmUgb2YgYSBtdWx0aWxpbmUgaW5wdXQgZmllbGQgb25seSBo
b3Jpem9udGFsIG1vdmVtZW50IGlzIHN1cHBvcnRlZC4KKyAgICBib29sIGFib3ZlQ2FyZXQgPSBw
b2ludC55KCkgPCBjYXJldFJlY3QueSgpOworICAgIGJvb2wgYmVsb3dDYXJldCA9IHBvaW50Lnko
KSA+PSBjYXJldFJlY3QubWF4WSgpOworCisgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJTZWxlY3Rpb25IYW5kbGVyOjpzaG91bGRVcGRhdGVT
ZWxlY3Rpb25PckNhcmV0Rm9yUG9pbnQgbXVsdGlsaW5lID0gJXMgYWJvdmUgPSAlcyBiZWxvdyA9
ICVzIGZpcnN0IGxpbmUgPSAlcyBsYXN0IGxpbmUgPSAlcyBzdGFydCA9ICVzIFxuIgorICAgICAg
ICAgICAgLCBtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc011bHRpbGluZUlucHV0TW9kZSgp
ID8gInRydWUiIDogImZhbHNlIiwgYWJvdmVDYXJldCA/ICJ0cnVlIiA6ICJmYWxzZSIsIGJlbG93
Q2FyZXQgPyAidHJ1ZSIgOiAiZmFsc2UiCisgICAgICAgICAgICAsIGluU2FtZUxpbmUoY3VycmVu
dFNlbGVjdGlvbi52aXNpYmxlU3RhcnQoKSwgc3RhcnRPZkVkaXRhYmxlQ29udGVudChjdXJyZW50
U2VsZWN0aW9uLnZpc2libGVTdGFydCgpKSkgPyAidHJ1ZSIgOiAiZmFsc2UiCisgICAgICAgICAg
ICAsIGluU2FtZUxpbmUoY3VycmVudFNlbGVjdGlvbi52aXNpYmxlRW5kKCksIGVuZE9mRWRpdGFi
bGVDb250ZW50KGN1cnJlbnRTZWxlY3Rpb24udmlzaWJsZUVuZCgpKSkgPyAidHJ1ZSIgOiAiZmFs
c2UiCisgICAgICAgICAgICAsIHN0YXJ0Q2FyZXQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKworICAg
IGlmICghbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNNdWx0aWxpbmVJbnB1dE1vZGUoKSAm
JiAoYWJvdmVDYXJldCB8fCBiZWxvd0NhcmV0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IGlmIChzdGFydENhcmV0ICYmIGluU2FtZUxpbmUoY3VycmVudFNlbGVjdGlvbi52aXNpYmxlU3Rh
cnQoKSwgc3RhcnRPZkVkaXRhYmxlQ29udGVudChjdXJyZW50U2VsZWN0aW9uLnZpc2libGVTdGFy
dCgpKSkgJiYgYWJvdmVDYXJldCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghc3Rh
cnRDYXJldCAmJiBpblNhbWVMaW5lKGN1cnJlbnRTZWxlY3Rpb24udmlzaWJsZUVuZCgpLCBlbmRP
ZkVkaXRhYmxlQ29udGVudChjdXJyZW50U2VsZWN0aW9uLnZpc2libGVFbmQoKSkpICYmIGJlbG93
Q2FyZXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2
b2lkIFNlbGVjdGlvbkhhbmRsZXI6OnNldENhcmV0UG9zaXRpb24oY29uc3QgV2ViQ29yZTo6SW50
UG9pbnQgJnBvc2l0aW9uKQoreworICAgIGlmICghbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+
aXNJbnB1dE1vZGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9jYXJldEFjdGl2ZSA9IHRy
dWU7CisKKyAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVs
SW5mbywgIlNlbGVjdGlvbkhhbmRsZXI6OnNldENhcmV0UG9zaXRpb24gcmVxdWVzdGVkIHBvaW50
ICVkLCAlZCIsIHBvc2l0aW9uLngoKSwgcG9zaXRpb24ueSgpKTsKKworICAgIEZyYW1lKiBmb2N1
c2VkRnJhbWUgPSBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIEZyYW1lU2Vs
ZWN0aW9uKiBjb250cm9sbGVyID0gZm9jdXNlZEZyYW1lLT5zZWxlY3Rpb24oKTsKKyAgICBJbnRQ
b2ludCByZWxhdGl2ZVBvaW50ID0gRE9NU3VwcG9ydDo6Y29udmVydFBvaW50VG9GcmFtZShtX3dl
YlBhZ2UtPm1haW5GcmFtZSgpLCBmb2N1c2VkRnJhbWUsIHBvc2l0aW9uKTsKKyAgICBJbnRSZWN0
IGN1cnJlbnRDYXJldFJlY3QgPSBjb250cm9sbGVyLT5zZWxlY3Rpb24oKS52aXNpYmxlU3RhcnQo
KS5hYnNvbHV0ZUNhcmV0Qm91bmRzKCk7CisKKyAgICBpZiAocmVsYXRpdmVQb2ludCA9PSBET01T
dXBwb3J0OjpJbnZhbGlkUG9pbnQgfHwgIXNob3VsZFVwZGF0ZVNlbGVjdGlvbk9yQ2FyZXRGb3JQ
b2ludChyZWxhdGl2ZVBvaW50LCBjdXJyZW50Q2FyZXRSZWN0KSkgeworICAgICAgICBzZWxlY3Rp
b25Qb3NpdGlvbkNoYW5nZWQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZpc2li
bGVQb3NpdGlvbiB2aXNpYmxlQ2FyZXRQb3NpdGlvbihmb2N1c2VkRnJhbWUtPnZpc2libGVQb3Np
dGlvbkZvclBvaW50KHJlbGF0aXZlUG9pbnQpKTsKKworICAgIGlmICghRE9NU3VwcG9ydDo6aXNQ
b3NpdGlvbkluTm9kZShtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5kb2N1bWVudCgp
LT5mb2N1c2VkTm9kZSgpLCB2aXNpYmxlQ2FyZXRQb3NpdGlvbi5kZWVwRXF1aXZhbGVudCgpKSkg
eworICAgICAgICBpZiAodW5zaWduZWQgc2hvcnQgY2hhcmFjdGVyID0gZGlyZWN0aW9uT2ZQb2lu
dFJlbGF0aXZlVG9SZWN0KHJlbGF0aXZlUG9pbnQsIGN1cnJlbnRDYXJldFJlY3QpKQorICAgICAg
ICAgICAgbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aGFuZGxlTmF2aWdhdGlvbk1vdmUoY2hh
cmFjdGVyLCBmYWxzZSAvKiBzaGlmdERvd24gKi8sIGZhbHNlIC8qIGFsdERvd24gKi8sIGZhbHNl
IC8qIGNhbkV4aXRGaWVsZCAqLyk7CisKKyAgICAgICAgc2VsZWN0aW9uUG9zaXRpb25DaGFuZ2Vk
KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWaXNpYmxlU2VsZWN0aW9uIG5ld1Nl
bGVjdGlvbih2aXNpYmxlQ2FyZXRQb3NpdGlvbik7CisgICAgaWYgKGNvbnRyb2xsZXItPnNlbGVj
dGlvbigpID09IG5ld1NlbGVjdGlvbikgeworICAgICAgICBzZWxlY3Rpb25Qb3NpdGlvbkNoYW5n
ZWQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnRyb2xsZXItPnNldFNlbGVj
dGlvbihuZXdTZWxlY3Rpb24pOworCisgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpMb2dMZXZlbEluZm8sICJTZWxlY3Rpb25IYW5kbGVyOjpzZXRDYXJldFBvc2l0aW9u
IHBvaW50IHZhbGlkLCBjdXJzb3IgdXBkYXRlZCIpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIG1h
a2VzIHN1cmUgd2UgYXJlIG5vdCByZWR1Y2luZyB0aGUgc2VsZWN0aW9uIHRvIGEgY2FyZXQgc2Vs
ZWN0aW9uLgorc3RhdGljIGJvb2wgc2hvdWxkRXh0ZW5kU2VsZWN0aW9uSW5EaXJlY3Rpb24oY29u
c3QgVmlzaWJsZVNlbGVjdGlvbiYgc2VsZWN0aW9uLCB1bnNpZ25lZCBzaG9ydCBjaGFyYWN0ZXIp
Cit7CisgICAgRnJhbWVTZWxlY3Rpb24gdGVtcFNlbGVjdGlvbjsKKyAgICB0ZW1wU2VsZWN0aW9u
LnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOworICAgIHN3aXRjaCAoY2hhcmFjdGVyKSB7CisgICAg
Y2FzZSBLRVlDT0RFX0xFRlQ6CisgICAgICAgIHRlbXBTZWxlY3Rpb24ubW9kaWZ5KEZyYW1lU2Vs
ZWN0aW9uOjpBbHRlcmF0aW9uRXh0ZW5kLCBEaXJlY3Rpb25MZWZ0LCBDaGFyYWN0ZXJHcmFudWxh
cml0eSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0VZQ09ERV9SSUdIVDoKKyAgICAgICAg
dGVtcFNlbGVjdGlvbi5tb2RpZnkoRnJhbWVTZWxlY3Rpb246OkFsdGVyYXRpb25FeHRlbmQsIERp
cmVjdGlvblJpZ2h0LCBDaGFyYWN0ZXJHcmFudWxhcml0eSk7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgS0VZQ09ERV9VUDoKKyAgICAgICAgdGVtcFNlbGVjdGlvbi5tb2RpZnkoRnJhbWVTZWxl
Y3Rpb246OkFsdGVyYXRpb25FeHRlbmQsIERpcmVjdGlvbkJhY2t3YXJkLCBMaW5lR3JhbnVsYXJp
dHkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtFWUNPREVfRE9XTjoKKyAgICAgICAgdGVt
cFNlbGVjdGlvbi5tb2RpZnkoRnJhbWVTZWxlY3Rpb246OkFsdGVyYXRpb25FeHRlbmQsIERpcmVj
dGlvbkZvcndhcmQsIExpbmVHcmFudWxhcml0eSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1
bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICgoY2hhcmFjdGVyID09IEtFWUNP
REVfTEVGVCB8fCBjaGFyYWN0ZXIgPT0gS0VZQ09ERV9SSUdIVCkKKyAgICAgICAgJiYgKCFpblNh
bWVMaW5lKHNlbGVjdGlvbi52aXNpYmxlU3RhcnQoKSwgdGVtcFNlbGVjdGlvbi5zZWxlY3Rpb24o
KS52aXNpYmxlU3RhcnQoKSkKKyAgICAgICAgICAgfHwgIWluU2FtZUxpbmUoc2VsZWN0aW9uLnZp
c2libGVFbmQoKSwgdGVtcFNlbGVjdGlvbi5zZWxlY3Rpb24oKS52aXNpYmxlRW5kKCkpKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRlbXBTZWxlY3Rpb24uc2VsZWN0aW9u
KCkuc2VsZWN0aW9uVHlwZSgpID09IFZpc2libGVTZWxlY3Rpb246OlJhbmdlU2VsZWN0aW9uOwor
fQorCitzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIGRpcmVjdGlvbmFsVmlzaWJsZVBvc2l0aW9uQXRF
eHRlbnRPZkJveChGcmFtZSogZnJhbWUsIGNvbnN0IEludFJlY3QmIGJvdW5kaW5nQm94LCB1bnNp
Z25lZCBzaG9ydCBkaXJlY3Rpb24sIGNvbnN0IEludFBvaW50JiBiYXNlUG9pbnQpCit7CisgICAg
QVNTRVJUKGZyYW1lKTsKKworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBWaXNpYmxl
UG9zaXRpb24oKTsKKworICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7CisgICAgY2FzZSBLRVlDT0RF
X0xFRlQ6CisgICAgICAgIC8vIEV4dGVuZCB4IHRvIHN0YXJ0IHdpdGhvdXQgbW9kaWZ5aW5nIHku
CisgICAgICAgIHJldHVybiBmcmFtZS0+dmlzaWJsZVBvc2l0aW9uRm9yUG9pbnQoSW50UG9pbnQo
Ym91bmRpbmdCb3gueCgpLCBiYXNlUG9pbnQueSgpKSk7CisgICAgY2FzZSBLRVlDT0RFX1JJR0hU
OgorICAgICAgICAvLyBFeHRlbmQgeCB0byBlbmQgd2l0aG91dCBtb2RpZnlpbmcgeS4KKyAgICAg
ICAgcmV0dXJuIGZyYW1lLT52aXNpYmxlUG9zaXRpb25Gb3JQb2ludChJbnRQb2ludChib3VuZGlu
Z0JveC5tYXhYKCksIGJhc2VQb2ludC55KCkpKTsKKyAgICBjYXNlIEtFWUNPREVfVVA6CisgICAg
ICAgIC8vIEV4dGVuZCB5IHRvIHRvcCB3aXRob3V0IG1vZGlmeWluZyB4LgorICAgICAgICByZXR1
cm4gZnJhbWUtPnZpc2libGVQb3NpdGlvbkZvclBvaW50KEludFBvaW50KGJhc2VQb2ludC54KCks
IGJvdW5kaW5nQm94LnkoKSkpOworICAgIGNhc2UgS0VZQ09ERV9ET1dOOgorICAgICAgICAvLyBF
eHRlbmQgeCB0byBib3R0b20gd2l0aG91dCBtb2RpZnlpbmcgeC4KKyAgICAgICAgcmV0dXJuIGZy
YW1lLT52aXNpYmxlUG9zaXRpb25Gb3JQb2ludChJbnRQb2ludChiYXNlUG9pbnQueCgpLCBib3Vu
ZGluZ0JveC5tYXhZKCkpKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisK
KyAgICByZXR1cm4gZnJhbWUtPnZpc2libGVQb3NpdGlvbkZvclBvaW50KEludFBvaW50KGJhc2VQ
b2ludC54KCksIGJhc2VQb2ludC55KCkpKTsKK30KKworc3RhdGljIGJvb2wgcG9pbnRJc091dHNp
ZGVPZkJvdW5kaW5nQm94SW5EaXJlY3Rpb24odW5zaWduZWQgZGlyZWN0aW9uLCBjb25zdCBXZWJD
b3JlOjpJbnRQb2ludCYgc2VsZWN0aW9uUG9pbnQsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIGJv
dW5kaW5nQm94KQoreworICAgIGlmICgoZGlyZWN0aW9uID09IEtFWUNPREVfTEVGVCAmJiBzZWxl
Y3Rpb25Qb2ludC54KCkgPCBib3VuZGluZ0JveC54KCkpCisgICAgICAgIHx8IChkaXJlY3Rpb24g
PT0gS0VZQ09ERV9VUCAmJiBzZWxlY3Rpb25Qb2ludC55KCkgPCBib3VuZGluZ0JveC55KCkpCisg
ICAgICAgIHx8IChkaXJlY3Rpb24gPT0gS0VZQ09ERV9SSUdIVCAmJiBzZWxlY3Rpb25Qb2ludC54
KCkgPiBib3VuZGluZ0JveC5tYXhYKCkpCisgICAgICAgIHx8IChkaXJlY3Rpb24gPT0gS0VZQ09E
RV9ET1dOICYmIHNlbGVjdGlvblBvaW50LnkoKSA+IGJvdW5kaW5nQm94Lm1heFkoKSkpCisgICAg
ICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCit1bnNpZ25lZCBzaG9y
dCBTZWxlY3Rpb25IYW5kbGVyOjpleHRlbmRTZWxlY3Rpb25Ub0ZpZWxkQm91bmRhcnkoYm9vbCBp
c1N0YXJ0SGFuZGxlLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgc2VsZWN0aW9uUG9pbnQsIFdl
YkNvcmU6OlZpc2libGVTZWxlY3Rpb24mIG5ld1NlbGVjdGlvbikKK3sKKyAgICBGcmFtZSogZm9j
dXNlZEZyYW1lID0gbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICBpZiAoIWZv
Y3VzZWRGcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKSB8fCAhZm9jdXNlZEZyYW1lLT5k
b2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpLT5yZW5kZXJlcigpKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIEZyYW1lU2VsZWN0aW9uKiBjb250cm9sbGVyID0gZm9jdXNlZEZyYW1lLT5zZWxlY3Rp
b24oKTsKKworICAgIEludFJlY3QgY2FyZXRSZWN0ID0gaXNTdGFydEhhbmRsZSA/IGNvbnRyb2xs
ZXItPnNlbGVjdGlvbigpLnZpc2libGVTdGFydCgpLmFic29sdXRlQ2FyZXRCb3VuZHMoKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbnRyb2xsZXItPnNlbGVjdGlv
bigpLnZpc2libGVFbmQoKS5hYnNvbHV0ZUNhcmV0Qm91bmRzKCk7CisKKyAgICBJbnRSZWN0IG5v
ZGVCb3VuZGluZ0JveCA9IGZvY3VzZWRGcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKS0+
cmVuZGVyZXIoKS0+YWJzb2x1dGVCb3VuZGluZ0JveFJlY3QoKTsKKworICAgIC8vIFN0YXJ0IGhh
bmRsZSBpcyBvdXRzaWRlIG9mIHRoZSBmaWVsZC4gVHJlYXQgaXQgYXMgdGhlIGNoYW5nZWQgaGFu
ZGxlIGFuZCBtb3ZlCisgICAgLy8gcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IGNhcmV0IHJlY3QuCisg
ICAgdW5zaWduZWQgc2hvcnQgY2hhcmFjdGVyID0gZGlyZWN0aW9uT2ZQb2ludFJlbGF0aXZlVG9S
ZWN0KHNlbGVjdGlvblBvaW50LCBjYXJldFJlY3QpOworCisgICAgLy8gUHJldmVudCBpbmNvcnJl
Y3QgbW92ZW1lbnQsIGhhbmRsZXMgY2FuIG9ubHkgZXh0ZW5kIHRoZSBzZWxlY3Rpb24gdGhpcyB3
YXkKKyAgICAvLyB0byBwcmV2ZW50IGludmVyc2lvbiBvZiB0aGUgaGFuZGxlcy4KKyAgICBpZiAo
aXNTdGFydEhhbmRsZSAmJiAoY2hhcmFjdGVyID09IEtFWUNPREVfUklHSFQgfHwgY2hhcmFjdGVy
ID09IEtFWUNPREVfRE9XTikKKyAgICAgICAgfHwgIWlzU3RhcnRIYW5kbGUgJiYgKGNoYXJhY3Rl
ciA9PSBLRVlDT0RFX0xFRlQgfHwgY2hhcmFjdGVyID09IEtFWUNPREVfVVApKQorICAgICAgICBj
aGFyYWN0ZXIgPSAwOworCisgICAgV2ViQ29yZTo6VmlzaWJsZVBvc2l0aW9uIG5ld1Zpc2libGVQ
b3NpdGlvbiA9IGNvbnRyb2xsZXItPnNlbGVjdGlvbigpLnN0YXJ0KCk7CisgICAgLy8gRXh0ZW5k
IHRoZSBzZWxlY3Rpb24gdG8gdGhlIGJvdW5kcyBvZiB0aGUgYm94IGJlZm9yZSBkb2luZyBpbmNy
ZW1lbnRhbCBzY3JvbGwgaWYgdGhlIHBvaW50IGlzIG91dHNpZGUgdGhlIG5vZGUuCisgICAgLy8g
RG9uJ3QgZXh0ZW5kIHNlbGVjdGlvbiBhbmQgaGFuZGxlIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNh
bWUgdGltZS4KKyAgICBpZiAocG9pbnRJc091dHNpZGVPZkJvdW5kaW5nQm94SW5EaXJlY3Rpb24o
Y2hhcmFjdGVyLCBzZWxlY3Rpb25Qb2ludCwgbm9kZUJvdW5kaW5nQm94KSkKKyAgICAgICAgbmV3
VmlzaWJsZVBvc2l0aW9uID0gZGlyZWN0aW9uYWxWaXNpYmxlUG9zaXRpb25BdEV4dGVudE9mQm94
KGZvY3VzZWRGcmFtZSwgbm9kZUJvdW5kaW5nQm94LCBjaGFyYWN0ZXIsIHNlbGVjdGlvblBvaW50
KTsKKworICAgIGlmIChpc1N0YXJ0SGFuZGxlKQorICAgICAgICBuZXdTZWxlY3Rpb24gPSBWaXNp
YmxlU2VsZWN0aW9uKG5ld1Zpc2libGVQb3NpdGlvbiwgbmV3U2VsZWN0aW9uLnZpc2libGVFbmQo
KSwgdHJ1ZSAvKmlzRGlyZWN0aW9uYWwqLyk7CisgICAgZWxzZQorICAgICAgICBuZXdTZWxlY3Rp
b24gPSBWaXNpYmxlU2VsZWN0aW9uKG5ld1NlbGVjdGlvbi52aXNpYmxlU3RhcnQoKSwgbmV3Vmlz
aWJsZVBvc2l0aW9uLCB0cnVlIC8qaXNEaXJlY3Rpb25hbCovKTsKKworICAgIC8vIElmIG5vIHNl
bGVjdGlvbiB3aWxsIGJlIGNoYW5nZWQsIHJldHVybiB0aGUgY2hhcmFjdGVyIHRvIGV4dGVuZCB1
c2luZyBuYXZpZ2F0aW9uLgorICAgIGlmIChjb250cm9sbGVyLT5zZWxlY3Rpb24oKSA9PSBuZXdT
ZWxlY3Rpb24pCisgICAgICAgIHJldHVybiBjaGFyYWN0ZXI7CisKKyAgICAvLyBTZWxlY3Rpb24g
aGFzIGJlZW4gdXBkYXRlZC4KKyAgICByZXR1cm4gMDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlm
IGhhbmRsZWQuCitib29sIFNlbGVjdGlvbkhhbmRsZXI6OnVwZGF0ZU9ySGFuZGxlSW5wdXRTZWxl
Y3Rpb24oV2ViQ29yZTo6VmlzaWJsZVNlbGVjdGlvbiYgbmV3U2VsZWN0aW9uLCBjb25zdCBXZWJD
b3JlOjpJbnRQb2ludCYgcmVsYXRpdmVTdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICwgY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIHJlbGF0
aXZlRW5kKQoreworICAgIEFTU0VSVChtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0
TW9kZSgpKTsKKworICAgIEZyYW1lKiBmb2N1c2VkRnJhbWUgPSBtX3dlYlBhZ2UtPmZvY3VzZWRP
ck1haW5GcmFtZSgpOworICAgIE5vZGUqIGZvY3VzZWROb2RlID0gZm9jdXNlZEZyYW1lLT5kb2N1
bWVudCgpLT5mb2N1c2VkTm9kZSgpOworICAgIGlmICghZm9jdXNlZE5vZGUgfHwgIWZvY3VzZWRO
b2RlLT5yZW5kZXJlcigpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBGcmFtZVNlbGVj
dGlvbiogY29udHJvbGxlciA9IGZvY3VzZWRGcmFtZS0+c2VsZWN0aW9uKCk7CisKKyAgICBJbnRS
ZWN0IGN1cnJlbnRTdGFydENhcmV0UmVjdCA9IGNvbnRyb2xsZXItPnNlbGVjdGlvbigpLnZpc2li
bGVTdGFydCgpLmFic29sdXRlQ2FyZXRCb3VuZHMoKTsKKyAgICBJbnRSZWN0IGN1cnJlbnRFbmRD
YXJldFJlY3QgPSBjb250cm9sbGVyLT5zZWxlY3Rpb24oKS52aXNpYmxlRW5kKCkuYWJzb2x1dGVD
YXJldEJvdW5kcygpOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIGhhbmRsZSBtb3ZlbWVudCBpcyB2
YWxpZC4KKyAgICBpZiAoIXNob3VsZFVwZGF0ZVNlbGVjdGlvbk9yQ2FyZXRGb3JQb2ludChyZWxh
dGl2ZVN0YXJ0LCBjdXJyZW50U3RhcnRDYXJldFJlY3QsIHRydWUgLyogc3RhcnRDYXJldCAqLykK
KyAgICAgICAgfHwgIXNob3VsZFVwZGF0ZVNlbGVjdGlvbk9yQ2FyZXRGb3JQb2ludChyZWxhdGl2
ZUVuZCwgY3VycmVudEVuZENhcmV0UmVjdCwgZmFsc2UgLyogc3RhcnRDYXJldCAqLykpIHsKKyAg
ICAgICAgc2VsZWN0aW9uUG9zaXRpb25DaGFuZ2VkKCk7CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKworICAgIEludFJlY3Qgbm9kZUJvdW5kaW5nQm94ID0gZm9jdXNlZE5vZGUtPnJlbmRl
cmVyKCktPmFic29sdXRlQm91bmRpbmdCb3hSZWN0KCk7CisKKyAgICAvLyBPbmx5IGRvIHNwZWNp
YWwgaGFuZGxpbmcgaWYgb25lIGhhbmRsZSBpcyBvdXRzaWRlIG9mIHRoZSBub2RlLgorICAgIGJv
b2wgc3RhcnRJc091dHNpZGVPZkZpZWxkID0gcmVsYXRpdmVTdGFydCAhPSBET01TdXBwb3J0OjpJ
bnZhbGlkUG9pbnQgJiYgIW5vZGVCb3VuZGluZ0JveC5jb250YWlucyhyZWxhdGl2ZVN0YXJ0KTsK
KyAgICBib29sIGVuZElzT3V0c2lkZU9mRmllbGQgPSByZWxhdGl2ZUVuZCAhPSBET01TdXBwb3J0
OjpJbnZhbGlkUG9pbnQgJiYgIW5vZGVCb3VuZGluZ0JveC5jb250YWlucyhyZWxhdGl2ZUVuZCk7
CisgICAgaWYgKHN0YXJ0SXNPdXRzaWRlT2ZGaWVsZCAmJiBlbmRJc091dHNpZGVPZkZpZWxkKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCBzaG9ydCBjaGFyYWN0ZXIgPSAw
OworICAgIGlmIChzdGFydElzT3V0c2lkZU9mRmllbGQpIHsKKyAgICAgICAgY2hhcmFjdGVyID0g
ZXh0ZW5kU2VsZWN0aW9uVG9GaWVsZEJvdW5kYXJ5KHRydWUgLyogaXNTdGFydEhhbmRsZSAqLywg
cmVsYXRpdmVTdGFydCwgbmV3U2VsZWN0aW9uKTsKKyAgICAgICAgaWYgKGNoYXJhY3Rlcikgewor
ICAgICAgICAgICAgLy8gSW52ZXJ0IHRoZSBzZWxlY3Rpb24gc28gdGhhdCB0aGUgY3Vyc29yIHBv
aW50IGlzIGF0IHRoZSBiZWdpbm5pbmcuCisgICAgICAgICAgICBjb250cm9sbGVyLT5zZXRTZWxl
Y3Rpb24oVmlzaWJsZVNlbGVjdGlvbihjb250cm9sbGVyLT5zZWxlY3Rpb24oKS5lbmQoKSwgY29u
dHJvbGxlci0+c2VsZWN0aW9uKCkuc3RhcnQoKSkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlm
IChlbmRJc091dHNpZGVPZkZpZWxkKSB7CisgICAgICAgIGNoYXJhY3RlciA9IGV4dGVuZFNlbGVj
dGlvblRvRmllbGRCb3VuZGFyeShmYWxzZSAvKiBpc1N0YXJ0SGFuZGxlICovLCByZWxhdGl2ZUVu
ZCwgbmV3U2VsZWN0aW9uKTsKKyAgICAgICAgaWYgKGNoYXJhY3RlcikgeworICAgICAgICAgICAg
Ly8gUmVzZXQgdGhlIHNlbGVjdGlvbiBzbyB0aGF0IHRoZSBlbmQgaXMgdGhlIGVkaXQgcG9pbnQu
CisgICAgICAgICAgICBjb250cm9sbGVyLT5zZXRTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbihj
b250cm9sbGVyLT5zZWxlY3Rpb24oKS5zdGFydCgpLCBjb250cm9sbGVyLT5zZWxlY3Rpb24oKS5l
bmQoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjaGFyYWN0ZXIpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIERFQlVHX1NFTEVDVElPTihCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6TG9nTGV2ZWxJbmZvLCAiU2VsZWN0aW9uSGFuZGxlcjo6c2V0U2VsZWN0aW9uIG1ha2luZyBz
ZWxlY3Rpb24gY2hhbmdlIGF0dGVtcHQgdXNpbmcgbmF2aWdhdGlvbiIpOworCisgICAgaWYgKHNo
b3VsZEV4dGVuZFNlbGVjdGlvbkluRGlyZWN0aW9uKGNvbnRyb2xsZXItPnNlbGVjdGlvbigpLCBj
aGFyYWN0ZXIpKQorICAgICAgICBtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5oYW5kbGVOYXZp
Z2F0aW9uTW92ZShjaGFyYWN0ZXIsIHRydWUgLyogc2hpZnREb3duICovLCBmYWxzZSAvKiBhbHRE
b3duICovLCBmYWxzZSAvKiBjYW5FeGl0RmllbGQgKi8pOworCisgICAgLy8gTXVzdCBzZW5kIHRo
ZSBzZWxlY3Rpb25Qb3NpdGlvbkNoYW5nZWQgZXZlcnkgdGltZSwgc29tZXRpbWVzIHRoaXMgd2ls
bCBkdXBsaWNhdGUgYnV0IGFuIGFjY2VwdGVkCisgICAgLy8gaGFuZGxlTmF2aWdhdGlvbk1vdmUg
bWF5IG5vdCBtYWtlIGFuIGFjdHVhbCBzZWxlY3Rpb24gY2hhbmdlLgorICAgIHNlbGVjdGlvblBv
c2l0aW9uQ2hhbmdlZCgpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNlbGVjdGlvbkhh
bmRsZXI6OnNldFNlbGVjdGlvbihjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgc3RhcnQsIGNvbnN0
IFdlYkNvcmU6OkludFBvaW50JiBlbmQpCit7CisgICAgbV9zZWxlY3Rpb25BY3RpdmUgPSB0cnVl
OworCisgICAgQVNTRVJUKG1fd2ViUGFnZSk7CisgICAgQVNTRVJUKG1fd2ViUGFnZS0+Zm9jdXNl
ZE9yTWFpbkZyYW1lKCkpOworICAgIEFTU0VSVChtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFt
ZSgpLT5zZWxlY3Rpb24oKSk7CisKKyAgICBGcmFtZSogZm9jdXNlZEZyYW1lID0gbV93ZWJQYWdl
LT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICBGcmFtZVNlbGVjdGlvbiogY29udHJvbGxlciA9
IGZvY3VzZWRGcmFtZS0+c2VsZWN0aW9uKCk7CisKKyAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlvbkhhbmRsZXI6OnNldFNlbGVj
dGlvbiBhZGp1c3RlZCBwb2ludHMgJWQsICVkLCAlZCwgJWQiLCBzdGFydC54KCksIHN0YXJ0Lnko
KSwgZW5kLngoKSwgZW5kLnkoKSk7CisKKyAgICAvLyBOb3RlIHRoYXQgSW50UG9pbnQoLTEsIC0x
KSBpcyBiZWluZyBvdXIgc2VudGluZWwgc28gZmFyIGZvcgorICAgIC8vIGNsaXBwZWQgb3V0IHNl
bGVjdGlvbiBzdGFydGluZyBvciBlbmRpbmcgbG9jYXRpb24uCisgICAgYm9vbCBzdGFydElzVmFs
aWQgPSBzdGFydCAhPSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQ7CisgICAgbV9sYXN0VXBkYXRl
ZEVuZFBvaW50SXNWYWxpZCA9IGVuZCAhPSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQ7CisKKyAg
ICAvLyBBdCBsZWFzdCBvbmUgb2YgdGhlIGxvY2F0aW9ucyBtdXN0IGJlIHZhbGlkLgorICAgIEFT
U0VSVChzdGFydElzVmFsaWQgfHwgbV9sYXN0VXBkYXRlZEVuZFBvaW50SXNWYWxpZCk7CisKKyAg
ICBJbnRQb2ludCByZWxhdGl2ZVN0YXJ0ID0gc3RhcnQ7CisgICAgSW50UG9pbnQgcmVsYXRpdmVF
bmQgPSBlbmQ7CisKKyAgICBWaXNpYmxlU2VsZWN0aW9uIG5ld1NlbGVjdGlvbihjb250cm9sbGVy
LT5zZWxlY3Rpb24oKSk7CisKKyAgICAvLyBXZSBuZWVkIHRoZSBzZWxlY3Rpb24gdG8gYmUgb3Jk
ZXJlZCBiYXNlIHRoZW4gZXh0ZW50LgorICAgIGlmICghY29udHJvbGxlci0+c2VsZWN0aW9uKCku
aXNCYXNlRmlyc3QoKSkKKyAgICAgICAgY29udHJvbGxlci0+c2V0U2VsZWN0aW9uKFZpc2libGVT
ZWxlY3Rpb24oY29udHJvbGxlci0+c2VsZWN0aW9uKCkuc3RhcnQoKSwgY29udHJvbGxlci0+c2Vs
ZWN0aW9uKCkuZW5kKCkpKTsKKworICAgIGlmIChzdGFydElzVmFsaWQpIHsKKyAgICAgICAgcmVs
YXRpdmVTdGFydCA9IERPTVN1cHBvcnQ6OmNvbnZlcnRQb2ludFRvRnJhbWUobV93ZWJQYWdlLT5t
YWluRnJhbWUoKSwgZm9jdXNlZEZyYW1lLCBzdGFydCk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBz
ZWxlY3Rpb24gd2l0aCB2YWxpZGF0aW9uLgorICAgICAgICBuZXdTZWxlY3Rpb24uc2V0QmFzZSh2
aXNpYmxlUG9zaXRpb25Gb3JQb2ludElnbm9yaW5nQ2xpcHBpbmcoKmZvY3VzZWRGcmFtZSwgcmVs
YXRpdmVTdGFydCkpOworCisgICAgICAgIC8vIFJlc2V0IHRoZSBzZWxlY3Rpb24gdXNpbmcgdGhl
IGV4aXN0aW5nIGV4dGVudCB3aXRob3V0IHZhbGlkYXRpb24uCisgICAgICAgIG5ld1NlbGVjdGlv
bi5zZXRXaXRob3V0VmFsaWRhdGlvbihuZXdTZWxlY3Rpb24uYmFzZSgpLCBjb250cm9sbGVyLT5z
ZWxlY3Rpb24oKS5lbmQoKSk7CisgICAgfQorCisgICAgaWYgKG1fbGFzdFVwZGF0ZWRFbmRQb2lu
dElzVmFsaWQpIHsKKyAgICAgICAgcmVsYXRpdmVFbmQgPSBET01TdXBwb3J0Ojpjb252ZXJ0UG9p
bnRUb0ZyYW1lKG1fd2ViUGFnZS0+bWFpbkZyYW1lKCksIGZvY3VzZWRGcmFtZSwgZW5kKTsKKwor
ICAgICAgICAvLyBTZXQgdGhlIHNlbGVjdGlvbiB3aXRoIHZhbGlkYXRpb24uCisgICAgICAgIG5l
d1NlbGVjdGlvbi5zZXRFeHRlbnQodmlzaWJsZVBvc2l0aW9uRm9yUG9pbnRJZ25vcmluZ0NsaXBw
aW5nKCpmb2N1c2VkRnJhbWUsIHJlbGF0aXZlRW5kKSk7CisKKyAgICAgICAgLy8gUmVzZXQgdGhl
IHNlbGVjdGlvbiB1c2luZyB0aGUgZXhpc3RpbmcgYmFzZSB3aXRob3V0IHZhbGlkYXRpb24uCisg
ICAgICAgIG5ld1NlbGVjdGlvbi5zZXRXaXRob3V0VmFsaWRhdGlvbihjb250cm9sbGVyLT5zZWxl
Y3Rpb24oKS5zdGFydCgpLCBuZXdTZWxlY3Rpb24uZXh0ZW50KCkpOworICAgIH0KKworICAgIGlm
IChtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpKSB7CisgICAgICAgIGlm
ICh1cGRhdGVPckhhbmRsZUlucHV0U2VsZWN0aW9uKG5ld1NlbGVjdGlvbiwgcmVsYXRpdmVTdGFy
dCwgcmVsYXRpdmVFbmQpKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChj
b250cm9sbGVyLT5zZWxlY3Rpb24oKSA9PSBuZXdTZWxlY3Rpb24pIHsKKyAgICAgICAgc2VsZWN0
aW9uUG9zaXRpb25DaGFuZ2VkKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJ
ZiB0aGUgc2VsZWN0aW9uIHNpemUgaXMgcmVkdWNlIHRvIGxlc3MgdGhhbiBhIGNoYXJhY3Rlciwg
c2VsZWN0aW9uIHR5cGUgYmVjb21lcworICAgIC8vIENhcmV0LiBBcyBsb25nIGFzIGl0IGlzIHN0
aWxsIGEgcmFuZ2UsIGl0J3MgYSB2YWxpZCBzZWxlY3Rpb24uIFNlbGVjdGlvbiBjYW5ub3QKKyAg
ICAvLyBiZSBjYW5jZWxsZWQgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLgorICAgIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIHJlZ2lvbjsKKyAgICBnZXRDb25zb2xpZGF0ZWRSZWdp
b25PZlRleHRRdWFkc0ZvclNlbGVjdGlvbihuZXdTZWxlY3Rpb24sIHJlZ2lvbik7CisgICAgY2xp
cFJlZ2lvblRvVmlzaWJsZUNvbnRhaW5lcihyZWdpb24pOworICAgIGlmICghcmVnaW9uLmlzRW1w
dHkoKSkgeworICAgICAgICAvLyBDaGVjayBpZiB0aGUgaGFuZGxlcyByZXZlcnNlZCBwb3NpdGlv
bi4KKyAgICAgICAgaWYgKG1fc2VsZWN0aW9uQWN0aXZlICYmICFuZXdTZWxlY3Rpb24uaXNCYXNl
Rmlyc3QoKSkKKyAgICAgICAgICAgIG1fd2ViUGFnZS0+bV9jbGllbnQtPm5vdGlmeVNlbGVjdGlv
bkhhbmRsZXNSZXZlcnNlZCgpOworCisgICAgICAgIGNvbnRyb2xsZXItPnNldFNlbGVjdGlvbihu
ZXdTZWxlY3Rpb24pOworCisgICAgICAgIERFQlVHX1NFTEVDVElPTihCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiU2VsZWN0aW9uSGFuZGxlcjo6c2V0U2VsZWN0aW9uIHNlbGVj
dGlvbiBwb2ludHMgdmFsaWQsIHNlbGVjdGlvbiB1cGRhdGVkIik7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgLy8gUmVxdWVzdGVkIHNlbGVjdGlvbiByZXN1bHRzIGluIGFuIGVtcHR5IHNlbGVjdGlv
biwgc2tpcCB0aGlzIGNoYW5nZS4KKyAgICAgICAgc2VsZWN0aW9uUG9zaXRpb25DaGFuZ2VkKCk7
CisKKyAgICAgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZl
bFdhcm4sICJTZWxlY3Rpb25IYW5kbGVyOjpzZXRTZWxlY3Rpb24gc2VsZWN0aW9uIHBvaW50cyBp
bnZhbGlkLCBzZWxlY3Rpb24gbm90IHVwZGF0ZWQiKTsKKyAgICB9Cit9CisKKy8vIEZJWE1FIHJl
LXVzZSB0aGlzIGluIGNvbnRleHQuIE11c3QgYmUgdXBkYXRlZCB0byBpbmNsdWRlIGFuIG9wdGlv
biB0byByZXR1cm4gdGhlIGhyZWYuCisvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBtb3ZlZCB0
byBhIG5ldyB1bml0IGZpbGUuIE5hbWVzIHN1Z2dldGlvbnMgaW5jbHVkZSBET01RdWVyaWVzCisv
LyBhbmQgTm9kZVR5cGVzLiBGdW5jdGlvbnMgY3VycmVudGx5IGluIElucHV0SGFuZGxlci5jcHAs
IFNlbGVjdGlvbkhhbmRsZXIuY3BwIGFuZCBXZWJQYWdlLmNwcAorLy8gY2FuIGFsbCBiZSBtb3Zl
ZCBpbi4KK3N0YXRpYyBOb2RlKiBlbmNsb3NpbmdMaW5rRXZlbnRQYXJlbnRGb3JOb2RlKFdlYkNv
cmU6Ok5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIE5vZGUqIGxpbmtOb2RlID0gbm9kZS0+ZW5jbG9zaW5nTGlua0V2ZW50UGFyZW50T3JTZWxm
KCk7CisgICAgcmV0dXJuIGxpbmtOb2RlICYmIGxpbmtOb2RlLT5pc0xpbmsoKSA/IGxpbmtOb2Rl
IDogMDsKK30KKwordm9pZCBTZWxlY3Rpb25IYW5kbGVyOjpzZWxlY3RBdFBvaW50KGNvbnN0IFdl
YkNvcmU6OkludFBvaW50JiBsb2NhdGlvbikKK3sKKyAgICAvLyBJZiBwb2ludCBpcyBpbnZhbGlk
IHRyaWdnZXIgc2VsZWN0aW9uIGJhc2VkIGV4cGFuc2lvbi4KKyAgICBpZiAobG9jYXRpb24gPT0g
RE9NU3VwcG9ydDo6SW52YWxpZFBvaW50KSB7CisgICAgICAgIHNlbGVjdE9iamVjdChXb3JkR3Jh
bnVsYXJpdHkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTm9kZSogdGFyZ2V0Tm9k
ZTsKKyAgICBXZWJDb3JlOjpJbnRQb2ludCB0YXJnZXRQb3NpdGlvbjsKKyAgICAvLyBGSVhNRTog
RmFjdG9yeSB0aGlzIGdldCByaWdodCBmYXQgZmluZ2VyIGNvZGUgaW50byBhIGhlbHBlci4KKyAg
ICBjb25zdCBGYXRGaW5nZXJzUmVzdWx0IGxhc3RGYXRGaW5nZXJzUmVzdWx0ID0gbV93ZWJQYWdl
LT5tX3RvdWNoRXZlbnRIYW5kbGVyLT5sYXN0RmF0RmluZ2Vyc1Jlc3VsdCgpOworICAgIGlmIChs
YXN0RmF0RmluZ2Vyc1Jlc3VsdC5wb3NpdGlvbldhc0FkanVzdGVkKCkgJiYgbGFzdEZhdEZpbmdl
cnNSZXN1bHQubm9kZUFzRWxlbWVudElmQXBwbGljYWJsZSgpKSB7CisgICAgICAgIHRhcmdldE5v
ZGUgPSBsYXN0RmF0RmluZ2Vyc1Jlc3VsdC52YWxpZE5vZGUoKTsKKyAgICAgICAgdGFyZ2V0UG9z
aXRpb24gPSBsYXN0RmF0RmluZ2Vyc1Jlc3VsdC5hZGp1c3RlZFBvc2l0aW9uKCk7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgRmF0RmluZ2Vyc1Jlc3VsdCBuZXdGYXRGaW5nZXJzUmVzdWx0ID0gRmF0
RmluZ2VycyhtX3dlYlBhZ2UsIGxvY2F0aW9uLCBGYXRGaW5nZXJzOjpUZXh0KS5maW5kQmVzdFBv
aW50KCk7CisgICAgICAgIGlmICghbmV3RmF0RmluZ2Vyc1Jlc3VsdC5wb3NpdGlvbldhc0FkanVz
dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBu
ZXdGYXRGaW5nZXJzUmVzdWx0LmFkanVzdGVkUG9zaXRpb24oKTsKKyAgICAgICAgdGFyZ2V0Tm9k
ZSA9IG5ld0ZhdEZpbmdlcnNSZXN1bHQudmFsaWROb2RlKCk7CisgICAgfQorCisgICAgQVNTRVJU
KHRhcmdldE5vZGUpOworCisgICAgLy8gSWYgdGhlIG5vZGUgYXQgdGhlIHBvaW50IGlzIGEgbGlu
aywgZm9jdXMgb24gdGhlIGVudGlyZSBsaW5rLCBub3QgYSB3b3JkLgorICAgIGlmIChOb2RlKiBs
aW5rID0gZW5jbG9zaW5nTGlua0V2ZW50UGFyZW50Rm9yTm9kZSh0YXJnZXROb2RlKSkgeworICAg
ICAgICBzZWxlY3RPYmplY3QobGluayk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAv
LyBzZWxlY3RBdFBvaW50IEFQSSBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBXb3JkR3JhbnVsYXJp
dHkgYnV0IG1heSBiZSBleHRlbmRlZCBpbiB0aGUgZnV0dXJlLgorICAgIHNlbGVjdE9iamVjdCh0
YXJnZXRQb3NpdGlvbiwgV29yZEdyYW51bGFyaXR5KTsKK30KKworc3RhdGljIGJvb2wgZXhwYW5k
U2VsZWN0aW9uVG9HcmFudWxhcml0eShGcmFtZSogZnJhbWUsIFZpc2libGVTZWxlY3Rpb24gc2Vs
ZWN0aW9uLCBUZXh0R3JhbnVsYXJpdHkgZ3JhbnVsYXJpdHksIGJvb2wgaXNJbnB1dE1vZGUpCit7
CisgICAgQVNTRVJUKGZyYW1lKTsKKyAgICBBU1NFUlQoZnJhbWUtPnNlbGVjdGlvbigpKTsKKwor
ICAgIGlmICghKHNlbGVjdGlvbi5zdGFydCgpLmFuY2hvck5vZGUoKSAmJiBzZWxlY3Rpb24uc3Rh
cnQoKS5hbmNob3JOb2RlKCktPmlzVGV4dE5vZGUoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIGlmIChncmFudWxhcml0eSA9PSBXb3JkR3JhbnVsYXJpdHkpCisgICAgICAgIHNlbGVj
dGlvbiA9IERPTVN1cHBvcnQ6OnZpc2libGVTZWxlY3Rpb25Gb3JDbG9zZXN0QWN0dWFsV29yZFN0
YXJ0KHNlbGVjdGlvbik7CisKKyAgICBzZWxlY3Rpb24uZXhwYW5kVXNpbmdHcmFudWxhcml0eShn
cmFudWxhcml0eSk7CisgICAgUmVmUHRyPFJhbmdlPiBuZXdSYW5nZSA9IHNlbGVjdGlvbi50b05v
cm1hbGl6ZWRSYW5nZSgpOworICAgIFJlZlB0cjxSYW5nZT4gb2xkUmFuZ2UgPSBmcmFtZS0+c2Vs
ZWN0aW9uKCktPnNlbGVjdGlvbigpLnRvTm9ybWFsaXplZFJhbmdlKCk7CisgICAgRUFmZmluaXR5
IGFmZmluaXR5ID0gZnJhbWUtPnNlbGVjdGlvbigpLT5hZmZpbml0eSgpOworCisgICAgaWYgKGlz
SW5wdXRNb2RlICYmICFmcmFtZS0+ZWRpdG9yKCktPmNsaWVudCgpLT5zaG91bGRDaGFuZ2VTZWxl
Y3RlZFJhbmdlKG9sZFJhbmdlLmdldCgpLCBuZXdSYW5nZS5nZXQoKSwgYWZmaW5pdHksIGZhbHNl
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGZyYW1lLT5zZWxlY3Rpb24o
KS0+c2V0U2VsZWN0ZWRSYW5nZShuZXdSYW5nZS5nZXQoKSwgYWZmaW5pdHksIHRydWUpOworfQor
Cit2b2lkIFNlbGVjdGlvbkhhbmRsZXI6OnNlbGVjdE9iamVjdChjb25zdCBXZWJDb3JlOjpJbnRQ
b2ludCYgbG9jYXRpb24sIFRleHRHcmFudWxhcml0eSBncmFudWxhcml0eSkKK3sKKyAgICBBU1NF
UlQobG9jYXRpb24ueCgpID49IDAgJiYgbG9jYXRpb24ueSgpID49IDApOworICAgIEFTU0VSVCht
X3dlYlBhZ2UgJiYgbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKSAmJiBtX3dlYlBhZ2Ut
PmZvY3VzZWRPck1haW5GcmFtZSgpLT5zZWxlY3Rpb24oKSk7CisgICAgRnJhbWUqIGZvY3VzZWRG
cmFtZSA9IG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisKKyAgICBERUJVR19TRUxF
Q1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlvbkhhbmRs
ZXI6OnNlbGVjdE9iamVjdCBhZGp1c3RlZCBwb2ludHMgJWQsICVkIiwgbG9jYXRpb24ueCgpLCBs
b2NhdGlvbi55KCkpOworCisgICAgSW50UG9pbnQgcmVsYXRpdmVQb2ludCA9IERPTVN1cHBvcnQ6
OmNvbnZlcnRQb2ludFRvRnJhbWUobV93ZWJQYWdlLT5tYWluRnJhbWUoKSwgZm9jdXNlZEZyYW1l
LCBsb2NhdGlvbik7CisgICAgVmlzaWJsZVBvc2l0aW9uIHBvaW50TG9jYXRpb24oZm9jdXNlZEZy
YW1lLT52aXNpYmxlUG9zaXRpb25Gb3JQb2ludChyZWxhdGl2ZVBvaW50KSk7CisgICAgVmlzaWJs
ZVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBWaXNpYmxlU2VsZWN0aW9uKHBvaW50TG9jYXRpb24sIHBv
aW50TG9jYXRpb24pOworCisgICAgbV9zZWxlY3Rpb25BY3RpdmUgPSBleHBhbmRTZWxlY3Rpb25U
b0dyYW51bGFyaXR5KGZvY3VzZWRGcmFtZSwgc2VsZWN0aW9uLCBncmFudWxhcml0eSwgbV93ZWJQ
YWdlLT5tX2lucHV0SGFuZGxlci0+aXNJbnB1dE1vZGUoKSk7Cit9CisKK3ZvaWQgU2VsZWN0aW9u
SGFuZGxlcjo6c2VsZWN0T2JqZWN0KFdlYkNvcmU6OlRleHRHcmFudWxhcml0eSBncmFudWxhcml0
eSkKK3sKKyAgICBBU1NFUlQobV93ZWJQYWdlICYmIG1faW5wdXRIYW5kbGVyKTsKKyAgICAvLyBV
c2luZyBjYXJldCBsb2NhdGlvbiwgbXVzdCBiZSBpbnNpZGUgYW4gaW5wdXQgZmllbGQuCisgICAg
aWYgKCFtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBBU1NFUlQobV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKSAmJiBt
X3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5zZWxlY3Rpb24oKSk7CisgICAgRnJhbWUq
IGZvY3VzZWRGcmFtZSA9IG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisKKyAgICBE
RUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVj
dGlvbkhhbmRsZXI6OnNlbGVjdE9iamVjdCB1c2luZyBjdXJyZW50IHNlbGVjdGlvbiIpOworCisg
ICAgLy8gVXNlIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhcyB0aGUgc2VsZWN0aW9uIHBvaW50Lgor
ICAgIEFTU0VSVChmb2N1c2VkRnJhbWUtPnNlbGVjdGlvbigpLT5zZWxlY3Rpb25UeXBlKCkgIT0g
VmlzaWJsZVNlbGVjdGlvbjo6Tm9TZWxlY3Rpb24pOworICAgIG1fc2VsZWN0aW9uQWN0aXZlID0g
ZXhwYW5kU2VsZWN0aW9uVG9HcmFudWxhcml0eShmb2N1c2VkRnJhbWUsIGZvY3VzZWRGcmFtZS0+
c2VsZWN0aW9uKCktPnNlbGVjdGlvbigpLCBncmFudWxhcml0eSwgdHJ1ZSAvKiBpc0lucHV0TW9k
ZSAqLyk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6c2VsZWN0T2JqZWN0KFdlYkNvcmU6
Ok5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm47CisKKyAgICBt
X3NlbGVjdGlvbkFjdGl2ZSA9IHRydWU7CisKKyAgICBBU1NFUlQobV93ZWJQYWdlICYmIG1fd2Vi
UGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkgJiYgbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJh
bWUoKS0+c2VsZWN0aW9uKCkpOworICAgIEZyYW1lKiBmb2N1c2VkRnJhbWUgPSBtX3dlYlBhZ2Ut
PmZvY3VzZWRPck1haW5GcmFtZSgpOworCisgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJTZWxlY3Rpb25IYW5kbGVyOjpzZWxlY3ROb2RlIik7
CisKKyAgICBWaXNpYmxlU2VsZWN0aW9uIHNlbGVjdGlvbiA9IFZpc2libGVTZWxlY3Rpb246OnNl
bGVjdGlvbkZyb21Db250ZW50c09mTm9kZShub2RlKTsKKyAgICBmb2N1c2VkRnJhbWUtPnNlbGVj
dGlvbigpLT5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKK30KKworc3RhdGljIFRleHREaXJlY3Rp
b24gZGlyZWN0aW9uT2ZFbmNsb3NpbmdCbG9jayhGcmFtZVNlbGVjdGlvbiogc2VsZWN0aW9uKQor
eworICAgIE5vZGUqIGVuY2xvc2luZ0Jsb2NrTm9kZSA9IGVuY2xvc2luZ0Jsb2NrKHNlbGVjdGlv
bi0+c2VsZWN0aW9uKCkuZXh0ZW50KCkuZGVwcmVjYXRlZE5vZGUoKSk7CisgICAgaWYgKCFlbmNs
b3NpbmdCbG9ja05vZGUpCisgICAgICAgIHJldHVybiBMVFI7CisKKyAgICBSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyID0gZW5jbG9zaW5nQmxvY2tOb2RlLT5yZW5kZXJlcigpOworICAgIGlmIChyZW5k
ZXJlcikKKyAgICAgICAgcmV0dXJuIHJlbmRlcmVyLT5zdHlsZSgpLT5kaXJlY3Rpb24oKTsKKwor
ICAgIHJldHVybiBMVFI7Cit9CisKKy8vIFJldHVybnMgPiAwIGlmIHAxIGlzICJjbG9zZXIiIHRv
IHJlZmVyZW5jZVBvaW50LCA8IDAgaWYgcDIgaXMgImNsb3NlciIsIDAgaWYgdGhleSBhcmUgZXF1
aWRpc3RhbnQuCisvLyBCZWNhdXNlIHRleHQgaXMgdXN1YWxseSBhcnJhbmdlZCBpbiBob3Jpem9u
dGFsIHJvd3MsIGRpc3RhbmNlIGlzIG1lYXN1cmVkIGFsb25nIHRoZSB5LWF4aXMsIHdpdGggeC1h
eGlzIHVzZWQgb25seSB0byBicmVhayB0aWVzLgorLy8gSWYgcmlnaHRHcmF2aXR5IGlzIHRydWUs
IHRoZSByaWdodC1tb3N0IHgtY29vcmRpbmF0ZSBpcyBjaG9zZW4sIG90aGVyd2lzZSB0ZWggbGVm
dC1tb3N0IGNvb3JkaW5hdGUgaXMgY2hvc2VuLgorc3RhdGljIGlubGluZSBpbnQgY29tcGFyZVBv
aW50c1RvUmVmZXJlbmNlUG9pbnQoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIHAxLCBjb25zdCBX
ZWJDb3JlOjpJbnRQb2ludCYgcDIsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiByZWZlcmVuY2VQ
b2ludCwgYm9vbCByaWdodEdyYXZpdHkpCit7CisgICAgaW50IGR5MSA9IGFicyhyZWZlcmVuY2VQ
b2ludC55KCkgLSBwMS55KCkpOworICAgIGludCBkeTIgPSBhYnMocmVmZXJlbmNlUG9pbnQueSgp
IC0gcDIueSgpKTsKKyAgICBpZiAoZHkxICE9IGR5MikKKyAgICAgICAgcmV0dXJuIGR5MiAtIGR5
MTsKKworICAgIC8vIFNhbWUgeS1jb29yZGluYXRlLCBjaG9vc2UgdGhlIGZhcnRoZXN0IHJpZ2h0
IChvciBsZWZ0KSBwb2ludC4KKyAgICBpZiAocDEueCgpID09IHAyLngoKSkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICBpZiAocDEueCgpID4gcDIueCgpKQorICAgICAgICByZXR1cm4gcmlnaHRH
cmF2aXR5ID8gMSA6IC0xOworCisgICAgcmV0dXJuIHJpZ2h0R3Jhdml0eSA/IC0xIDogMTsKK30K
KworLy8gTk9URS9GSVhNRTogRHVlIHRvIHI3NzI4Niwgd2UgYXJlIGdldHRpbmcgb2ZmLWJ5LW9u
ZSByZXN1bHRzIGluIHRoZSBJbnRSZWN0IGNsYXNzIGNvdW50ZXJwYXJ0IGltcGxlbWVudGF0aW9u
IG9mIHRoZQorLy8gICAgICAgICAgICAgbWV0aG9kcyBiZWxvdy4gQXMgZG9uZSBpbiByODk4MDMs
IHI3NzkyOCBhbmQgYSBmZXcgb3RoZXJzLCBsZXRzIHVzZSBsb2NhbCBtZXRob2QgdG8gZml4IGl0
LgorLy8gICAgICAgICAgICAgV2Ugc2hvdWxkIGtlZXAgb3VyIGV5ZXMgdmVyeSBvcGVuIG9uIGl0
LCBzaW5jZSBpdCBjYW4gYWZmZWN0IEJhY2tpbmdTdG9yZSB2ZXJ5IGJhZGx5Lgorc3RhdGljIElu
dFBvaW50IG1pblhNaW5ZQ29ybmVyKGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIHJlY3QpIHsgcmV0
dXJuIHJlY3QubG9jYXRpb24oKTsgfSAvLyB0eXBpY2FsbHkgdG9wTGVmdAorc3RhdGljIEludFBv
aW50IG1heFhNaW5ZQ29ybmVyKGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIHJlY3QpIHsgcmV0dXJu
IFdlYkNvcmU6OkludFBvaW50KHJlY3QueCgpICsgcmVjdC53aWR0aCgpIC0gMSwgcmVjdC55KCkp
OyB9IC8vIHR5cGljYWxseSB0b3BSaWdodAorc3RhdGljIEludFBvaW50IG1pblhNYXhZQ29ybmVy
KGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIHJlY3QpIHsgcmV0dXJuIFdlYkNvcmU6OkludFBvaW50
KHJlY3QueCgpLCByZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCkgLSAxKTsgfSAvLyB0eXBpY2FsbHkg
Ym90dG9tTGVmdAorc3RhdGljIEludFBvaW50IG1heFhNYXhZQ29ybmVyKGNvbnN0IFdlYkNvcmU6
OkludFJlY3QmIHJlY3QpIHsgcmV0dXJuIEludFBvaW50KHJlY3QueCgpICsgcmVjdC53aWR0aCgp
IC0gMSwgcmVjdC55KCkgKyByZWN0LmhlaWdodCgpIC0gMSk7IH0gLy8gdHlwaWNhbGx5IGJvdHRv
bVJpZ2h0CisKKy8vIFRoZSBjYXJldCBpcyBhIG9uZS1waXhlbCB3aWRlIGxpbmUgZG93biBlaXRo
ZXIgdGhlIHJpZ2h0IG9yIGxlZnQgZWRnZSBvZiBhCisvLyByZWN0LCBkZXBlbmRpbmcgb24gdGhl
IHRleHQgZGlyZWN0aW9uLgorc3RhdGljIGlubGluZSBib29sIGNhcmV0SXNPbkxlZnQoYm9vbCBp
c1N0YXJ0Q2FyZXQsIGJvb2wgaXNSVEwpCit7CisgICAgaWYgKGlzU3RhcnRDYXJldCkKKyAgICAg
ICAgcmV0dXJuICFpc1JUTDsKKworICAgIHJldHVybiBpc1JUTDsKK30KKworc3RhdGljIGlubGlu
ZSBXZWJDb3JlOjpJbnRQb2ludCBjYXJldExvY2F0aW9uRm9yUmVjdChjb25zdCBXZWJDb3JlOjpJ
bnRSZWN0JiByZWN0LCBib29sIGlzU3RhcnRDYXJldCwgYm9vbCBpc1JUTCkKK3sKKyAgICByZXR1
cm4gY2FyZXRJc09uTGVmdChpc1N0YXJ0Q2FyZXQsIGlzUlRMKSA/IG1pblhNaW5ZQ29ybmVyKHJl
Y3QpIDogbWF4WE1pbllDb3JuZXIocmVjdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgV2ViQ29yZTo6
SW50UG9pbnQgY2FyZXRDb21wYXJpc29uUG9pbnRGb3JSZWN0KGNvbnN0IFdlYkNvcmU6OkludFJl
Y3QmIHJlY3QsIGJvb2wgaXNTdGFydENhcmV0LCBib29sIGlzUlRMKQoreworICAgIGlmIChpc1N0
YXJ0Q2FyZXQpCisgICAgICAgIHJldHVybiBjYXJldElzT25MZWZ0KGlzU3RhcnRDYXJldCwgaXNS
VEwpID8gbWluWE1pbllDb3JuZXIocmVjdCkgOiBtYXhYTWluWUNvcm5lcihyZWN0KTsKKworICAg
IHJldHVybiBjYXJldElzT25MZWZ0KGlzU3RhcnRDYXJldCwgaXNSVEwpID8gbWluWE1heFlDb3Ju
ZXIocmVjdCkgOiBtYXhYTWF4WUNvcm5lcihyZWN0KTsKK30KKworc3RhdGljIHZvaWQgYWRqdXN0
Q2FyZXRSZWN0cyhXZWJDb3JlOjpJbnRSZWN0JiBzdGFydENhcmV0LCBib29sIGlzU3RhcnRDYXJl
dENsaXBwZWRPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYkNvcmU6OkludFJl
Y3QmIGVuZENhcmV0LCBib29sIGlzRW5kQ2FyZXRDbGlwcGVkT3V0LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50
UmVjdD4gcmVjdExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYkNv
cmU6OkludFBvaW50JiBzdGFydFJlZmVyZW5jZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgZW5kUmVmZXJlbmNlUG9pbnQsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNSVEwpCit7CisgICAgLy8gc3RhcnRSZWZl
cmVuY2VQb2ludCBpcyB0aGUgYmVzdCBndWVzcyBhdCB0aGUgdG9wIGxlZnQgb2YgdGhlIHNlbGVj
dGlvbjsgZW5kUmVmZXJlbmNlUG9pbnQgaXMgdGhlIGJlc3QgZ3Vlc3MgYXQgdGhlIGJvdHRvbSBy
aWdodC4KKyAgICBpZiAoaXNTdGFydENhcmV0Q2xpcHBlZE91dCkKKyAgICAgICAgc3RhcnRDYXJl
dC5zZXRMb2NhdGlvbihET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQpOworICAgIGVsc2UgeworICAg
ICAgICBzdGFydENhcmV0ID0gcmVjdExpc3RbMF07CisgICAgICAgIHN0YXJ0Q2FyZXQuc2V0TG9j
YXRpb24oY2FyZXRMb2NhdGlvbkZvclJlY3Qoc3RhcnRDYXJldCwgdHJ1ZSwgaXNSVEwpKTsKKyAg
ICB9CisKKyAgICBpZiAoaXNFbmRDYXJldENsaXBwZWRPdXQpCisgICAgICAgIGVuZENhcmV0LnNl
dExvY2F0aW9uKERPTVN1cHBvcnQ6OkludmFsaWRQb2ludCk7CisgICAgZWxzZSB7CisgICAgICAg
IGVuZENhcmV0ID0gcmVjdExpc3RbMF07CisgICAgICAgIGVuZENhcmV0LnNldExvY2F0aW9uKGNh
cmV0TG9jYXRpb25Gb3JSZWN0KGVuZENhcmV0LCBmYWxzZSwgaXNSVEwpKTsKKyAgICB9CisKKyAg
ICBpZiAoaXNTdGFydENhcmV0Q2xpcHBlZE91dCAmJiBpc0VuZENhcmV0Q2xpcHBlZE91dCkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgLy8gUmVzZXQgd2lkdGggdG8gMSBhcyB3ZSBhcmUgc3RyaWN0
bHkgaW50ZXJlc3RlZCBpbiBjYXJldCBsb2NhdGlvbi4KKyAgICBzdGFydENhcmV0LnNldFdpZHRo
KDEpOworICAgIGVuZENhcmV0LnNldFdpZHRoKDEpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0g
MTsgaSA8IHJlY3RMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIEludFJlY3QgY3VycmVudFJl
Y3QocmVjdExpc3RbaV0pOworCisgICAgICAgIC8vIENvbXBhcmUgYW5kIHVwZGF0ZSB0aGUgc3Rh
cnQgYW5kIGVuZCBjYXJldHMgd2l0aCB0aGVpciByZXNwZWN0aXZlIHJlZmVyZW5jZSBwb2ludHMu
CisgICAgICAgIGlmICghaXNTdGFydENhcmV0Q2xpcHBlZE91dCAmJiBjb21wYXJlUG9pbnRzVG9S
ZWZlcmVuY2VQb2ludCgKKyAgICAgICAgICAgICAgICAgICAgY2FyZXRDb21wYXJpc29uUG9pbnRG
b3JSZWN0KGN1cnJlbnRSZWN0LCB0cnVlLCBpc1JUTCksCisgICAgICAgICAgICAgICAgICAgIGNh
cmV0Q29tcGFyaXNvblBvaW50Rm9yUmVjdChzdGFydENhcmV0LCB0cnVlLCBpc1JUTCksCisgICAg
ICAgICAgICAgICAgICAgIHN0YXJ0UmVmZXJlbmNlUG9pbnQsIGlzUlRMKSA+IDApIHsKKyAgICAg
ICAgICAgIHN0YXJ0Q2FyZXQuc2V0TG9jYXRpb24oY2FyZXRMb2NhdGlvbkZvclJlY3QoY3VycmVu
dFJlY3QsIHRydWUsIGlzUlRMKSk7CisgICAgICAgICAgICBzdGFydENhcmV0LnNldEhlaWdodChj
dXJyZW50UmVjdC5oZWlnaHQoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzRW5kQ2Fy
ZXRDbGlwcGVkT3V0ICYmIGNvbXBhcmVQb2ludHNUb1JlZmVyZW5jZVBvaW50KAorICAgICAgICAg
ICAgICAgICAgICBjYXJldENvbXBhcmlzb25Qb2ludEZvclJlY3QoY3VycmVudFJlY3QsIGZhbHNl
LCBpc1JUTCksCisgICAgICAgICAgICAgICAgICAgIGNhcmV0Q29tcGFyaXNvblBvaW50Rm9yUmVj
dChlbmRDYXJldCwgZmFsc2UsIGlzUlRMKSwKKyAgICAgICAgICAgICAgICAgICAgZW5kUmVmZXJl
bmNlUG9pbnQsICFpc1JUTCkgPiAwKSB7CisgICAgICAgICAgICBlbmRDYXJldC5zZXRMb2NhdGlv
bihjYXJldExvY2F0aW9uRm9yUmVjdChjdXJyZW50UmVjdCwgZmFsc2UsIGlzUlRMKSk7CisgICAg
ICAgICAgICBlbmRDYXJldC5zZXRIZWlnaHQoY3VycmVudFJlY3QuaGVpZ2h0KCkpOworICAgICAg
ICB9CisgICAgfQorfQorCit2b2lkIFNlbGVjdGlvbkhhbmRsZXI6OmNsaXBSZWdpb25Ub1Zpc2li
bGVDb250YWluZXIoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb24mIHJlZ2lvbikK
K3sKKyAgICBBU1NFUlQobV93ZWJQYWdlLT5tX21haW5GcmFtZSAmJiBtX3dlYlBhZ2UtPm1fbWFp
bkZyYW1lLT52aWV3KCkpOworCisgICAgRnJhbWUqIGZyYW1lID0gbV93ZWJQYWdlLT5mb2N1c2Vk
T3JNYWluRnJhbWUoKTsKKworICAgIC8vIERvbid0IGFsbG93IHRoZSByZWdpb24gdG8gZXh0ZW5k
IG91dHNpZGUgb2YgdGhlIGFsbCBpdHMgYW5jZXN0b3IgZnJhbWVzJyB2aXNpYmxlIGFyZWEuCisg
ICAgaWYgKGZyYW1lICE9IG1fd2ViUGFnZS0+bWFpbkZyYW1lKCkpIHsKKyAgICAgICAgV2ViQ29y
ZTo6SW50UmVjdCBjb250YWluaW5nQ29udGVudFJlY3Q7CisgICAgICAgIGNvbnRhaW5pbmdDb250
ZW50UmVjdCA9IG1fd2ViUGFnZS0+Z2V0UmVjdXJzaXZlVmlzaWJsZVdpbmRvd1JlY3QoZnJhbWUt
PnZpZXcoKSwgdHJ1ZSAvKiBubyBjbGlwIHRvIG1haW4gZnJhbWUgd2luZG93ICovKTsKKyAgICAg
ICAgY29udGFpbmluZ0NvbnRlbnRSZWN0ID0gbV93ZWJQYWdlLT5tX21haW5GcmFtZS0+dmlldygp
LT53aW5kb3dUb0NvbnRlbnRzKGNvbnRhaW5pbmdDb250ZW50UmVjdCk7CisgICAgICAgIHJlZ2lv
biA9IGludGVyc2VjdFJlZ2lvbnMoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb24o
Y29udGFpbmluZ0NvbnRlbnRSZWN0KSwgcmVnaW9uKTsKKyAgICB9CisKKyAgICAvLyBEb24ndCBh
bGxvdyB0aGUgcmVnaW9uIHRvIGV4dGVuZCBvdXRzaWRlIG9mIHRoZSBpbnB1dCBmaWVsZC4KKyAg
ICBpZiAobV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNJbnB1dE1vZGUoKQorICAgICAgICAm
JiBmcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKQorICAgICAgICAmJiBmcmFtZS0+ZG9j
dW1lbnQoKS0+Zm9jdXNlZE5vZGUoKS0+cmVuZGVyZXIoKSkgeworCisgICAgICAgIC8vIEFkanVz
dCB0aGUgYm91bmRpbmcgYm94IHRvIHRoZSBmcmFtZSBvZmZzZXQuCisgICAgICAgIEludFJlY3Qg
Ym91bmRpbmdCb3goZnJhbWUtPmRvY3VtZW50KCktPmZvY3VzZWROb2RlKCktPnJlbmRlcmVyKCkt
PmFic29sdXRlQm91bmRpbmdCb3hSZWN0KCkpOworICAgICAgICBib3VuZGluZ0JveCA9IG1fd2Vi
UGFnZS0+bWFpbkZyYW1lKCktPnZpZXcoKS0+d2luZG93VG9Db250ZW50cyhmcmFtZS0+dmlldygp
LT5jb250ZW50c1RvV2luZG93KGJvdW5kaW5nQm94KSk7CisKKyAgICAgICAgcmVnaW9uID0gaW50
ZXJzZWN0UmVnaW9ucyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbihib3VuZGlu
Z0JveCksIHJlZ2lvbik7CisgICAgfQorfQorCitzdGF0aWMgV2ViQ29yZTo6SW50UG9pbnQgcmVm
ZXJlbmNlUG9pbnQoY29uc3QgV2ViQ29yZTo6VmlzaWJsZVBvc2l0aW9uJiBwb3NpdGlvbiwgY29u
c3QgV2ViQ29yZTo6SW50UmVjdCYgYm91bmRpbmdSZWN0CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgZnJhbWVQb3NpdGlv
biwgYm9vbCBpc1N0YXJ0Q2FyZXQsIGJvb2wgaXNSVEwpCit7CisgICAgLy8gSWYgb25lIG9mIHRo
ZSBjYXJldHMgaXMgaW52YWxpZCAodGhpcyBoYXBwZW5zLCBmb3IgaW5zdGFuY2UsIGlmIHRoZQor
ICAgIC8vIHNlbGVjdGlvbiBlbmRzIGluIGFuIGVtcHR5IGRpdikgZmFsbCBiYWNrIHRvIHVzaW5n
IHRoZSBjb3JuZXIgb2YgdGhlCisgICAgLy8gZW50aXJlIHJlZ2lvbiAod2hpY2ggaXMgYWxyZWFk
eSBpbiBmcmFtZSBjb29yZGluYXRlcyBzbyBkb2Vzbid0IG5lZWQKKyAgICAvLyBhZGp1c3Rpbmcp
LgorICAgIFdlYkNvcmU6OkludFJlY3Qgc3RhcnRDYXJldEJvdW5kcyhwb3NpdGlvbi5hYnNvbHV0
ZUNhcmV0Qm91bmRzKCkpOworICAgIGlmIChzdGFydENhcmV0Qm91bmRzLmlzRW1wdHkoKSkKKyAg
ICAgICAgc3RhcnRDYXJldEJvdW5kcyA9IGJvdW5kaW5nUmVjdDsKKyAgICBlbHNlCisgICAgICAg
IHN0YXJ0Q2FyZXRCb3VuZHMubW92ZShmcmFtZVBvc2l0aW9uLngoKSwgZnJhbWVQb3NpdGlvbi55
KCkpOworCisgICAgcmV0dXJuIGNhcmV0Q29tcGFyaXNvblBvaW50Rm9yUmVjdChzdGFydENhcmV0
Qm91bmRzLCBpc1N0YXJ0Q2FyZXQsIGlzUlRMKTsKK30KKworLy8gTm90ZTogVGhpcyBpcyB0aGUg
b25seSBmdW5jdGlvbiBpbiBTZWxlY3Rpb25IYW5kbGVyIGluIHdoaWNoIHRoZSBjb29yZGluYXRl
CisvLyBzeXN0ZW0gaXMgbm90IGVudGlyZWx5IFdlYktpdC4KK3ZvaWQgU2VsZWN0aW9uSGFuZGxl
cjo6c2VsZWN0aW9uUG9zaXRpb25DaGFuZ2VkKGJvb2wgdmlzdWFsQ2hhbmdlT25seSkKK3sKKyAg
ICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNl
bGVjdGlvbkhhbmRsZXI6OnNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCB2aXNpYmxlQ2hhbmdlT25s
eSA9ICVzIiwgdmlzdWFsQ2hhbmdlT25seSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCisgICAgLy8g
VGhpcyBtZXRob2QgY2FuIGdldCBjYWxsZWQgZHVyaW5nIFdlYlBhZ2Ugc2h1dGRvd24gcHJvY2Vz
cy4KKyAgICAvLyBJZiB0aGF0IGlzIHRoZSBjYXNlLCBqdXN0IGJhaWwgb3V0IHNpbmNlIHRoZSBj
bGllbnQgaXMgbm90CisgICAgLy8gaW4gYSBzYWZlIHN0YXRlIG9mIHRydXN0IHRvIHJlcXVlc3Qg
YW55dGhpbmcgZWxzZSBmcm9tIGl0LgorICAgIGlmICghbV93ZWJQYWdlLT5tX21haW5GcmFtZSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXItPmlz
SW5wdXRNb2RlKCkgJiYgbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+cHJvY2Vzc2luZ0NoYW5n
ZSgpKSB7CisgICAgICAgIG1fd2ViUGFnZS0+bV9jbGllbnQtPmNhbmNlbFNlbGVjdGlvblZpc3Vh
bHMoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtX2NhcmV0QWN0aXZlIHx8
IChtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpICYmIG1fd2ViUGFnZS0+
Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnNlbGVjdGlvbigpLT5pc0NhcmV0KCkpKSB7CisgICAgICAg
IC8vIFRoaXMgbWF5IHVwZGF0ZSB0aGUgY2FyZXQgdG8gbm8gbG9uZ2VyIGJlIGFjdGl2ZS4KKyAg
ICAgICAgY2FyZXRQb3NpdGlvbkNoYW5nZWQoKTsKKyAgICB9CisKKyAgICAvLyBFbnRlciBzZWxl
Y3Rpb24gbW9kZSBpZiBzZWxlY3Rpb24gdHlwZSBpcyBSYW5nZVNlbGVjdGlvbiwgYW5kIGRpc2Fi
bGUgc2VsZWN0aW9uIGlmCisgICAgLy8gc2VsZWN0aW9uIGlzIGFjdGl2ZSBhbmQgYmVjb21lcyBj
YXJldCBzZWxlY3Rpb24uCisgICAgRnJhbWUqIGZyYW1lID0gbV93ZWJQYWdlLT5mb2N1c2VkT3JN
YWluRnJhbWUoKTsKKyAgICBJbnRQb2ludCBmcmFtZVBvcyA9IG1fd2ViUGFnZS0+ZnJhbWVPZmZz
ZXQoZnJhbWUpOworICAgIGlmIChtX3NlbGVjdGlvbkFjdGl2ZSAmJiAobV9jYXJldEFjdGl2ZSB8
fCBmcmFtZS0+c2VsZWN0aW9uKCktPmlzTm9uZSgpKSkKKyAgICAgICAgbV9zZWxlY3Rpb25BY3Rp
dmUgPSBmYWxzZTsKKyAgICBlbHNlIGlmIChmcmFtZS0+c2VsZWN0aW9uKCktPmlzUmFuZ2UoKSkK
KyAgICAgICAgbV9zZWxlY3Rpb25BY3RpdmUgPSB0cnVlOworICAgIGVsc2UgaWYgKCFtX3NlbGVj
dGlvbkFjdGl2ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgV2ViQ29yZTo6SW50UmVjdCBzdGFy
dENhcmV0OworICAgIFdlYkNvcmU6OkludFJlY3QgZW5kQ2FyZXQ7CisKKyAgICAvLyBHZXQgdGhl
IHRleHQgcmVjdHMgZnJvbSB0aGUgc2VsZWN0aW9ucyByYW5nZS4KKyAgICBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiByZWdpb247CisgICAgZ2V0Q29uc29saWRhdGVkUmVnaW9u
T2ZUZXh0UXVhZHNGb3JTZWxlY3Rpb24oZnJhbWUtPnNlbGVjdGlvbigpLT5zZWxlY3Rpb24oKSwg
cmVnaW9uKTsKKworICAgIC8vIElmIHRoZXJlIGlzIG5vIGNoYW5nZSBpbiBzZWxlY3RlZCB0ZXh0
IGFuZCB0aGUgdmlzdWFsIHJlY3RzCisgICAgLy8gaGF2ZSBub3QgY2hhbmdlZCB0aGVuIGRvbid0
IGJvdGhlciBub3RpZnlpbmcgYW55dGhpbmcuCisgICAgaWYgKHZpc3VhbENoYW5nZU9ubHkgJiYg
bV9sYXN0U2VsZWN0aW9uUmVnaW9uLmlzRXF1YWwocmVnaW9uKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgbV9sYXN0U2VsZWN0aW9uUmVnaW9uID0gcmVnaW9uOworCisgICAgaWYgKCFyZWdpb24u
aXNFbXB0eSgpKSB7CisgICAgICAgIFdlYkNvcmU6OkludFJlY3QgdW5jbGlwcGVkU3RhcnRDYXJl
dDsKKyAgICAgICAgV2ViQ29yZTo6SW50UmVjdCB1bmNsaXBwZWRFbmRDYXJldDsKKworICAgICAg
ICBib29sIGlzUlRMID0gZGlyZWN0aW9uT2ZFbmNsb3NpbmdCbG9jayhmcmFtZS0+c2VsZWN0aW9u
KCkpID09IFJUTDsKKworICAgICAgICBzdGQ6OnZlY3RvcjxCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
SW50UmVjdD4gcmVjdExpc3QgPSByZWdpb24ucmVjdHMoKTsKKworICAgICAgICBXZWJDb3JlOjpJ
bnRQb2ludCBzdGFydENhcmV0UmVmZXJlbmNlUG9pbnQgPSByZWZlcmVuY2VQb2ludChmcmFtZS0+
c2VsZWN0aW9uKCktPnNlbGVjdGlvbigpLnZpc2libGVTdGFydCgpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdp
b24uZXh0ZW50cygpLCBmcmFtZVBvcywgdHJ1ZSAvKiBpc1N0YXJ0Q2FyZXQgKi8sIGlzUlRMKTsK
KyAgICAgICAgV2ViQ29yZTo6SW50UG9pbnQgZW5kQ2FyZXRSZWZlcmVuY2VQb2ludCA9IHJlZmVy
ZW5jZVBvaW50KGZyYW1lLT5zZWxlY3Rpb24oKS0+c2VsZWN0aW9uKCkudmlzaWJsZUVuZCgpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICByZWdpb24uZXh0ZW50cygpLCBmcmFtZVBvcywgZmFsc2UgLyogaXNTdGFydENh
cmV0ICovLCBpc1JUTCk7CisKKyAgICAgICAgYWRqdXN0Q2FyZXRSZWN0cyh1bmNsaXBwZWRTdGFy
dENhcmV0LCBmYWxzZSAvKiB1bmNsaXBwZWQgKi8sIHVuY2xpcHBlZEVuZENhcmV0LCBmYWxzZSAv
KiB1bmNsaXBwZWQgKi8sIHJlY3RMaXN0LCBzdGFydENhcmV0UmVmZXJlbmNlUG9pbnQsIGVuZENh
cmV0UmVmZXJlbmNlUG9pbnQsIGlzUlRMKTsKKworICAgICAgICBjbGlwUmVnaW9uVG9WaXNpYmxl
Q29udGFpbmVyKHJlZ2lvbik7CisKKyNpZiBTSE9XREVCVUdfU0VMRUNUSU9OSEFORExFUiAvLyBE
b24ndCByZWx5IGp1c3Qgb24gREVCVUdfU0VMRUNUSU9OIHRvIGF2b2lkIGxvb3AuCisgICAgICAg
IGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcmVjdExpc3Quc2l6ZSgpOyBpKyspCisgICAg
ICAgICAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3Jp
dGljYWwsICJSZWN0IGxpc3QgLSBVbm1vZGlmaWVkICMlZCwgKCVkLCAlZCkgKCVkIHggJWQpIiwg
aSwgcmVjdExpc3RbaV0ueCgpLCByZWN0TGlzdFtpXS55KCksIHJlY3RMaXN0W2ldLndpZHRoKCks
IHJlY3RMaXN0W2ldLmhlaWdodCgpKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7
IGkgPCByZWdpb24ubnVtUmVjdHMoKTsgaSsrKQorICAgICAgICAgICAgREVCVUdfU0VMRUNUSU9O
KEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiUmVjdCBsaXN0ICAtIENv
bnNvbGlkYXRlZCAjJWQsICglZCwgJWQpICglZCB4ICVkKSIsIGksIHJlZ2lvbi5yZWN0cygpW2ld
LngoKSwgcmVnaW9uLnJlY3RzKClbaV0ueSgpLCByZWdpb24ucmVjdHMoKVtpXS53aWR0aCgpLCBy
ZWdpb24ucmVjdHMoKVtpXS5oZWlnaHQoKSk7CisjZW5kaWYKKworICAgICAgICBib29sIHNob3Vs
ZENhcmVBYm91dFBvc3NpYmxlQ2xpcHBlZE91dFNlbGVjdGlvbiA9IGZyYW1lICE9IG1fd2ViUGFn
ZS0+bWFpbkZyYW1lKCkgfHwgbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNJbnB1dE1vZGUo
KTsKKworICAgICAgICBpZiAoIXJlZ2lvbi5pc0VtcHR5KCkgfHwgc2hvdWxkQ2FyZUFib3V0UG9z
c2libGVDbGlwcGVkT3V0U2VsZWN0aW9uKSB7CisgICAgICAgICAgICAvLyBBZGp1c3QgdGhlIGhh
bmRsZSBtYXJrZXJzIHRvIGJlIGF0IHRoZSBlbmQgb2YgdGhlIHBhaW50ZWQgcmVjdC4gV2hlbiBz
ZWxlY3RpbmcgbGlua3MKKyAgICAgICAgICAgIC8vIGFuZCBvdGhlciBlbGVtZW50cyB0aGF0IG1h
eSBoYXZlIGEgbGFyZ2VyIHZpc2libGUgYXJlYSB0aGFuIG5lZWRzIHRvIGJlIHJlbmRlcmVkIGEg
Z2FwCisgICAgICAgICAgICAvLyBjYW4gZXhpc3QgYmV0d2VlbiB0aGUgaGFuZGxlIGFuZCBvdmVy
bGF5IHJlZ2lvbi4KKworICAgICAgICAgICAgYm9vbCBzaG91bGRDbGlwU3RhcnRDYXJldCA9ICFy
ZWdpb24uaXNSZWN0SW5SZWdpb24odW5jbGlwcGVkU3RhcnRDYXJldCk7CisgICAgICAgICAgICBi
b29sIHNob3VsZENsaXBFbmRDYXJldCA9ICFyZWdpb24uaXNSZWN0SW5SZWdpb24odW5jbGlwcGVk
RW5kQ2FyZXQpOworCisgICAgICAgICAgICAvLyBGaW5kIHRoZSB0b3AgY29ybmVyIGFuZCBib3R0
b20gY29ybmVyLgorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QmxhY2tCZXJyeTo6UGxhdGZvcm06
OkludFJlY3Q+IGNsaXBwZWRSZWN0TGlzdCA9IHJlZ2lvbi5yZWN0cygpOworICAgICAgICAgICAg
YWRqdXN0Q2FyZXRSZWN0cyhzdGFydENhcmV0LCBzaG91bGRDbGlwU3RhcnRDYXJldCwgZW5kQ2Fy
ZXQsIHNob3VsZENsaXBFbmRDYXJldCwgY2xpcHBlZFJlY3RMaXN0LCBzdGFydENhcmV0UmVmZXJl
bmNlUG9pbnQsIGVuZENhcmV0UmVmZXJlbmNlUG9pbnQsIGlzUlRMKTsKKworICAgICAgICAgICAg
Ly8gVHJhbnNsYXRlIHRoZSBjYXJldCB2YWx1ZXMgYXMgdGhleSBtdXN0IGJlIGluIHRyYW5zZm9y
bWVkIGNvb3JkaW5hdGVzLgorICAgICAgICAgICAgaWYgKCFzaG91bGRDbGlwU3RhcnRDYXJldCkg
eworICAgICAgICAgICAgICAgIHN0YXJ0Q2FyZXQgPSBtX3dlYlBhZ2UtPm1hcFRvVHJhbnNmb3Jt
ZWQoc3RhcnRDYXJldCk7CisgICAgICAgICAgICAgICAgbV93ZWJQYWdlLT5jbGlwVG9UcmFuc2Zv
cm1lZENvbnRlbnRzUmVjdChzdGFydENhcmV0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgaWYgKCFzaG91bGRDbGlwRW5kQ2FyZXQpIHsKKyAgICAgICAgICAgICAgICBlbmRDYXJldCA9
IG1fd2ViUGFnZS0+bWFwVG9UcmFuc2Zvcm1lZChlbmRDYXJldCk7CisgICAgICAgICAgICAgICAg
bV93ZWJQYWdlLT5jbGlwVG9UcmFuc2Zvcm1lZENvbnRlbnRzUmVjdChlbmRDYXJldCk7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlvbkhhbmRsZXI6OnNlbGVjdGlv
blBvc2l0aW9uQ2hhbmdlZCBTdGFydCBSZWN0PSVzIEVuZCBSZWN0PSVzIiwKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHN0YXJ0Q2FyZXQudG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpLCBlbmRDYXJl
dC50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgbV93ZWJQYWdlLT5tX2NsaWVudC0+
bm90aWZ5U2VsZWN0aW9uRGV0YWlsc0NoYW5nZWQoc3RhcnRDYXJldCwgZW5kQ2FyZXQsIHJlZ2lv
bik7Cit9CisKKy8vIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgbm90IGluIFdlYktpdCBjb29yZGlu
YXRlcy4KK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6Y2FyZXRQb3NpdGlvbkNoYW5nZWQoKQorewor
ICAgIERFQlVHX1NFTEVDVElPTihCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAi
U2VsZWN0aW9uSGFuZGxlcjo6Y2FyZXRQb3NpdGlvbkNoYW5nZWQiKTsKKworICAgIFdlYkNvcmU6
OkludFJlY3QgY2FyZXRMb2NhdGlvbjsKKyAgICAvLyBJZiB0aGUgaW5wdXQgZmllbGQgaXMgbm90
IGFjdGl2ZSwgd2UgbXVzdCBiZSB0dXJuaW5nIG9mZiB0aGUgY2FyZXQuCisgICAgaWYgKCFtX3dl
YlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpICYmIG1fY2FyZXRBY3RpdmUpIHsK
KyAgICAgICAgbV9jYXJldEFjdGl2ZSA9IGZhbHNlOworICAgICAgICAvLyBTZW5kIGFuIGVtcHR5
IGNhcmV0IGNoYW5nZSB0byB0dXJuIG9mZiB0aGUgY2FyZXQuCisgICAgICAgIG1fd2ViUGFnZS0+
bV9jbGllbnQtPm5vdGlmeUNhcmV0Q2hhbmdlZChjYXJldExvY2F0aW9uLCBtX3dlYlBhZ2UtPm1f
dG91Y2hFdmVudEhhbmRsZXItPmxhc3RGYXRGaW5nZXJzUmVzdWx0KCkuaXNUZXh0SW5wdXQoKSAv
KiB1c2VyVG91Y2hUcmlnZ2VyZWQgKi8pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
QVNTRVJUKG1fd2ViUGFnZSAmJiBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpICYmIG1f
d2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnNlbGVjdGlvbigpKTsKKworICAgIC8vIFRo
aXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgcmVhY2ggdGhpcyBwb2ludCBpZiBpbnB1dCBtb2RlIGlz
IGFjdGl2ZS4KKyAgICBBU1NFUlQobV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNJbnB1dE1v
ZGUoKSk7CisKKyAgICBpZiAobV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+c2VsZWN0
aW9uKCktPnNlbGVjdGlvblR5cGUoKSA9PSBWaXNpYmxlU2VsZWN0aW9uOjpDYXJldFNlbGVjdGlv
bikgeworICAgICAgICBJbnRQb2ludCBmcmFtZU9mZnNldCA9IG1fd2ViUGFnZS0+ZnJhbWVPZmZz
ZXQobV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKSk7CisKKyAgICAgICAgY2FyZXRMb2Nh
dGlvbiA9IG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnNlbGVjdGlvbigpLT5zZWxl
Y3Rpb24oKS52aXNpYmxlU3RhcnQoKS5hYnNvbHV0ZUNhcmV0Qm91bmRzKCk7CisgICAgICAgIGNh
cmV0TG9jYXRpb24ubW92ZShmcmFtZU9mZnNldC54KCksIGZyYW1lT2Zmc2V0LnkoKSk7CisKKyAg
ICAgICAgLy8gQ2xpcCBhZ2FpbnN0IHRoZSBjb250YWluaW5nIGZyYW1lIGFuZCBub2RlIGJvdW5k
YXJpZXMuCisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIHJlZ2lv
bihjYXJldExvY2F0aW9uKTsKKyAgICAgICAgY2xpcFJlZ2lvblRvVmlzaWJsZUNvbnRhaW5lcihy
ZWdpb24pOworICAgICAgICBjYXJldExvY2F0aW9uID0gcmVnaW9uLmV4dGVudHMoKTsKKyAgICB9
CisKKyAgICBtX2NhcmV0QWN0aXZlID0gIWNhcmV0TG9jYXRpb24uaXNFbXB0eSgpOworCisgICAg
REVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJTZWxl
Y3Rpb25IYW5kbGVyOjpjYXJldFBvc2l0aW9uQ2hhbmdlZCBjYXJldCBSZWN0ICVkLCAlZCwgJWR4
JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXRMb2NhdGlvbi54KCksIGNhcmV0TG9j
YXRpb24ueSgpLCBjYXJldExvY2F0aW9uLndpZHRoKCksIGNhcmV0TG9jYXRpb24uaGVpZ2h0KCkp
OworCisgICAgY2FyZXRMb2NhdGlvbiA9IG1fd2ViUGFnZS0+bWFwVG9UcmFuc2Zvcm1lZChjYXJl
dExvY2F0aW9uKTsKKyAgICBtX3dlYlBhZ2UtPmNsaXBUb1RyYW5zZm9ybWVkQ29udGVudHNSZWN0
KGNhcmV0TG9jYXRpb24pOworCisgICAgbV93ZWJQYWdlLT5tX2NsaWVudC0+bm90aWZ5Q2FyZXRD
aGFuZ2VkKGNhcmV0TG9jYXRpb24sIG1fd2ViUGFnZS0+bV90b3VjaEV2ZW50SGFuZGxlci0+bGFz
dEZhdEZpbmdlcnNSZXN1bHQoKS5pc1RleHRJbnB1dCgpIC8qIHVzZXJUb3VjaFRyaWdnZXJlZCAq
Lyk7Cit9CisKK2Jvb2wgU2VsZWN0aW9uSGFuZGxlcjo6c2VsZWN0aW9uQ29udGFpbnMoY29uc3Qg
V2ViQ29yZTo6SW50UG9pbnQmIHBvaW50KQoreworICAgIEFTU0VSVChtX3dlYlBhZ2UgJiYgbV93
ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKSAmJiBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5G
cmFtZSgpLT5zZWxlY3Rpb24oKSk7CisgICAgcmV0dXJuIG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFp
bkZyYW1lKCktPnNlbGVjdGlvbigpLT5jb250YWlucyhwb2ludCk7Cit9CisKK30KK30KZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1NlbGVjdGlvbkhh
bmRsZXIuaCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1NlbGVjdGlv
bkhhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi45OWE0NjExMjg4NWJhNGU4YzY0MDFhNWJjNjAwYzFjNTRh
YzU2ZGM4Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYktp
dFN1cHBvcnQvU2VsZWN0aW9uSGFuZGxlci5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9u
IDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg
d2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl
biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGlj
ZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBT
b2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBTZWxlY3Rp
b25IYW5kbGVyX2gKKyNkZWZpbmUgU2VsZWN0aW9uSGFuZGxlcl9oCisKKyNpbmNsdWRlICJCbGFj
a0JlcnJ5UGxhdGZvcm1JbnRSZWN0UmVnaW9uLmgiCisjaW5jbHVkZSAiQmxhY2tCZXJyeVBsYXRm
b3JtUHJpbWl0aXZlcy5oIgorCituYW1lc3BhY2UgV1RGIHsKK2NsYXNzIFN0cmluZzsKK30KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgSW50UG9pbnQ7CitjbGFzcyBJbnRSZWN0OworY2xh
c3MgTm9kZTsKK2NsYXNzIFRleHRHcmFudWxhcml0eTsKK2NsYXNzIFZpc2libGVQb3NpdGlvbjsK
K2NsYXNzIFZpc2libGVTZWxlY3Rpb247Cit9CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKKwor
bmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIFdlYlBhZ2VQcml2YXRlOworY2xhc3MgV2ViU3Ry
aW5nOworCitjbGFzcyBTZWxlY3Rpb25IYW5kbGVyIHsKK3B1YmxpYzoKKyAgICBTZWxlY3Rpb25I
YW5kbGVyKFdlYlBhZ2VQcml2YXRlKik7CisgICAgflNlbGVjdGlvbkhhbmRsZXIoKTsKKworICAg
IGJvb2wgaXNTZWxlY3Rpb25BY3RpdmUoKSB7IHJldHVybiBtX3NlbGVjdGlvbkFjdGl2ZTsgfQor
ICAgIHZvaWQgc2V0U2VsZWN0aW9uQWN0aXZlKGJvb2wgYWN0aXZlKSB7IG1fc2VsZWN0aW9uQWN0
aXZlID0gYWN0aXZlOyB9CisKKyAgICB2b2lkIGNhbmNlbFNlbGVjdGlvbigpOworICAgIFdlYlN0
cmluZyBzZWxlY3RlZFRleHQoKSBjb25zdDsKKworICAgIGJvb2wgZmluZE5leHRTdHJpbmcoY29u
c3QgV1RGOjpTdHJpbmcmLCBib29sKTsKKyAgICBib29sIHNlbGVjdGlvbkNvbnRhaW5zKGNvbnN0
IFdlYkNvcmU6OkludFBvaW50Jik7CisKKyAgICB2b2lkIHNldFNlbGVjdGlvbihjb25zdCBXZWJD
b3JlOjpJbnRQb2ludCYgc3RhcnQsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBlbmQpOworICAg
IHZvaWQgc2VsZWN0QXRQb2ludChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYpOworICAgIHZvaWQg
c2VsZWN0T2JqZWN0KGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiwgV2ViQ29yZTo6VGV4dEdyYW51
bGFyaXR5KTsKKyAgICB2b2lkIHNlbGVjdE9iamVjdChXZWJDb3JlOjpUZXh0R3JhbnVsYXJpdHkp
OworICAgIHZvaWQgc2VsZWN0T2JqZWN0KFdlYkNvcmU6Ok5vZGUqKTsKKworICAgIHZvaWQgc2Vs
ZWN0aW9uUG9zaXRpb25DaGFuZ2VkKGJvb2wgdmlzdWFsQ2hhbmdlT25seSA9IGZhbHNlKTsKKwor
ICAgIHZvaWQgc2V0Q2FyZXRQb3NpdGlvbihjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYpOworICAg
IHZvaWQgY2FyZXRQb3NpdGlvbkNoYW5nZWQoKTsKKworICAgIGJvb2wgbGFzdFVwZGF0ZWRFbmRQ
b2ludElzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtX2xhc3RVcGRhdGVkRW5kUG9pbnRJc1ZhbGlk
OyB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBnZXRDb25zb2xpZGF0ZWRSZWdpb25PZlRleHRRdWFk
c0ZvclNlbGVjdGlvbihjb25zdCBXZWJDb3JlOjpWaXNpYmxlU2VsZWN0aW9uJiwgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkludFJlY3RSZWdpb24mKSBjb25zdDsKKyAgICB2b2lkIGNsaXBSZWdpb25U
b1Zpc2libGVDb250YWluZXIoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb24mKTsK
KyAgICBib29sIHVwZGF0ZU9ySGFuZGxlSW5wdXRTZWxlY3Rpb24oV2ViQ29yZTo6VmlzaWJsZVNl
bGVjdGlvbiYgbmV3U2VsZWN0aW9uLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgcmVsYXRpdmVT
dGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGNvbnN0IFdlYkNv
cmU6OkludFBvaW50JiByZWxhdGl2ZUVuZCk7CisgICAgV2ViQ29yZTo6Tm9kZSogRE9NQ29udGFp
bmVyTm9kZUZvclZpc2libGVQb3NpdGlvbihjb25zdCBXZWJDb3JlOjpWaXNpYmxlUG9zaXRpb24m
KSBjb25zdDsKKyAgICBib29sIHNob3VsZFVwZGF0ZVNlbGVjdGlvbk9yQ2FyZXRGb3JQb2ludChj
b25zdCBXZWJDb3JlOjpJbnRQb2ludCYsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmLCBib29sIHN0
YXJ0Q2FyZXQgPSB0cnVlKSBjb25zdDsKKyAgICB1bnNpZ25lZCBzaG9ydCBleHRlbmRTZWxlY3Rp
b25Ub0ZpZWxkQm91bmRhcnkoYm9vbCBpc1N0YXJ0SGFuZGxlLCBjb25zdCBXZWJDb3JlOjpJbnRQ
b2ludCYgc2VsZWN0aW9uUG9pbnQsIFdlYkNvcmU6OlZpc2libGVTZWxlY3Rpb24mIG5ld1NlbGVj
dGlvbik7CisKKyAgICBXZWJQYWdlUHJpdmF0ZSogbV93ZWJQYWdlOworCisgICAgYm9vbCBtX3Nl
bGVjdGlvbkFjdGl2ZTsKKyAgICBib29sIG1fY2FyZXRBY3RpdmU7CisgICAgYm9vbCBtX2xhc3RV
cGRhdGVkRW5kUG9pbnRJc1ZhbGlkOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0
UmVnaW9uIG1fbGFzdFNlbGVjdGlvblJlZ2lvbjsKK307CisKK30KK30KKworI2VuZGlmIC8vIFNl
bGVjdGlvbkhhbmRsZXJfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126808</attachid>
            <date>2012-02-13 12:48:58 -0800</date>
            <delta_ts>2012-02-13 12:58:26 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78136-20120213154627.patch</filename>
            <type>text/plain</type>
            <size>46720</size>
            <attacher name="Nima Ghanavatian">nima.ghanavatian</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3MTEzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDljM2E2NmRhNThjMjhhYjI5
YzQwMjQ5YzBhNTcwYTg2YTA1N2IwNTIuLmFhNTU1MTFmMTA3YWI0YmYwNWNjMGM1YjdhZWZkNTg0
NmYwYjJmMDUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTItMDItMTMgIE5pbWEgR2hh
bmF2YXRpYW4gIDxuZ2hhbmF2YXRpYW5AcmltLmNvbT4KKworICAgICAgICBJbml0aWFsIHVwc3Ry
ZWFtaW5nIG9mIHNlbGVjdGlvbiBoYW5kbGluZyBjb2RlIGZvciBCbGFja0JlcnJ5IHBvcnQKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc4MTM2CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW5pdGlhbCB1cHN0
cmVhbWluZywgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJLaXRTdXBw
b3J0L1NlbGVjdGlvbkhhbmRsZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBibGFja2JlcnJ5L1dl
YktpdFN1cHBvcnQvU2VsZWN0aW9uSGFuZGxlci5oOiBBZGRlZC4KKwogMjAxMi0wMi0wOCAgUm9i
IEJ1aXMgIDxyYnVpc0ByaW0uY29tPgogCiAgICAgICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBE
dW1wUmVuZGVyVHJlZUJsYWNrQmVycnkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2ti
ZXJyeS9XZWJLaXRTdXBwb3J0L1NlbGVjdGlvbkhhbmRsZXIuY3BwIGIvU291cmNlL1dlYktpdC9i
bGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvU2VsZWN0aW9uSGFuZGxlci5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
YTM0MzAxNTM5MWQ0ZDI4OGZjY2U4NjMzMzVmMzY3MGY2ODIwMzc5MgotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1NlbGVjdGlvbkhhbmRs
ZXIuY3BwCkBAIC0wLDAgKzEsOTQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDEx
LCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAy
MTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTZWxl
Y3Rpb25IYW5kbGVyLmgiCisKKyNpbmNsdWRlICJET01TdXBwb3J0LmgiCisjaW5jbHVkZSAiRG9j
dW1lbnQuaCIKKyNpbmNsdWRlICJFZGl0b3IuaCIKKyNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIK
KyNpbmNsdWRlICJGYXRGaW5nZXJzLmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJG
cmFtZVNlbGVjdGlvbi5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxB
bmNob3JFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTEFyZWFFbGVtZW50LmgiCisjaW5jbHVkZSAi
SGl0VGVzdFJlc3VsdC5oIgorI2luY2x1ZGUgIklucHV0SGFuZGxlci5oIgorI2luY2x1ZGUgIklu
dFJlY3QuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUmVuZGVyUGFydC5oIgorI2lu
Y2x1ZGUgIlRleHRHcmFudWxhcml0eS5oIgorI2luY2x1ZGUgIlRvdWNoRXZlbnRIYW5kbGVyLmgi
CisjaW5jbHVkZSAiV2ViUGFnZS5oIgorI2luY2x1ZGUgIldlYlBhZ2VDbGllbnQuaCIKKyNpbmNs
dWRlICJXZWJQYWdlX3AuaCIKKworI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCisjaW5jbHVkZSAi
dmlzaWJsZV91bml0cy5oIgorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtSW50UmVjdFJl
Z2lvbi5oPgorCisjaW5jbHVkZSA8c3lzL2tleWNvZGVzLmg+CisKKyNkZWZpbmUgU0hPV0RFQlVH
X1NFTEVDVElPTkhBTkRMRVIgMAorCisjaWYgU0hPV0RFQlVHX1NFTEVDVElPTkhBTkRMRVIKKyNk
ZWZpbmUgREVCVUdfU0VMRUNUSU9OKHNldmVyaXR5LCBmb3JtYXQsIC4uLikgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OmxvZ0Fsd2F5cyhzZXZlcml0eSwgZm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykKKyNl
bHNlCisjZGVmaW5lIERFQlVHX1NFTEVDVElPTihzZXZlcml0eSwgZm9ybWF0LCAuLi4pCisjZW5k
aWYgLy8gU0hPV0RFQlVHX1NFTEVDVElPTkhBTkRMRVIKKwordXNpbmcgbmFtZXNwYWNlIFdlYkNv
cmU7CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworCitTZWxl
Y3Rpb25IYW5kbGVyOjpTZWxlY3Rpb25IYW5kbGVyKFdlYlBhZ2VQcml2YXRlKiBwYWdlKQorICAg
IDogbV93ZWJQYWdlKHBhZ2UpCisgICAgLCBtX3NlbGVjdGlvbkFjdGl2ZShmYWxzZSkKKyAgICAs
IG1fY2FyZXRBY3RpdmUoZmFsc2UpCisgICAgLCBtX2xhc3RVcGRhdGVkRW5kUG9pbnRJc1ZhbGlk
KGZhbHNlKQoreworfQorCitTZWxlY3Rpb25IYW5kbGVyOjp+U2VsZWN0aW9uSGFuZGxlcigpCit7
Cit9CisKK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6Y2FuY2VsU2VsZWN0aW9uKCkKK3sKKyAgICBt
X3NlbGVjdGlvbkFjdGl2ZSA9IGZhbHNlOworICAgIG1fbGFzdFNlbGVjdGlvblJlZ2lvbiA9IEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uKCk7CisKKyAgICBERUJVR19TRUxFQ1RJ
T04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlvbkhhbmRsZXI6
OmNhbmNlbFNlbGVjdGlvbiIpOworCisgICAgaWYgKG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXIt
PmlzSW5wdXRNb2RlKCkpCisgICAgICAgIG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXItPmNhbmNl
bFNlbGVjdGlvbigpOworICAgIGVsc2UKKyAgICAgICAgbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWlu
RnJhbWUoKS0+c2VsZWN0aW9uKCktPmNsZWFyKCk7Cit9CisKK1dlYlN0cmluZyBTZWxlY3Rpb25I
YW5kbGVyOjpzZWxlY3RlZFRleHQoKSBjb25zdAoreworICAgIHJldHVybiBtX3dlYlBhZ2UtPmZv
Y3VzZWRPck1haW5GcmFtZSgpLT5lZGl0b3IoKS0+c2VsZWN0ZWRUZXh0KCk7Cit9CisKK2Jvb2wg
U2VsZWN0aW9uSGFuZGxlcjo6ZmluZE5leHRTdHJpbmcoY29uc3QgV1RGOjpTdHJpbmcmIHNlYXJj
aFN0cmluZywgYm9vbCBmb3J3YXJkKQoreworICAgIGlmIChzZWFyY2hTdHJpbmcuaXNFbXB0eSgp
KSB7CisgICAgICAgIGNhbmNlbFNlbGVjdGlvbigpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgQVNTRVJUKG1fd2ViUGFnZS0+bV9wYWdlKTsKKworICAgIG1fd2ViUGFnZS0+
bV9wYWdlLT51bm1hcmtBbGxUZXh0TWF0Y2hlcygpOworCisgICAgYm9vbCByZXN1bHQgPSBtX3dl
YlBhZ2UtPm1fcGFnZS0+ZmluZFN0cmluZyhzZWFyY2hTdHJpbmcsIFdURjo6VGV4dENhc2VJbnNl
bnNpdGl2ZSwgZm9yd2FyZCA/IEZpbmREaXJlY3Rpb25Gb3J3YXJkIDogRmluZERpcmVjdGlvbkJh
Y2t3YXJkLCB0cnVlIC8qIHNob3VsZCB3cmFwICovKTsKKyAgICBpZiAocmVzdWx0ICYmIG1fd2Vi
UGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnNlbGVjdGlvbigpLT5zZWxlY3Rpb25UeXBlKCkg
PT0gVmlzaWJsZVNlbGVjdGlvbjo6Tm9TZWxlY3Rpb24pIHsKKyAgICAgICAgLy8gV29yZCB3YXMg
Zm91bmQgYnV0IGNvdWxkIG5vdCBiZSBzZWxlY3RlZCBvbiB0aGlzIHBhZ2UuCisgICAgICAgIHJl
c3VsdCA9IG1fd2ViUGFnZS0+bV9wYWdlLT5tYXJrQWxsTWF0Y2hlc0ZvclRleHQoc2VhcmNoU3Ry
aW5nLCBXVEY6OlRleHRDYXNlSW5zZW5zaXRpdmUsIHRydWUgLyogc2hvdWxkIGhpZ2hsaWdodCAq
LywgMCAvKiBsaW1pdCB0byBtYXRjaCAwID0gdW5saW1pdGVkICovKTsKKyAgICB9CisKKyAgICAv
LyBEZWZvY3VzIHRoZSBpbnB1dCBmaWVsZCBpZiBvbmUgaXMgYWN0aXZlLgorICAgIGlmIChtX3dl
YlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpKQorICAgICAgICBtX3dlYlBhZ2Ut
Pm1faW5wdXRIYW5kbGVyLT5ub2RlRm9jdXNlZCgwKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9
CisKK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6Z2V0Q29uc29saWRhdGVkUmVnaW9uT2ZUZXh0UXVh
ZHNGb3JTZWxlY3Rpb24oY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYgc2VsZWN0aW9uLCBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiYgcmVnaW9uKSBjb25zdAoreworICAgIEFTU0VS
VChyZWdpb24uaXNFbXB0eSgpKTsKKworICAgIGlmICghc2VsZWN0aW9uLmlzUmFuZ2UoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKHNlbGVjdGlvbi5maXJzdFJhbmdlKCkpOworCisg
ICAgVmVjdG9yPEZsb2F0UXVhZD4gcXVhZExpc3Q7CisgICAgRE9NU3VwcG9ydDo6dmlzaWJsZVRl
eHRRdWFkcygqKHNlbGVjdGlvbi5maXJzdFJhbmdlKCkpLCBxdWFkTGlzdCwgdHJ1ZSAvKiB1c2Ug
c2VsZWN0aW9uIGhlaWdodCAqLyk7CisKKyAgICBpZiAoIXF1YWRMaXN0LmlzRW1wdHkoKSkgewor
ICAgICAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZy
YW1lKCktPnZpZXcoKTsKKworICAgICAgICAvLyBmcmFtZVJlY3QgaXMgaW4gZnJhbWUgY29vcmRp
bmF0ZXMuCisgICAgICAgIEludFJlY3QgZnJhbWVSZWN0KEludFBvaW50KDAsIDApLCBmcmFtZVZp
ZXctPmNvbnRlbnRzU2l6ZSgpKTsKKworICAgICAgICAvLyBmcmFtZVBvc2l0aW9uIGlzIGluIG1h
aW4gZnJhbWUgY29vcmRpbmF0ZXMuCisgICAgICAgIEludFBvaW50IGZyYW1lUG9zaXRpb24gPSBt
X3dlYlBhZ2UtPmZyYW1lT2Zmc2V0KG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkpOwor
CisgICAgICAgIC8vIFRoZSByYW5nZXMgcmVjdCBsaXN0IGlzIGJhc2VkIG9uIHJlbmRlciBlbGVt
ZW50cyBhbmQgbWF5IGluY2x1ZGUgbXVsdGlwbGUgYWRqYWNlbnQgcmVjdHMuCisgICAgICAgIC8v
IFVzZSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiB0byBjb25zb2xpZGF0ZSB0
aGVzZSByZWN0cyBpbnRvIGJhbmRzIGFzIHdlbGwgYXMgYSBjb250YWluZXIgdG8gcGFzcworICAg
ICAgICAvLyB0byB0aGUgY2xpZW50LgorCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBxdWFkTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgSW50UmVjdCBlbmNsb3NpbmdS
ZWN0ID0gcXVhZExpc3RbaV0uZW5jbG9zaW5nQm91bmRpbmdCb3goKTsKKyAgICAgICAgICAgIGVu
Y2xvc2luZ1JlY3QuaW50ZXJzZWN0KGZyYW1lUmVjdCk7CisgICAgICAgICAgICBlbmNsb3NpbmdS
ZWN0Lm1vdmUoZnJhbWVQb3NpdGlvbi54KCksIGZyYW1lUG9zaXRpb24ueSgpKTsKKyAgICAgICAg
ICAgIHJlZ2lvbiA9IHVuaW9uUmVnaW9ucyhyZWdpb24sIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJ
bnRSZWN0UmVnaW9uKGVuY2xvc2luZ1JlY3QpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3Rh
dGljIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zaXRpb25Gb3JQb2ludElnbm9yaW5nQ2xpcHBp
bmcoY29uc3QgRnJhbWUmIGZyYW1lLCBjb25zdCBJbnRQb2ludCYgZnJhbWVQb2ludCkKK3sKKyAg
ICAvLyBGcmFtZTo6dmlzaWJsZVBvc2l0aW9uQXRQb2ludCBoYXJkLWNvZGVzIGlnbm9yZUNsaXBw
aW5nPWZhbHNlIGluIHRoZQorICAgIC8vIGNhbGwgdG8gaGl0VGVzdFJlc3VsdEF0UG9pbnQuIFRo
aXMgaGFzIGEgYnVnIHdoZXJlIHNvbWUgcGFnZXMgKHN1Y2ggYXMKKyAgICAvLyBtZXRhZmlsdGVy
KSB3aWxsIHJldHVybiB0aGUgd3JvbmcgVmlzaWJsZVBvc2l0aW9uIGZvciBwb2ludHMgdGhhdCBh
cmUKKyAgICAvLyBvdXRzaWRlIHRoZSB2aXNpYmxlIHJlY3QuIFRvIHdvcmsgYXJvdW5kIHRoZSBi
dWcsIHRoaXMgaXMgYSBjb3B5IG9mCisgICAgLy8gdmlzaWJsZVBvc2l0aW9uQXRQb2ludCB3aGlj
aCB3aGljaCBwYXNzZXMgaWdub3JlQ2xpcHBpbmc9dHJ1ZS4KKyAgICAvLyBTZWUgUklNIEJ1ZyAj
NDMxNS4KKyAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdCA9IGZyYW1lLmV2ZW50SGFuZGxlcigpLT5o
aXRUZXN0UmVzdWx0QXRQb2ludChmcmFtZVBvaW50LCB0cnVlIC8qIGFsbG93U2hhZG93Q29udGVu
dCAqLywgdHJ1ZSAvKiBpZ25vcmVDbGlwcGluZyAqLyk7CisKKyAgICBOb2RlKiBub2RlID0gcmVz
dWx0LmlubmVyTm9kZSgpOworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIFZpc2libGVQ
b3NpdGlvbigpOworCisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVy
KCk7CisgICAgaWYgKCFyZW5kZXJlcikKKyAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigp
OworCisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3MgPSByZW5kZXJlci0+cG9zaXRpb25G
b3JQb2ludChyZXN1bHQubG9jYWxQb2ludCgpKTsKKyAgICBpZiAodmlzaWJsZVBvcy5pc051bGwo
KSkKKyAgICAgICAgdmlzaWJsZVBvcyA9IFZpc2libGVQb3NpdGlvbihQb3NpdGlvbihjcmVhdGVM
ZWdhY3lFZGl0aW5nUG9zaXRpb24obm9kZSwgMCkpKTsKKworICAgIHJldHVybiB2aXNpYmxlUG9z
OworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZGlyZWN0aW9uT2ZQb2ludFJlbGF0aXZlVG9S
ZWN0KGNvbnN0IEludFBvaW50JiBwb2ludCwgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBB
U1NFUlQoIXJlY3QuY29udGFpbnMocG9pbnQpKTsKKworICAgIC8vIFBhZGRpbmcgdG8gcHJldmVu
dCBhY2NpZGVudGFsIHRyaWdnZXIgb2YgdXAvZG93biB3aGVuIGludGVuZGluZyB0byBkbyBob3Jp
em9udGFsIG1vdmVtZW50LgorICAgIGNvbnN0IGludCB2ZXJ0aWNhbFBhZGRpbmcgPSA1OworCisg
ICAgLy8gRG8gaGVpZ2h0IG1vdmVtZW50IGNoZWNrIGZpcnN0IGJ1dCBhZGQgcGFkZGluZy4gV2Ug
bWF5IGJlIG9mZiBvbiBib3RoIHggJiB5IGF4aXMgYW5kIG9ubHkKKyAgICAvLyB3YW50IHRvIG1v
dmUgaW4gb25lIGRpcmVjdGlvbiBhdCBhIHRpbWUuCisgICAgaWYgKHBvaW50LnkoKSArIHZlcnRp
Y2FsUGFkZGluZyA8IHJlY3QueSgpKQorICAgICAgICByZXR1cm4gS0VZQ09ERV9VUDsKKyAgICBp
ZiAocG9pbnQueSgpID4gcmVjdC5tYXhZKCkgKyB2ZXJ0aWNhbFBhZGRpbmcpCisgICAgICAgIHJl
dHVybiBLRVlDT0RFX0RPV047CisgICAgaWYgKHBvaW50LngoKSA8IHJlY3QubG9jYXRpb24oKS54
KCkpCisgICAgICAgIHJldHVybiBLRVlDT0RFX0xFRlQ7CisgICAgaWYgKHBvaW50LngoKSA+IHJl
Y3QubWF4WCgpKQorICAgICAgICByZXR1cm4gS0VZQ09ERV9SSUdIVDsKKworICAgIHJldHVybiAw
OworfQorCitib29sIFNlbGVjdGlvbkhhbmRsZXI6OnNob3VsZFVwZGF0ZVNlbGVjdGlvbk9yQ2Fy
ZXRGb3JQb2ludChjb25zdCBJbnRQb2ludCYgcG9pbnQsIGNvbnN0IEludFJlY3QmIGNhcmV0UmVj
dCwgYm9vbCBzdGFydENhcmV0KSBjb25zdAoreworICAgIEFTU0VSVChtX3dlYlBhZ2UtPm1faW5w
dXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpKTsKKworICAgIC8vIElmIHRoZSBwb2ludCBpc24ndCB2
YWxpZCBkb24ndCBibG9jayBjaGFuZ2UgYXMgaXQgaXMgbm90IGFjdHVhbGx5IGNoYW5naW5nLgor
ICAgIGlmIChwb2ludCA9PSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgVmlzaWJsZVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gbV93ZWJQ
YWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+c2VsZWN0aW9uKCktPnNlbGVjdGlvbigpOworCisg
ICAgLy8gSWYgdGhlIGlucHV0IGZpZWxkIGlzIHNpbmdsZSBsaW5lIG9yIHdlIGFyZSBvbiB0aGUg
Zmlyc3Qgb3IgbGFzdAorICAgIC8vIGxpbmUgb2YgYSBtdWx0aWxpbmUgaW5wdXQgZmllbGQgb25s
eSBob3Jpem9udGFsIG1vdmVtZW50IGlzIHN1cHBvcnRlZC4KKyAgICBib29sIGFib3ZlQ2FyZXQg
PSBwb2ludC55KCkgPCBjYXJldFJlY3QueSgpOworICAgIGJvb2wgYmVsb3dDYXJldCA9IHBvaW50
LnkoKSA+PSBjYXJldFJlY3QubWF4WSgpOworCisgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJTZWxlY3Rpb25IYW5kbGVyOjpzaG91bGRVcGRh
dGVTZWxlY3Rpb25PckNhcmV0Rm9yUG9pbnQgbXVsdGlsaW5lID0gJXMgYWJvdmUgPSAlcyBiZWxv
dyA9ICVzIGZpcnN0IGxpbmUgPSAlcyBsYXN0IGxpbmUgPSAlcyBzdGFydCA9ICVzIFxuIgorICAg
ICAgICAgICAgLCBtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc011bHRpbGluZUlucHV0TW9k
ZSgpID8gInRydWUiIDogImZhbHNlIiwgYWJvdmVDYXJldCA/ICJ0cnVlIiA6ICJmYWxzZSIsIGJl
bG93Q2FyZXQgPyAidHJ1ZSIgOiAiZmFsc2UiCisgICAgICAgICAgICAsIGluU2FtZUxpbmUoY3Vy
cmVudFNlbGVjdGlvbi52aXNpYmxlU3RhcnQoKSwgc3RhcnRPZkVkaXRhYmxlQ29udGVudChjdXJy
ZW50U2VsZWN0aW9uLnZpc2libGVTdGFydCgpKSkgPyAidHJ1ZSIgOiAiZmFsc2UiCisgICAgICAg
ICAgICAsIGluU2FtZUxpbmUoY3VycmVudFNlbGVjdGlvbi52aXNpYmxlRW5kKCksIGVuZE9mRWRp
dGFibGVDb250ZW50KGN1cnJlbnRTZWxlY3Rpb24udmlzaWJsZUVuZCgpKSkgPyAidHJ1ZSIgOiAi
ZmFsc2UiCisgICAgICAgICAgICAsIHN0YXJ0Q2FyZXQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKwor
ICAgIGlmICghbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNNdWx0aWxpbmVJbnB1dE1vZGUo
KSAmJiAoYWJvdmVDYXJldCB8fCBiZWxvd0NhcmV0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIGlmIChzdGFydENhcmV0ICYmIGluU2FtZUxpbmUoY3VycmVudFNlbGVjdGlvbi52aXNpYmxl
U3RhcnQoKSwgc3RhcnRPZkVkaXRhYmxlQ29udGVudChjdXJyZW50U2VsZWN0aW9uLnZpc2libGVT
dGFydCgpKSkgJiYgYWJvdmVDYXJldCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICgh
c3RhcnRDYXJldCAmJiBpblNhbWVMaW5lKGN1cnJlbnRTZWxlY3Rpb24udmlzaWJsZUVuZCgpLCBl
bmRPZkVkaXRhYmxlQ29udGVudChjdXJyZW50U2VsZWN0aW9uLnZpc2libGVFbmQoKSkpICYmIGJl
bG93Q2FyZXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQor
Cit2b2lkIFNlbGVjdGlvbkhhbmRsZXI6OnNldENhcmV0UG9zaXRpb24oY29uc3QgSW50UG9pbnQg
JnBvc2l0aW9uKQoreworICAgIGlmICghbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNJbnB1
dE1vZGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9jYXJldEFjdGl2ZSA9IHRydWU7CisK
KyAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywg
IlNlbGVjdGlvbkhhbmRsZXI6OnNldENhcmV0UG9zaXRpb24gcmVxdWVzdGVkIHBvaW50ICVkLCAl
ZCIsIHBvc2l0aW9uLngoKSwgcG9zaXRpb24ueSgpKTsKKworICAgIEZyYW1lKiBmb2N1c2VkRnJh
bWUgPSBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIEZyYW1lU2VsZWN0aW9u
KiBjb250cm9sbGVyID0gZm9jdXNlZEZyYW1lLT5zZWxlY3Rpb24oKTsKKyAgICBJbnRQb2ludCBy
ZWxhdGl2ZVBvaW50ID0gRE9NU3VwcG9ydDo6Y29udmVydFBvaW50VG9GcmFtZShtX3dlYlBhZ2Ut
Pm1haW5GcmFtZSgpLCBmb2N1c2VkRnJhbWUsIHBvc2l0aW9uKTsKKyAgICBJbnRSZWN0IGN1cnJl
bnRDYXJldFJlY3QgPSBjb250cm9sbGVyLT5zZWxlY3Rpb24oKS52aXNpYmxlU3RhcnQoKS5hYnNv
bHV0ZUNhcmV0Qm91bmRzKCk7CisKKyAgICBpZiAocmVsYXRpdmVQb2ludCA9PSBET01TdXBwb3J0
OjpJbnZhbGlkUG9pbnQgfHwgIXNob3VsZFVwZGF0ZVNlbGVjdGlvbk9yQ2FyZXRGb3JQb2ludChy
ZWxhdGl2ZVBvaW50LCBjdXJyZW50Q2FyZXRSZWN0KSkgeworICAgICAgICBzZWxlY3Rpb25Qb3Np
dGlvbkNoYW5nZWQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZpc2libGVQb3Np
dGlvbiB2aXNpYmxlQ2FyZXRQb3NpdGlvbihmb2N1c2VkRnJhbWUtPnZpc2libGVQb3NpdGlvbkZv
clBvaW50KHJlbGF0aXZlUG9pbnQpKTsKKworICAgIGlmICghRE9NU3VwcG9ydDo6aXNQb3NpdGlv
bkluTm9kZShtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5kb2N1bWVudCgpLT5mb2N1
c2VkTm9kZSgpLCB2aXNpYmxlQ2FyZXRQb3NpdGlvbi5kZWVwRXF1aXZhbGVudCgpKSkgeworICAg
ICAgICBpZiAodW5zaWduZWQgc2hvcnQgY2hhcmFjdGVyID0gZGlyZWN0aW9uT2ZQb2ludFJlbGF0
aXZlVG9SZWN0KHJlbGF0aXZlUG9pbnQsIGN1cnJlbnRDYXJldFJlY3QpKQorICAgICAgICAgICAg
bV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aGFuZGxlTmF2aWdhdGlvbk1vdmUoY2hhcmFjdGVy
LCBmYWxzZSAvKiBzaGlmdERvd24gKi8sIGZhbHNlIC8qIGFsdERvd24gKi8sIGZhbHNlIC8qIGNh
bkV4aXRGaWVsZCAqLyk7CisKKyAgICAgICAgc2VsZWN0aW9uUG9zaXRpb25DaGFuZ2VkKCk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWaXNpYmxlU2VsZWN0aW9uIG5ld1NlbGVjdGlv
bih2aXNpYmxlQ2FyZXRQb3NpdGlvbik7CisgICAgaWYgKGNvbnRyb2xsZXItPnNlbGVjdGlvbigp
ID09IG5ld1NlbGVjdGlvbikgeworICAgICAgICBzZWxlY3Rpb25Qb3NpdGlvbkNoYW5nZWQoKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnRyb2xsZXItPnNldFNlbGVjdGlvbihu
ZXdTZWxlY3Rpb24pOworCisgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpMb2dMZXZlbEluZm8sICJTZWxlY3Rpb25IYW5kbGVyOjpzZXRDYXJldFBvc2l0aW9uIHBvaW50
IHZhbGlkLCBjdXJzb3IgdXBkYXRlZCIpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIG1ha2VzIHN1
cmUgd2UgYXJlIG5vdCByZWR1Y2luZyB0aGUgc2VsZWN0aW9uIHRvIGEgY2FyZXQgc2VsZWN0aW9u
Lgorc3RhdGljIGJvb2wgc2hvdWxkRXh0ZW5kU2VsZWN0aW9uSW5EaXJlY3Rpb24oY29uc3QgVmlz
aWJsZVNlbGVjdGlvbiYgc2VsZWN0aW9uLCB1bnNpZ25lZCBzaG9ydCBjaGFyYWN0ZXIpCit7Cisg
ICAgRnJhbWVTZWxlY3Rpb24gdGVtcFNlbGVjdGlvbjsKKyAgICB0ZW1wU2VsZWN0aW9uLnNldFNl
bGVjdGlvbihzZWxlY3Rpb24pOworICAgIHN3aXRjaCAoY2hhcmFjdGVyKSB7CisgICAgY2FzZSBL
RVlDT0RFX0xFRlQ6CisgICAgICAgIHRlbXBTZWxlY3Rpb24ubW9kaWZ5KEZyYW1lU2VsZWN0aW9u
OjpBbHRlcmF0aW9uRXh0ZW5kLCBEaXJlY3Rpb25MZWZ0LCBDaGFyYWN0ZXJHcmFudWxhcml0eSk7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0VZQ09ERV9SSUdIVDoKKyAgICAgICAgdGVtcFNl
bGVjdGlvbi5tb2RpZnkoRnJhbWVTZWxlY3Rpb246OkFsdGVyYXRpb25FeHRlbmQsIERpcmVjdGlv
blJpZ2h0LCBDaGFyYWN0ZXJHcmFudWxhcml0eSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
S0VZQ09ERV9VUDoKKyAgICAgICAgdGVtcFNlbGVjdGlvbi5tb2RpZnkoRnJhbWVTZWxlY3Rpb246
OkFsdGVyYXRpb25FeHRlbmQsIERpcmVjdGlvbkJhY2t3YXJkLCBMaW5lR3JhbnVsYXJpdHkpOwor
ICAgICAgICBicmVhazsKKyAgICBjYXNlIEtFWUNPREVfRE9XTjoKKyAgICAgICAgdGVtcFNlbGVj
dGlvbi5tb2RpZnkoRnJhbWVTZWxlY3Rpb246OkFsdGVyYXRpb25FeHRlbmQsIERpcmVjdGlvbkZv
cndhcmQsIExpbmVHcmFudWxhcml0eSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6Cisg
ICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICgoY2hhcmFjdGVyID09IEtFWUNPREVfTEVG
VCB8fCBjaGFyYWN0ZXIgPT0gS0VZQ09ERV9SSUdIVCkKKyAgICAgICAgJiYgKCFpblNhbWVMaW5l
KHNlbGVjdGlvbi52aXNpYmxlU3RhcnQoKSwgdGVtcFNlbGVjdGlvbi5zZWxlY3Rpb24oKS52aXNp
YmxlU3RhcnQoKSkKKyAgICAgICAgICAgfHwgIWluU2FtZUxpbmUoc2VsZWN0aW9uLnZpc2libGVF
bmQoKSwgdGVtcFNlbGVjdGlvbi5zZWxlY3Rpb24oKS52aXNpYmxlRW5kKCkpKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRlbXBTZWxlY3Rpb24uc2VsZWN0aW9uKCkuc2Vs
ZWN0aW9uVHlwZSgpID09IFZpc2libGVTZWxlY3Rpb246OlJhbmdlU2VsZWN0aW9uOworfQorCitz
dGF0aWMgVmlzaWJsZVBvc2l0aW9uIGRpcmVjdGlvbmFsVmlzaWJsZVBvc2l0aW9uQXRFeHRlbnRP
ZkJveChGcmFtZSogZnJhbWUsIGNvbnN0IEludFJlY3QmIGJvdW5kaW5nQm94LCB1bnNpZ25lZCBz
aG9ydCBkaXJlY3Rpb24sIGNvbnN0IEludFBvaW50JiBiYXNlUG9pbnQpCit7CisgICAgQVNTRVJU
KGZyYW1lKTsKKworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRp
b24oKTsKKworICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7CisgICAgY2FzZSBLRVlDT0RFX0xFRlQ6
CisgICAgICAgIC8vIEV4dGVuZCB4IHRvIHN0YXJ0IHdpdGhvdXQgbW9kaWZ5aW5nIHkuCisgICAg
ICAgIHJldHVybiBmcmFtZS0+dmlzaWJsZVBvc2l0aW9uRm9yUG9pbnQoSW50UG9pbnQoYm91bmRp
bmdCb3gueCgpLCBiYXNlUG9pbnQueSgpKSk7CisgICAgY2FzZSBLRVlDT0RFX1JJR0hUOgorICAg
ICAgICAvLyBFeHRlbmQgeCB0byBlbmQgd2l0aG91dCBtb2RpZnlpbmcgeS4KKyAgICAgICAgcmV0
dXJuIGZyYW1lLT52aXNpYmxlUG9zaXRpb25Gb3JQb2ludChJbnRQb2ludChib3VuZGluZ0JveC5t
YXhYKCksIGJhc2VQb2ludC55KCkpKTsKKyAgICBjYXNlIEtFWUNPREVfVVA6CisgICAgICAgIC8v
IEV4dGVuZCB5IHRvIHRvcCB3aXRob3V0IG1vZGlmeWluZyB4LgorICAgICAgICByZXR1cm4gZnJh
bWUtPnZpc2libGVQb3NpdGlvbkZvclBvaW50KEludFBvaW50KGJhc2VQb2ludC54KCksIGJvdW5k
aW5nQm94LnkoKSkpOworICAgIGNhc2UgS0VZQ09ERV9ET1dOOgorICAgICAgICAvLyBFeHRlbmQg
eSB0byBib3R0b20gd2l0aG91dCBtb2RpZnlpbmcgeC4KKyAgICAgICAgcmV0dXJuIGZyYW1lLT52
aXNpYmxlUG9zaXRpb25Gb3JQb2ludChJbnRQb2ludChiYXNlUG9pbnQueCgpLCBib3VuZGluZ0Jv
eC5tYXhZKCkpKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBy
ZXR1cm4gZnJhbWUtPnZpc2libGVQb3NpdGlvbkZvclBvaW50KEludFBvaW50KGJhc2VQb2ludC54
KCksIGJhc2VQb2ludC55KCkpKTsKK30KKworc3RhdGljIGJvb2wgcG9pbnRJc091dHNpZGVPZkJv
dW5kaW5nQm94SW5EaXJlY3Rpb24odW5zaWduZWQgZGlyZWN0aW9uLCBjb25zdCBJbnRQb2ludCYg
c2VsZWN0aW9uUG9pbnQsIGNvbnN0IEludFJlY3QmIGJvdW5kaW5nQm94KQoreworICAgIGlmICgo
ZGlyZWN0aW9uID09IEtFWUNPREVfTEVGVCAmJiBzZWxlY3Rpb25Qb2ludC54KCkgPCBib3VuZGlu
Z0JveC54KCkpCisgICAgICAgIHx8IChkaXJlY3Rpb24gPT0gS0VZQ09ERV9VUCAmJiBzZWxlY3Rp
b25Qb2ludC55KCkgPCBib3VuZGluZ0JveC55KCkpCisgICAgICAgIHx8IChkaXJlY3Rpb24gPT0g
S0VZQ09ERV9SSUdIVCAmJiBzZWxlY3Rpb25Qb2ludC54KCkgPiBib3VuZGluZ0JveC5tYXhYKCkp
CisgICAgICAgIHx8IChkaXJlY3Rpb24gPT0gS0VZQ09ERV9ET1dOICYmIHNlbGVjdGlvblBvaW50
LnkoKSA+IGJvdW5kaW5nQm94Lm1heFkoKSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAg
cmV0dXJuIGZhbHNlOworfQorCit1bnNpZ25lZCBzaG9ydCBTZWxlY3Rpb25IYW5kbGVyOjpleHRl
bmRTZWxlY3Rpb25Ub0ZpZWxkQm91bmRhcnkoYm9vbCBpc1N0YXJ0SGFuZGxlLCBjb25zdCBJbnRQ
b2ludCYgc2VsZWN0aW9uUG9pbnQsIFZpc2libGVTZWxlY3Rpb24mIG5ld1NlbGVjdGlvbikKK3sK
KyAgICBGcmFtZSogZm9jdXNlZEZyYW1lID0gbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUo
KTsKKyAgICBpZiAoIWZvY3VzZWRGcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKSB8fCAh
Zm9jdXNlZEZyYW1lLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpLT5yZW5kZXJlcigpKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIEZyYW1lU2VsZWN0aW9uKiBjb250cm9sbGVyID0gZm9jdXNl
ZEZyYW1lLT5zZWxlY3Rpb24oKTsKKworICAgIEludFJlY3QgY2FyZXRSZWN0ID0gaXNTdGFydEhh
bmRsZSA/IGNvbnRyb2xsZXItPnNlbGVjdGlvbigpLnZpc2libGVTdGFydCgpLmFic29sdXRlQ2Fy
ZXRCb3VuZHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbnRy
b2xsZXItPnNlbGVjdGlvbigpLnZpc2libGVFbmQoKS5hYnNvbHV0ZUNhcmV0Qm91bmRzKCk7CisK
KyAgICBJbnRSZWN0IG5vZGVCb3VuZGluZ0JveCA9IGZvY3VzZWRGcmFtZS0+ZG9jdW1lbnQoKS0+
Zm9jdXNlZE5vZGUoKS0+cmVuZGVyZXIoKS0+YWJzb2x1dGVCb3VuZGluZ0JveFJlY3QoKTsKKwor
ICAgIC8vIFN0YXJ0IGhhbmRsZSBpcyBvdXRzaWRlIG9mIHRoZSBmaWVsZC4gVHJlYXQgaXQgYXMg
dGhlIGNoYW5nZWQgaGFuZGxlIGFuZCBtb3ZlCisgICAgLy8gcmVsYXRpdmUgdG8gdGhlIHN0YXJ0
IGNhcmV0IHJlY3QuCisgICAgdW5zaWduZWQgc2hvcnQgY2hhcmFjdGVyID0gZGlyZWN0aW9uT2ZQ
b2ludFJlbGF0aXZlVG9SZWN0KHNlbGVjdGlvblBvaW50LCBjYXJldFJlY3QpOworCisgICAgLy8g
UHJldmVudCBpbmNvcnJlY3QgbW92ZW1lbnQsIGhhbmRsZXMgY2FuIG9ubHkgZXh0ZW5kIHRoZSBz
ZWxlY3Rpb24gdGhpcyB3YXkKKyAgICAvLyB0byBwcmV2ZW50IGludmVyc2lvbiBvZiB0aGUgaGFu
ZGxlcy4KKyAgICBpZiAoaXNTdGFydEhhbmRsZSAmJiAoY2hhcmFjdGVyID09IEtFWUNPREVfUklH
SFQgfHwgY2hhcmFjdGVyID09IEtFWUNPREVfRE9XTikKKyAgICAgICAgfHwgIWlzU3RhcnRIYW5k
bGUgJiYgKGNoYXJhY3RlciA9PSBLRVlDT0RFX0xFRlQgfHwgY2hhcmFjdGVyID09IEtFWUNPREVf
VVApKQorICAgICAgICBjaGFyYWN0ZXIgPSAwOworCisgICAgVmlzaWJsZVBvc2l0aW9uIG5ld1Zp
c2libGVQb3NpdGlvbiA9IGNvbnRyb2xsZXItPnNlbGVjdGlvbigpLnN0YXJ0KCk7CisgICAgLy8g
RXh0ZW5kIHRoZSBzZWxlY3Rpb24gdG8gdGhlIGJvdW5kcyBvZiB0aGUgYm94IGJlZm9yZSBkb2lu
ZyBpbmNyZW1lbnRhbCBzY3JvbGwgaWYgdGhlIHBvaW50IGlzIG91dHNpZGUgdGhlIG5vZGUuCisg
ICAgLy8gRG9uJ3QgZXh0ZW5kIHNlbGVjdGlvbiBhbmQgaGFuZGxlIHRoZSBjaGFyYWN0ZXIgYXQg
dGhlIHNhbWUgdGltZS4KKyAgICBpZiAocG9pbnRJc091dHNpZGVPZkJvdW5kaW5nQm94SW5EaXJl
Y3Rpb24oY2hhcmFjdGVyLCBzZWxlY3Rpb25Qb2ludCwgbm9kZUJvdW5kaW5nQm94KSkKKyAgICAg
ICAgbmV3VmlzaWJsZVBvc2l0aW9uID0gZGlyZWN0aW9uYWxWaXNpYmxlUG9zaXRpb25BdEV4dGVu
dE9mQm94KGZvY3VzZWRGcmFtZSwgbm9kZUJvdW5kaW5nQm94LCBjaGFyYWN0ZXIsIHNlbGVjdGlv
blBvaW50KTsKKworICAgIGlmIChpc1N0YXJ0SGFuZGxlKQorICAgICAgICBuZXdTZWxlY3Rpb24g
PSBWaXNpYmxlU2VsZWN0aW9uKG5ld1Zpc2libGVQb3NpdGlvbiwgbmV3U2VsZWN0aW9uLnZpc2li
bGVFbmQoKSwgdHJ1ZSAvKmlzRGlyZWN0aW9uYWwqLyk7CisgICAgZWxzZQorICAgICAgICBuZXdT
ZWxlY3Rpb24gPSBWaXNpYmxlU2VsZWN0aW9uKG5ld1NlbGVjdGlvbi52aXNpYmxlU3RhcnQoKSwg
bmV3VmlzaWJsZVBvc2l0aW9uLCB0cnVlIC8qaXNEaXJlY3Rpb25hbCovKTsKKworICAgIC8vIElm
IG5vIHNlbGVjdGlvbiB3aWxsIGJlIGNoYW5nZWQsIHJldHVybiB0aGUgY2hhcmFjdGVyIHRvIGV4
dGVuZCB1c2luZyBuYXZpZ2F0aW9uLgorICAgIGlmIChjb250cm9sbGVyLT5zZWxlY3Rpb24oKSA9
PSBuZXdTZWxlY3Rpb24pCisgICAgICAgIHJldHVybiBjaGFyYWN0ZXI7CisKKyAgICAvLyBTZWxl
Y3Rpb24gaGFzIGJlZW4gdXBkYXRlZC4KKyAgICByZXR1cm4gMDsKK30KKworLy8gUmV0dXJucyB0
cnVlIGlmIGhhbmRsZWQuCitib29sIFNlbGVjdGlvbkhhbmRsZXI6OnVwZGF0ZU9ySGFuZGxlSW5w
dXRTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbiYgbmV3U2VsZWN0aW9uLCBjb25zdCBJbnRQb2lu
dCYgcmVsYXRpdmVTdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICwgY29uc3QgSW50UG9pbnQmIHJlbGF0aXZlRW5kKQoreworICAgIEFTU0VS
VChtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpKTsKKworICAgIEZyYW1l
KiBmb2N1c2VkRnJhbWUgPSBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIE5v
ZGUqIGZvY3VzZWROb2RlID0gZm9jdXNlZEZyYW1lLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgp
OworICAgIGlmICghZm9jdXNlZE5vZGUgfHwgIWZvY3VzZWROb2RlLT5yZW5kZXJlcigpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBGcmFtZVNlbGVjdGlvbiogY29udHJvbGxlciA9IGZv
Y3VzZWRGcmFtZS0+c2VsZWN0aW9uKCk7CisKKyAgICBJbnRSZWN0IGN1cnJlbnRTdGFydENhcmV0
UmVjdCA9IGNvbnRyb2xsZXItPnNlbGVjdGlvbigpLnZpc2libGVTdGFydCgpLmFic29sdXRlQ2Fy
ZXRCb3VuZHMoKTsKKyAgICBJbnRSZWN0IGN1cnJlbnRFbmRDYXJldFJlY3QgPSBjb250cm9sbGVy
LT5zZWxlY3Rpb24oKS52aXNpYmxlRW5kKCkuYWJzb2x1dGVDYXJldEJvdW5kcygpOworCisgICAg
Ly8gQ2hlY2sgaWYgdGhlIGhhbmRsZSBtb3ZlbWVudCBpcyB2YWxpZC4KKyAgICBpZiAoIXNob3Vs
ZFVwZGF0ZVNlbGVjdGlvbk9yQ2FyZXRGb3JQb2ludChyZWxhdGl2ZVN0YXJ0LCBjdXJyZW50U3Rh
cnRDYXJldFJlY3QsIHRydWUgLyogc3RhcnRDYXJldCAqLykKKyAgICAgICAgfHwgIXNob3VsZFVw
ZGF0ZVNlbGVjdGlvbk9yQ2FyZXRGb3JQb2ludChyZWxhdGl2ZUVuZCwgY3VycmVudEVuZENhcmV0
UmVjdCwgZmFsc2UgLyogc3RhcnRDYXJldCAqLykpIHsKKyAgICAgICAgc2VsZWN0aW9uUG9zaXRp
b25DaGFuZ2VkKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEludFJlY3Qg
bm9kZUJvdW5kaW5nQm94ID0gZm9jdXNlZE5vZGUtPnJlbmRlcmVyKCktPmFic29sdXRlQm91bmRp
bmdCb3hSZWN0KCk7CisKKyAgICAvLyBPbmx5IGRvIHNwZWNpYWwgaGFuZGxpbmcgaWYgb25lIGhh
bmRsZSBpcyBvdXRzaWRlIG9mIHRoZSBub2RlLgorICAgIGJvb2wgc3RhcnRJc091dHNpZGVPZkZp
ZWxkID0gcmVsYXRpdmVTdGFydCAhPSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQgJiYgIW5vZGVC
b3VuZGluZ0JveC5jb250YWlucyhyZWxhdGl2ZVN0YXJ0KTsKKyAgICBib29sIGVuZElzT3V0c2lk
ZU9mRmllbGQgPSByZWxhdGl2ZUVuZCAhPSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQgJiYgIW5v
ZGVCb3VuZGluZ0JveC5jb250YWlucyhyZWxhdGl2ZUVuZCk7CisgICAgaWYgKHN0YXJ0SXNPdXRz
aWRlT2ZGaWVsZCAmJiBlbmRJc091dHNpZGVPZkZpZWxkKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICB1bnNpZ25lZCBzaG9ydCBjaGFyYWN0ZXIgPSAwOworICAgIGlmIChzdGFydElzT3V0
c2lkZU9mRmllbGQpIHsKKyAgICAgICAgY2hhcmFjdGVyID0gZXh0ZW5kU2VsZWN0aW9uVG9GaWVs
ZEJvdW5kYXJ5KHRydWUgLyogaXNTdGFydEhhbmRsZSAqLywgcmVsYXRpdmVTdGFydCwgbmV3U2Vs
ZWN0aW9uKTsKKyAgICAgICAgaWYgKGNoYXJhY3RlcikgeworICAgICAgICAgICAgLy8gSW52ZXJ0
IHRoZSBzZWxlY3Rpb24gc28gdGhhdCB0aGUgY3Vyc29yIHBvaW50IGlzIGF0IHRoZSBiZWdpbm5p
bmcuCisgICAgICAgICAgICBjb250cm9sbGVyLT5zZXRTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlv
bihjb250cm9sbGVyLT5zZWxlY3Rpb24oKS5lbmQoKSwgY29udHJvbGxlci0+c2VsZWN0aW9uKCku
c3RhcnQoKSkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChlbmRJc091dHNpZGVPZkZpZWxk
KSB7CisgICAgICAgIGNoYXJhY3RlciA9IGV4dGVuZFNlbGVjdGlvblRvRmllbGRCb3VuZGFyeShm
YWxzZSAvKiBpc1N0YXJ0SGFuZGxlICovLCByZWxhdGl2ZUVuZCwgbmV3U2VsZWN0aW9uKTsKKyAg
ICAgICAgaWYgKGNoYXJhY3RlcikgeworICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHNlbGVjdGlv
biBzbyB0aGF0IHRoZSBlbmQgaXMgdGhlIGVkaXQgcG9pbnQuCisgICAgICAgICAgICBjb250cm9s
bGVyLT5zZXRTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbihjb250cm9sbGVyLT5zZWxlY3Rpb24o
KS5zdGFydCgpLCBjb250cm9sbGVyLT5zZWxlY3Rpb24oKS5lbmQoKSkpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgaWYgKCFjaGFyYWN0ZXIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IERFQlVHX1NFTEVDVElPTihCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiU2Vs
ZWN0aW9uSGFuZGxlcjo6c2V0U2VsZWN0aW9uIG1ha2luZyBzZWxlY3Rpb24gY2hhbmdlIGF0dGVt
cHQgdXNpbmcgbmF2aWdhdGlvbiIpOworCisgICAgaWYgKHNob3VsZEV4dGVuZFNlbGVjdGlvbklu
RGlyZWN0aW9uKGNvbnRyb2xsZXItPnNlbGVjdGlvbigpLCBjaGFyYWN0ZXIpKQorICAgICAgICBt
X3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5oYW5kbGVOYXZpZ2F0aW9uTW92ZShjaGFyYWN0ZXIs
IHRydWUgLyogc2hpZnREb3duICovLCBmYWxzZSAvKiBhbHREb3duICovLCBmYWxzZSAvKiBjYW5F
eGl0RmllbGQgKi8pOworCisgICAgLy8gTXVzdCBzZW5kIHRoZSBzZWxlY3Rpb25Qb3NpdGlvbkNo
YW5nZWQgZXZlcnkgdGltZSwgc29tZXRpbWVzIHRoaXMgd2lsbCBkdXBsaWNhdGUgYnV0IGFuIGFj
Y2VwdGVkCisgICAgLy8gaGFuZGxlTmF2aWdhdGlvbk1vdmUgbWF5IG5vdCBtYWtlIGFuIGFjdHVh
bCBzZWxlY3Rpb24gY2hhbmdlLgorICAgIHNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCgpOworICAg
IHJldHVybiB0cnVlOworfQorCit2b2lkIFNlbGVjdGlvbkhhbmRsZXI6OnNldFNlbGVjdGlvbihj
b25zdCBJbnRQb2ludCYgc3RhcnQsIGNvbnN0IEludFBvaW50JiBlbmQpCit7CisgICAgbV9zZWxl
Y3Rpb25BY3RpdmUgPSB0cnVlOworCisgICAgQVNTRVJUKG1fd2ViUGFnZSk7CisgICAgQVNTRVJU
KG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkpOworICAgIEFTU0VSVChtX3dlYlBhZ2Ut
PmZvY3VzZWRPck1haW5GcmFtZSgpLT5zZWxlY3Rpb24oKSk7CisKKyAgICBGcmFtZSogZm9jdXNl
ZEZyYW1lID0gbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICBGcmFtZVNlbGVj
dGlvbiogY29udHJvbGxlciA9IGZvY3VzZWRGcmFtZS0+c2VsZWN0aW9uKCk7CisKKyAgICBERUJV
R19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlv
bkhhbmRsZXI6OnNldFNlbGVjdGlvbiBhZGp1c3RlZCBwb2ludHMgJWQsICVkLCAlZCwgJWQiLCBz
dGFydC54KCksIHN0YXJ0LnkoKSwgZW5kLngoKSwgZW5kLnkoKSk7CisKKyAgICAvLyBOb3RlIHRo
YXQgSW50UG9pbnQoLTEsIC0xKSBpcyBiZWluZyBvdXIgc2VudGluZWwgc28gZmFyIGZvcgorICAg
IC8vIGNsaXBwZWQgb3V0IHNlbGVjdGlvbiBzdGFydGluZyBvciBlbmRpbmcgbG9jYXRpb24uCisg
ICAgYm9vbCBzdGFydElzVmFsaWQgPSBzdGFydCAhPSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQ7
CisgICAgbV9sYXN0VXBkYXRlZEVuZFBvaW50SXNWYWxpZCA9IGVuZCAhPSBET01TdXBwb3J0OjpJ
bnZhbGlkUG9pbnQ7CisKKyAgICAvLyBBdCBsZWFzdCBvbmUgb2YgdGhlIGxvY2F0aW9ucyBtdXN0
IGJlIHZhbGlkLgorICAgIEFTU0VSVChzdGFydElzVmFsaWQgfHwgbV9sYXN0VXBkYXRlZEVuZFBv
aW50SXNWYWxpZCk7CisKKyAgICBJbnRQb2ludCByZWxhdGl2ZVN0YXJ0ID0gc3RhcnQ7CisgICAg
SW50UG9pbnQgcmVsYXRpdmVFbmQgPSBlbmQ7CisKKyAgICBWaXNpYmxlU2VsZWN0aW9uIG5ld1Nl
bGVjdGlvbihjb250cm9sbGVyLT5zZWxlY3Rpb24oKSk7CisKKyAgICAvLyBXZSBuZWVkIHRoZSBz
ZWxlY3Rpb24gdG8gYmUgb3JkZXJlZCBiYXNlIHRoZW4gZXh0ZW50LgorICAgIGlmICghY29udHJv
bGxlci0+c2VsZWN0aW9uKCkuaXNCYXNlRmlyc3QoKSkKKyAgICAgICAgY29udHJvbGxlci0+c2V0
U2VsZWN0aW9uKFZpc2libGVTZWxlY3Rpb24oY29udHJvbGxlci0+c2VsZWN0aW9uKCkuc3RhcnQo
KSwgY29udHJvbGxlci0+c2VsZWN0aW9uKCkuZW5kKCkpKTsKKworICAgIGlmIChzdGFydElzVmFs
aWQpIHsKKyAgICAgICAgcmVsYXRpdmVTdGFydCA9IERPTVN1cHBvcnQ6OmNvbnZlcnRQb2ludFRv
RnJhbWUobV93ZWJQYWdlLT5tYWluRnJhbWUoKSwgZm9jdXNlZEZyYW1lLCBzdGFydCk7CisKKyAg
ICAgICAgLy8gU2V0IHRoZSBzZWxlY3Rpb24gd2l0aCB2YWxpZGF0aW9uLgorICAgICAgICBuZXdT
ZWxlY3Rpb24uc2V0QmFzZSh2aXNpYmxlUG9zaXRpb25Gb3JQb2ludElnbm9yaW5nQ2xpcHBpbmco
KmZvY3VzZWRGcmFtZSwgcmVsYXRpdmVTdGFydCkpOworCisgICAgICAgIC8vIFJlc2V0IHRoZSBz
ZWxlY3Rpb24gdXNpbmcgdGhlIGV4aXN0aW5nIGV4dGVudCB3aXRob3V0IHZhbGlkYXRpb24uCisg
ICAgICAgIG5ld1NlbGVjdGlvbi5zZXRXaXRob3V0VmFsaWRhdGlvbihuZXdTZWxlY3Rpb24uYmFz
ZSgpLCBjb250cm9sbGVyLT5zZWxlY3Rpb24oKS5lbmQoKSk7CisgICAgfQorCisgICAgaWYgKG1f
bGFzdFVwZGF0ZWRFbmRQb2ludElzVmFsaWQpIHsKKyAgICAgICAgcmVsYXRpdmVFbmQgPSBET01T
dXBwb3J0Ojpjb252ZXJ0UG9pbnRUb0ZyYW1lKG1fd2ViUGFnZS0+bWFpbkZyYW1lKCksIGZvY3Vz
ZWRGcmFtZSwgZW5kKTsKKworICAgICAgICAvLyBTZXQgdGhlIHNlbGVjdGlvbiB3aXRoIHZhbGlk
YXRpb24uCisgICAgICAgIG5ld1NlbGVjdGlvbi5zZXRFeHRlbnQodmlzaWJsZVBvc2l0aW9uRm9y
UG9pbnRJZ25vcmluZ0NsaXBwaW5nKCpmb2N1c2VkRnJhbWUsIHJlbGF0aXZlRW5kKSk7CisKKyAg
ICAgICAgLy8gUmVzZXQgdGhlIHNlbGVjdGlvbiB1c2luZyB0aGUgZXhpc3RpbmcgYmFzZSB3aXRo
b3V0IHZhbGlkYXRpb24uCisgICAgICAgIG5ld1NlbGVjdGlvbi5zZXRXaXRob3V0VmFsaWRhdGlv
bihjb250cm9sbGVyLT5zZWxlY3Rpb24oKS5zdGFydCgpLCBuZXdTZWxlY3Rpb24uZXh0ZW50KCkp
OworICAgIH0KKworICAgIGlmIChtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9k
ZSgpKSB7CisgICAgICAgIGlmICh1cGRhdGVPckhhbmRsZUlucHV0U2VsZWN0aW9uKG5ld1NlbGVj
dGlvbiwgcmVsYXRpdmVTdGFydCwgcmVsYXRpdmVFbmQpKQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIGlmIChjb250cm9sbGVyLT5zZWxlY3Rpb24oKSA9PSBuZXdTZWxlY3Rpb24p
IHsKKyAgICAgICAgc2VsZWN0aW9uUG9zaXRpb25DaGFuZ2VkKCk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIHNpemUgaXMgcmVkdWNlIHRvIGxlc3Mg
dGhhbiBhIGNoYXJhY3Rlciwgc2VsZWN0aW9uIHR5cGUgYmVjb21lcworICAgIC8vIENhcmV0LiBB
cyBsb25nIGFzIGl0IGlzIHN0aWxsIGEgcmFuZ2UsIGl0J3MgYSB2YWxpZCBzZWxlY3Rpb24uIFNl
bGVjdGlvbiBjYW5ub3QKKyAgICAvLyBiZSBjYW5jZWxsZWQgdGhyb3VnaCB0aGlzIGZ1bmN0aW9u
LgorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIHJlZ2lvbjsKKyAgICBn
ZXRDb25zb2xpZGF0ZWRSZWdpb25PZlRleHRRdWFkc0ZvclNlbGVjdGlvbihuZXdTZWxlY3Rpb24s
IHJlZ2lvbik7CisgICAgY2xpcFJlZ2lvblRvVmlzaWJsZUNvbnRhaW5lcihyZWdpb24pOworICAg
IGlmICghcmVnaW9uLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBDaGVjayBpZiB0aGUgaGFuZGxl
cyByZXZlcnNlZCBwb3NpdGlvbi4KKyAgICAgICAgaWYgKG1fc2VsZWN0aW9uQWN0aXZlICYmICFu
ZXdTZWxlY3Rpb24uaXNCYXNlRmlyc3QoKSkKKyAgICAgICAgICAgIG1fd2ViUGFnZS0+bV9jbGll
bnQtPm5vdGlmeVNlbGVjdGlvbkhhbmRsZXNSZXZlcnNlZCgpOworCisgICAgICAgIGNvbnRyb2xs
ZXItPnNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb24pOworCisgICAgICAgIERFQlVHX1NFTEVDVElP
TihCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiU2VsZWN0aW9uSGFuZGxlcjo6
c2V0U2VsZWN0aW9uIHNlbGVjdGlvbiBwb2ludHMgdmFsaWQsIHNlbGVjdGlvbiB1cGRhdGVkIik7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUmVxdWVzdGVkIHNlbGVjdGlvbiByZXN1bHRzIGlu
IGFuIGVtcHR5IHNlbGVjdGlvbiwgc2tpcCB0aGlzIGNoYW5nZS4KKyAgICAgICAgc2VsZWN0aW9u
UG9zaXRpb25DaGFuZ2VkKCk7CisKKyAgICAgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpMb2dMZXZlbFdhcm4sICJTZWxlY3Rpb25IYW5kbGVyOjpzZXRTZWxlY3Rpb24g
c2VsZWN0aW9uIHBvaW50cyBpbnZhbGlkLCBzZWxlY3Rpb24gbm90IHVwZGF0ZWQiKTsKKyAgICB9
Cit9CisKKy8vIEZJWE1FIHJlLXVzZSB0aGlzIGluIGNvbnRleHQuIE11c3QgYmUgdXBkYXRlZCB0
byBpbmNsdWRlIGFuIG9wdGlvbiB0byByZXR1cm4gdGhlIGhyZWYuCisvLyBUaGlzIGZ1bmN0aW9u
IHNob3VsZCBiZSBtb3ZlZCB0byBhIG5ldyB1bml0IGZpbGUuIE5hbWVzIHN1Z2dldGlvbnMgaW5j
bHVkZSBET01RdWVyaWVzCisvLyBhbmQgTm9kZVR5cGVzLiBGdW5jdGlvbnMgY3VycmVudGx5IGlu
IElucHV0SGFuZGxlci5jcHAsIFNlbGVjdGlvbkhhbmRsZXIuY3BwIGFuZCBXZWJQYWdlLmNwcAor
Ly8gY2FuIGFsbCBiZSBtb3ZlZCBpbi4KK3N0YXRpYyBOb2RlKiBlbmNsb3NpbmdMaW5rRXZlbnRQ
YXJlbnRGb3JOb2RlKE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1
cm4gMDsKKworICAgIE5vZGUqIGxpbmtOb2RlID0gbm9kZS0+ZW5jbG9zaW5nTGlua0V2ZW50UGFy
ZW50T3JTZWxmKCk7CisgICAgcmV0dXJuIGxpbmtOb2RlICYmIGxpbmtOb2RlLT5pc0xpbmsoKSA/
IGxpbmtOb2RlIDogMDsKK30KKwordm9pZCBTZWxlY3Rpb25IYW5kbGVyOjpzZWxlY3RBdFBvaW50
KGNvbnN0IEludFBvaW50JiBsb2NhdGlvbikKK3sKKyAgICAvLyBJZiBwb2ludCBpcyBpbnZhbGlk
IHRyaWdnZXIgc2VsZWN0aW9uIGJhc2VkIGV4cGFuc2lvbi4KKyAgICBpZiAobG9jYXRpb24gPT0g
RE9NU3VwcG9ydDo6SW52YWxpZFBvaW50KSB7CisgICAgICAgIHNlbGVjdE9iamVjdChXb3JkR3Jh
bnVsYXJpdHkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTm9kZSogdGFyZ2V0Tm9k
ZTsKKyAgICBJbnRQb2ludCB0YXJnZXRQb3NpdGlvbjsKKyAgICAvLyBGSVhNRTogRmFjdG9yeSB0
aGlzIGdldCByaWdodCBmYXQgZmluZ2VyIGNvZGUgaW50byBhIGhlbHBlci4KKyAgICBjb25zdCBG
YXRGaW5nZXJzUmVzdWx0IGxhc3RGYXRGaW5nZXJzUmVzdWx0ID0gbV93ZWJQYWdlLT5tX3RvdWNo
RXZlbnRIYW5kbGVyLT5sYXN0RmF0RmluZ2Vyc1Jlc3VsdCgpOworICAgIGlmIChsYXN0RmF0Rmlu
Z2Vyc1Jlc3VsdC5wb3NpdGlvbldhc0FkanVzdGVkKCkgJiYgbGFzdEZhdEZpbmdlcnNSZXN1bHQu
bm9kZUFzRWxlbWVudElmQXBwbGljYWJsZSgpKSB7CisgICAgICAgIHRhcmdldE5vZGUgPSBsYXN0
RmF0RmluZ2Vyc1Jlc3VsdC52YWxpZE5vZGUoKTsKKyAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBs
YXN0RmF0RmluZ2Vyc1Jlc3VsdC5hZGp1c3RlZFBvc2l0aW9uKCk7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgRmF0RmluZ2Vyc1Jlc3VsdCBuZXdGYXRGaW5nZXJzUmVzdWx0ID0gRmF0RmluZ2Vycyht
X3dlYlBhZ2UsIGxvY2F0aW9uLCBGYXRGaW5nZXJzOjpUZXh0KS5maW5kQmVzdFBvaW50KCk7Cisg
ICAgICAgIGlmICghbmV3RmF0RmluZ2Vyc1Jlc3VsdC5wb3NpdGlvbldhc0FkanVzdGVkKCkpCisg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBuZXdGYXRGaW5n
ZXJzUmVzdWx0LmFkanVzdGVkUG9zaXRpb24oKTsKKyAgICAgICAgdGFyZ2V0Tm9kZSA9IG5ld0Zh
dEZpbmdlcnNSZXN1bHQudmFsaWROb2RlKCk7CisgICAgfQorCisgICAgQVNTRVJUKHRhcmdldE5v
ZGUpOworCisgICAgLy8gSWYgdGhlIG5vZGUgYXQgdGhlIHBvaW50IGlzIGEgbGluaywgZm9jdXMg
b24gdGhlIGVudGlyZSBsaW5rLCBub3QgYSB3b3JkLgorICAgIGlmIChOb2RlKiBsaW5rID0gZW5j
bG9zaW5nTGlua0V2ZW50UGFyZW50Rm9yTm9kZSh0YXJnZXROb2RlKSkgeworICAgICAgICBzZWxl
Y3RPYmplY3QobGluayk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBzZWxlY3RB
dFBvaW50IEFQSSBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBXb3JkR3JhbnVsYXJpdHkgYnV0IG1h
eSBiZSBleHRlbmRlZCBpbiB0aGUgZnV0dXJlLgorICAgIHNlbGVjdE9iamVjdCh0YXJnZXRQb3Np
dGlvbiwgV29yZEdyYW51bGFyaXR5KTsKK30KKworc3RhdGljIGJvb2wgZXhwYW5kU2VsZWN0aW9u
VG9HcmFudWxhcml0eShGcmFtZSogZnJhbWUsIFZpc2libGVTZWxlY3Rpb24gc2VsZWN0aW9uLCBU
ZXh0R3JhbnVsYXJpdHkgZ3JhbnVsYXJpdHksIGJvb2wgaXNJbnB1dE1vZGUpCit7CisgICAgQVNT
RVJUKGZyYW1lKTsKKyAgICBBU1NFUlQoZnJhbWUtPnNlbGVjdGlvbigpKTsKKworICAgIGlmICgh
KHNlbGVjdGlvbi5zdGFydCgpLmFuY2hvck5vZGUoKSAmJiBzZWxlY3Rpb24uc3RhcnQoKS5hbmNo
b3JOb2RlKCktPmlzVGV4dE5vZGUoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlm
IChncmFudWxhcml0eSA9PSBXb3JkR3JhbnVsYXJpdHkpCisgICAgICAgIHNlbGVjdGlvbiA9IERP
TVN1cHBvcnQ6OnZpc2libGVTZWxlY3Rpb25Gb3JDbG9zZXN0QWN0dWFsV29yZFN0YXJ0KHNlbGVj
dGlvbik7CisKKyAgICBzZWxlY3Rpb24uZXhwYW5kVXNpbmdHcmFudWxhcml0eShncmFudWxhcml0
eSk7CisgICAgUmVmUHRyPFJhbmdlPiBuZXdSYW5nZSA9IHNlbGVjdGlvbi50b05vcm1hbGl6ZWRS
YW5nZSgpOworICAgIFJlZlB0cjxSYW5nZT4gb2xkUmFuZ2UgPSBmcmFtZS0+c2VsZWN0aW9uKCkt
PnNlbGVjdGlvbigpLnRvTm9ybWFsaXplZFJhbmdlKCk7CisgICAgRUFmZmluaXR5IGFmZmluaXR5
ID0gZnJhbWUtPnNlbGVjdGlvbigpLT5hZmZpbml0eSgpOworCisgICAgaWYgKGlzSW5wdXRNb2Rl
ICYmICFmcmFtZS0+ZWRpdG9yKCktPmNsaWVudCgpLT5zaG91bGRDaGFuZ2VTZWxlY3RlZFJhbmdl
KG9sZFJhbmdlLmdldCgpLCBuZXdSYW5nZS5nZXQoKSwgYWZmaW5pdHksIGZhbHNlKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGZyYW1lLT5zZWxlY3Rpb24oKS0+c2V0U2Vs
ZWN0ZWRSYW5nZShuZXdSYW5nZS5nZXQoKSwgYWZmaW5pdHksIHRydWUpOworfQorCit2b2lkIFNl
bGVjdGlvbkhhbmRsZXI6OnNlbGVjdE9iamVjdChjb25zdCBJbnRQb2ludCYgbG9jYXRpb24sIFRl
eHRHcmFudWxhcml0eSBncmFudWxhcml0eSkKK3sKKyAgICBBU1NFUlQobG9jYXRpb24ueCgpID49
IDAgJiYgbG9jYXRpb24ueSgpID49IDApOworICAgIEFTU0VSVChtX3dlYlBhZ2UgJiYgbV93ZWJQ
YWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKSAmJiBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFt
ZSgpLT5zZWxlY3Rpb24oKSk7CisgICAgRnJhbWUqIGZvY3VzZWRGcmFtZSA9IG1fd2ViUGFnZS0+
Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisKKyAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlvbkhhbmRsZXI6OnNlbGVjdE9iamVjdCBh
ZGp1c3RlZCBwb2ludHMgJWQsICVkIiwgbG9jYXRpb24ueCgpLCBsb2NhdGlvbi55KCkpOworCisg
ICAgSW50UG9pbnQgcmVsYXRpdmVQb2ludCA9IERPTVN1cHBvcnQ6OmNvbnZlcnRQb2ludFRvRnJh
bWUobV93ZWJQYWdlLT5tYWluRnJhbWUoKSwgZm9jdXNlZEZyYW1lLCBsb2NhdGlvbik7CisgICAg
VmlzaWJsZVBvc2l0aW9uIHBvaW50TG9jYXRpb24oZm9jdXNlZEZyYW1lLT52aXNpYmxlUG9zaXRp
b25Gb3JQb2ludChyZWxhdGl2ZVBvaW50KSk7CisgICAgVmlzaWJsZVNlbGVjdGlvbiBzZWxlY3Rp
b24gPSBWaXNpYmxlU2VsZWN0aW9uKHBvaW50TG9jYXRpb24sIHBvaW50TG9jYXRpb24pOworCisg
ICAgbV9zZWxlY3Rpb25BY3RpdmUgPSBleHBhbmRTZWxlY3Rpb25Ub0dyYW51bGFyaXR5KGZvY3Vz
ZWRGcmFtZSwgc2VsZWN0aW9uLCBncmFudWxhcml0eSwgbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxl
ci0+aXNJbnB1dE1vZGUoKSk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6c2VsZWN0T2Jq
ZWN0KFRleHRHcmFudWxhcml0eSBncmFudWxhcml0eSkKK3sKKyAgICBBU1NFUlQobV93ZWJQYWdl
ICYmIG1faW5wdXRIYW5kbGVyKTsKKyAgICAvLyBVc2luZyBjYXJldCBsb2NhdGlvbiwgbXVzdCBi
ZSBpbnNpZGUgYW4gaW5wdXQgZmllbGQuCisgICAgaWYgKCFtX3dlYlBhZ2UtPm1faW5wdXRIYW5k
bGVyLT5pc0lucHV0TW9kZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQobV93ZWJQ
YWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKSAmJiBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFt
ZSgpLT5zZWxlY3Rpb24oKSk7CisgICAgRnJhbWUqIGZvY3VzZWRGcmFtZSA9IG1fd2ViUGFnZS0+
Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisKKyAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlvbkhhbmRsZXI6OnNlbGVjdE9iamVjdCB1
c2luZyBjdXJyZW50IHNlbGVjdGlvbiIpOworCisgICAgLy8gVXNlIHRoZSBjdXJyZW50IHNlbGVj
dGlvbiBhcyB0aGUgc2VsZWN0aW9uIHBvaW50LgorICAgIEFTU0VSVChmb2N1c2VkRnJhbWUtPnNl
bGVjdGlvbigpLT5zZWxlY3Rpb25UeXBlKCkgIT0gVmlzaWJsZVNlbGVjdGlvbjo6Tm9TZWxlY3Rp
b24pOworICAgIG1fc2VsZWN0aW9uQWN0aXZlID0gZXhwYW5kU2VsZWN0aW9uVG9HcmFudWxhcml0
eShmb2N1c2VkRnJhbWUsIGZvY3VzZWRGcmFtZS0+c2VsZWN0aW9uKCktPnNlbGVjdGlvbigpLCBn
cmFudWxhcml0eSwgdHJ1ZSAvKiBpc0lucHV0TW9kZSAqLyk7Cit9CisKK3ZvaWQgU2VsZWN0aW9u
SGFuZGxlcjo6c2VsZWN0T2JqZWN0KE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFub2RlKQorICAg
ICAgICByZXR1cm47CisKKyAgICBtX3NlbGVjdGlvbkFjdGl2ZSA9IHRydWU7CisKKyAgICBBU1NF
UlQobV93ZWJQYWdlICYmIG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkgJiYgbV93ZWJQ
YWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+c2VsZWN0aW9uKCkpOworICAgIEZyYW1lKiBmb2N1
c2VkRnJhbWUgPSBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpOworCisgICAgREVCVUdf
U0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJTZWxlY3Rpb25I
YW5kbGVyOjpzZWxlY3ROb2RlIik7CisKKyAgICBWaXNpYmxlU2VsZWN0aW9uIHNlbGVjdGlvbiA9
IFZpc2libGVTZWxlY3Rpb246OnNlbGVjdGlvbkZyb21Db250ZW50c09mTm9kZShub2RlKTsKKyAg
ICBmb2N1c2VkRnJhbWUtPnNlbGVjdGlvbigpLT5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKK30K
Kworc3RhdGljIFRleHREaXJlY3Rpb24gZGlyZWN0aW9uT2ZFbmNsb3NpbmdCbG9jayhGcmFtZVNl
bGVjdGlvbiogc2VsZWN0aW9uKQoreworICAgIE5vZGUqIGVuY2xvc2luZ0Jsb2NrTm9kZSA9IGVu
Y2xvc2luZ0Jsb2NrKHNlbGVjdGlvbi0+c2VsZWN0aW9uKCkuZXh0ZW50KCkuZGVwcmVjYXRlZE5v
ZGUoKSk7CisgICAgaWYgKCFlbmNsb3NpbmdCbG9ja05vZGUpCisgICAgICAgIHJldHVybiBMVFI7
CisKKyAgICBpZiAoUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGVuY2xvc2luZ0Jsb2NrTm9kZS0+
cmVuZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuIHJlbmRlcmVyLT5zdHlsZSgpLT5kaXJlY3Rpb24o
KTsKKworICAgIHJldHVybiBMVFI7Cit9CisKKy8vIFJldHVybnMgPiAwIGlmIHAxIGlzICJjbG9z
ZXIiIHRvIHJlZmVyZW5jZVBvaW50LCA8IDAgaWYgcDIgaXMgImNsb3NlciIsIDAgaWYgdGhleSBh
cmUgZXF1aWRpc3RhbnQuCisvLyBCZWNhdXNlIHRleHQgaXMgdXN1YWxseSBhcnJhbmdlZCBpbiBo
b3Jpem9udGFsIHJvd3MsIGRpc3RhbmNlIGlzIG1lYXN1cmVkIGFsb25nIHRoZSB5LWF4aXMsIHdp
dGggeC1heGlzIHVzZWQgb25seSB0byBicmVhayB0aWVzLgorLy8gSWYgcmlnaHRHcmF2aXR5IGlz
IHRydWUsIHRoZSByaWdodC1tb3N0IHgtY29vcmRpbmF0ZSBpcyBjaG9zZW4sIG90aGVyd2lzZSB0
ZWggbGVmdC1tb3N0IGNvb3JkaW5hdGUgaXMgY2hvc2VuLgorc3RhdGljIGlubGluZSBpbnQgY29t
cGFyZVBvaW50c1RvUmVmZXJlbmNlUG9pbnQoY29uc3QgSW50UG9pbnQmIHAxLCBjb25zdCBJbnRQ
b2ludCYgcDIsIGNvbnN0IEludFBvaW50JiByZWZlcmVuY2VQb2ludCwgYm9vbCByaWdodEdyYXZp
dHkpCit7CisgICAgaW50IGR5MSA9IGFicyhyZWZlcmVuY2VQb2ludC55KCkgLSBwMS55KCkpOwor
ICAgIGludCBkeTIgPSBhYnMocmVmZXJlbmNlUG9pbnQueSgpIC0gcDIueSgpKTsKKyAgICBpZiAo
ZHkxICE9IGR5MikKKyAgICAgICAgcmV0dXJuIGR5MiAtIGR5MTsKKworICAgIC8vIFNhbWUgeS1j
b29yZGluYXRlLCBjaG9vc2UgdGhlIGZhcnRoZXN0IHJpZ2h0IChvciBsZWZ0KSBwb2ludC4KKyAg
ICBpZiAocDEueCgpID09IHAyLngoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAocDEu
eCgpID4gcDIueCgpKQorICAgICAgICByZXR1cm4gcmlnaHRHcmF2aXR5ID8gMSA6IC0xOworCisg
ICAgcmV0dXJuIHJpZ2h0R3Jhdml0eSA/IC0xIDogMTsKK30KKworLy8gTk9URS9GSVhNRTogRHVl
IHRvIHI3NzI4Niwgd2UgYXJlIGdldHRpbmcgb2ZmLWJ5LW9uZSByZXN1bHRzIGluIHRoZSBJbnRS
ZWN0IGNsYXNzIGNvdW50ZXJwYXJ0IGltcGxlbWVudGF0aW9uIG9mIHRoZQorLy8gICAgICAgICAg
ICAgbWV0aG9kcyBiZWxvdy4gQXMgZG9uZSBpbiByODk4MDMsIHI3NzkyOCBhbmQgYSBmZXcgb3Ro
ZXJzLCBsZXRzIHVzZSBsb2NhbCBtZXRob2QgdG8gZml4IGl0LgorLy8gICAgICAgICAgICAgV2Ug
c2hvdWxkIGtlZXAgb3VyIGV5ZXMgdmVyeSBvcGVuIG9uIGl0LCBzaW5jZSBpdCBjYW4gYWZmZWN0
IEJhY2tpbmdTdG9yZSB2ZXJ5IGJhZGx5Lgorc3RhdGljIEludFBvaW50IG1pblhNaW5ZQ29ybmVy
KGNvbnN0IEludFJlY3QmIHJlY3QpIHsgcmV0dXJuIHJlY3QubG9jYXRpb24oKTsgfSAvLyB0eXBp
Y2FsbHkgdG9wTGVmdAorc3RhdGljIEludFBvaW50IG1heFhNaW5ZQ29ybmVyKGNvbnN0IEludFJl
Y3QmIHJlY3QpIHsgcmV0dXJuIEludFBvaW50KHJlY3QueCgpICsgcmVjdC53aWR0aCgpIC0gMSwg
cmVjdC55KCkpOyB9IC8vIHR5cGljYWxseSB0b3BSaWdodAorc3RhdGljIEludFBvaW50IG1pblhN
YXhZQ29ybmVyKGNvbnN0IEludFJlY3QmIHJlY3QpIHsgcmV0dXJuIEludFBvaW50KHJlY3QueCgp
LCByZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCkgLSAxKTsgfSAvLyB0eXBpY2FsbHkgYm90dG9tTGVm
dAorc3RhdGljIEludFBvaW50IG1heFhNYXhZQ29ybmVyKGNvbnN0IEludFJlY3QmIHJlY3QpIHsg
cmV0dXJuIEludFBvaW50KHJlY3QueCgpICsgcmVjdC53aWR0aCgpIC0gMSwgcmVjdC55KCkgKyBy
ZWN0LmhlaWdodCgpIC0gMSk7IH0gLy8gdHlwaWNhbGx5IGJvdHRvbVJpZ2h0CisKKy8vIFRoZSBj
YXJldCBpcyBhIG9uZS1waXhlbCB3aWRlIGxpbmUgZG93biBlaXRoZXIgdGhlIHJpZ2h0IG9yIGxl
ZnQgZWRnZSBvZiBhCisvLyByZWN0LCBkZXBlbmRpbmcgb24gdGhlIHRleHQgZGlyZWN0aW9uLgor
c3RhdGljIGlubGluZSBib29sIGNhcmV0SXNPbkxlZnQoYm9vbCBpc1N0YXJ0Q2FyZXQsIGJvb2wg
aXNSVEwpCit7CisgICAgaWYgKGlzU3RhcnRDYXJldCkKKyAgICAgICAgcmV0dXJuICFpc1JUTDsK
KworICAgIHJldHVybiBpc1JUTDsKK30KKworc3RhdGljIGlubGluZSBJbnRQb2ludCBjYXJldExv
Y2F0aW9uRm9yUmVjdChjb25zdCBJbnRSZWN0JiByZWN0LCBib29sIGlzU3RhcnRDYXJldCwgYm9v
bCBpc1JUTCkKK3sKKyAgICByZXR1cm4gY2FyZXRJc09uTGVmdChpc1N0YXJ0Q2FyZXQsIGlzUlRM
KSA/IG1pblhNaW5ZQ29ybmVyKHJlY3QpIDogbWF4WE1pbllDb3JuZXIocmVjdCk7Cit9CisKK3N0
YXRpYyBpbmxpbmUgSW50UG9pbnQgY2FyZXRDb21wYXJpc29uUG9pbnRGb3JSZWN0KGNvbnN0IElu
dFJlY3QmIHJlY3QsIGJvb2wgaXNTdGFydENhcmV0LCBib29sIGlzUlRMKQoreworICAgIGlmIChp
c1N0YXJ0Q2FyZXQpCisgICAgICAgIHJldHVybiBjYXJldElzT25MZWZ0KGlzU3RhcnRDYXJldCwg
aXNSVEwpID8gbWluWE1pbllDb3JuZXIocmVjdCkgOiBtYXhYTWluWUNvcm5lcihyZWN0KTsKKwor
ICAgIHJldHVybiBjYXJldElzT25MZWZ0KGlzU3RhcnRDYXJldCwgaXNSVEwpID8gbWluWE1heFlD
b3JuZXIocmVjdCkgOiBtYXhYTWF4WUNvcm5lcihyZWN0KTsKK30KKworc3RhdGljIHZvaWQgYWRq
dXN0Q2FyZXRSZWN0cyhJbnRSZWN0JiBzdGFydENhcmV0LCBib29sIGlzU3RhcnRDYXJldENsaXBw
ZWRPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFJlY3QmIGVuZENhcmV0LCBi
b29sIGlzRW5kQ2FyZXRDbGlwcGVkT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b25zdCBzdGQ6OnZlY3RvcjxCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdD4gcmVjdExpc3Qs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludFBvaW50JiBzdGFydFJlZmVy
ZW5jZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRQb2ludCYg
ZW5kUmVmZXJlbmNlUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNS
VEwpCit7CisgICAgLy8gc3RhcnRSZWZlcmVuY2VQb2ludCBpcyB0aGUgYmVzdCBndWVzcyBhdCB0
aGUgdG9wIGxlZnQgb2YgdGhlIHNlbGVjdGlvbjsgZW5kUmVmZXJlbmNlUG9pbnQgaXMgdGhlIGJl
c3QgZ3Vlc3MgYXQgdGhlIGJvdHRvbSByaWdodC4KKyAgICBpZiAoaXNTdGFydENhcmV0Q2xpcHBl
ZE91dCkKKyAgICAgICAgc3RhcnRDYXJldC5zZXRMb2NhdGlvbihET01TdXBwb3J0OjpJbnZhbGlk
UG9pbnQpOworICAgIGVsc2UgeworICAgICAgICBzdGFydENhcmV0ID0gcmVjdExpc3RbMF07Cisg
ICAgICAgIHN0YXJ0Q2FyZXQuc2V0TG9jYXRpb24oY2FyZXRMb2NhdGlvbkZvclJlY3Qoc3RhcnRD
YXJldCwgdHJ1ZSwgaXNSVEwpKTsKKyAgICB9CisKKyAgICBpZiAoaXNFbmRDYXJldENsaXBwZWRP
dXQpCisgICAgICAgIGVuZENhcmV0LnNldExvY2F0aW9uKERPTVN1cHBvcnQ6OkludmFsaWRQb2lu
dCk7CisgICAgZWxzZSB7CisgICAgICAgIGVuZENhcmV0ID0gcmVjdExpc3RbMF07CisgICAgICAg
IGVuZENhcmV0LnNldExvY2F0aW9uKGNhcmV0TG9jYXRpb25Gb3JSZWN0KGVuZENhcmV0LCBmYWxz
ZSwgaXNSVEwpKTsKKyAgICB9CisKKyAgICBpZiAoaXNTdGFydENhcmV0Q2xpcHBlZE91dCAmJiBp
c0VuZENhcmV0Q2xpcHBlZE91dCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gUmVzZXQgd2lk
dGggdG8gMSBhcyB3ZSBhcmUgc3RyaWN0bHkgaW50ZXJlc3RlZCBpbiBjYXJldCBsb2NhdGlvbi4K
KyAgICBzdGFydENhcmV0LnNldFdpZHRoKDEpOworICAgIGVuZENhcmV0LnNldFdpZHRoKDEpOwor
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IHJlY3RMaXN0LnNpemUoKTsgaSsrKSB7Cisg
ICAgICAgIEludFJlY3QgY3VycmVudFJlY3QocmVjdExpc3RbaV0pOworCisgICAgICAgIC8vIENv
bXBhcmUgYW5kIHVwZGF0ZSB0aGUgc3RhcnQgYW5kIGVuZCBjYXJldHMgd2l0aCB0aGVpciByZXNw
ZWN0aXZlIHJlZmVyZW5jZSBwb2ludHMuCisgICAgICAgIGlmICghaXNTdGFydENhcmV0Q2xpcHBl
ZE91dCAmJiBjb21wYXJlUG9pbnRzVG9SZWZlcmVuY2VQb2ludCgKKyAgICAgICAgICAgICAgICAg
ICAgY2FyZXRDb21wYXJpc29uUG9pbnRGb3JSZWN0KGN1cnJlbnRSZWN0LCB0cnVlLCBpc1JUTCks
CisgICAgICAgICAgICAgICAgICAgIGNhcmV0Q29tcGFyaXNvblBvaW50Rm9yUmVjdChzdGFydENh
cmV0LCB0cnVlLCBpc1JUTCksCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0UmVmZXJlbmNlUG9p
bnQsIGlzUlRMKSA+IDApIHsKKyAgICAgICAgICAgIHN0YXJ0Q2FyZXQuc2V0TG9jYXRpb24oY2Fy
ZXRMb2NhdGlvbkZvclJlY3QoY3VycmVudFJlY3QsIHRydWUsIGlzUlRMKSk7CisgICAgICAgICAg
ICBzdGFydENhcmV0LnNldEhlaWdodChjdXJyZW50UmVjdC5oZWlnaHQoKSk7CisgICAgICAgIH0K
KworICAgICAgICBpZiAoIWlzRW5kQ2FyZXRDbGlwcGVkT3V0ICYmIGNvbXBhcmVQb2ludHNUb1Jl
ZmVyZW5jZVBvaW50KAorICAgICAgICAgICAgICAgICAgICBjYXJldENvbXBhcmlzb25Qb2ludEZv
clJlY3QoY3VycmVudFJlY3QsIGZhbHNlLCBpc1JUTCksCisgICAgICAgICAgICAgICAgICAgIGNh
cmV0Q29tcGFyaXNvblBvaW50Rm9yUmVjdChlbmRDYXJldCwgZmFsc2UsIGlzUlRMKSwKKyAgICAg
ICAgICAgICAgICAgICAgZW5kUmVmZXJlbmNlUG9pbnQsICFpc1JUTCkgPiAwKSB7CisgICAgICAg
ICAgICBlbmRDYXJldC5zZXRMb2NhdGlvbihjYXJldExvY2F0aW9uRm9yUmVjdChjdXJyZW50UmVj
dCwgZmFsc2UsIGlzUlRMKSk7CisgICAgICAgICAgICBlbmRDYXJldC5zZXRIZWlnaHQoY3VycmVu
dFJlY3QuaGVpZ2h0KCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFNlbGVjdGlvbkhh
bmRsZXI6OmNsaXBSZWdpb25Ub1Zpc2libGVDb250YWluZXIoQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkludFJlY3RSZWdpb24mIHJlZ2lvbikKK3sKKyAgICBBU1NFUlQobV93ZWJQYWdlLT5tX21haW5G
cmFtZSAmJiBtX3dlYlBhZ2UtPm1fbWFpbkZyYW1lLT52aWV3KCkpOworCisgICAgRnJhbWUqIGZy
YW1lID0gbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKworICAgIC8vIERvbid0IGFs
bG93IHRoZSByZWdpb24gdG8gZXh0ZW5kIG91dHNpZGUgb2YgdGhlIGFsbCBpdHMgYW5jZXN0b3Ig
ZnJhbWVzJyB2aXNpYmxlIGFyZWEuCisgICAgaWYgKGZyYW1lICE9IG1fd2ViUGFnZS0+bWFpbkZy
YW1lKCkpIHsKKyAgICAgICAgSW50UmVjdCBjb250YWluaW5nQ29udGVudFJlY3Q7CisgICAgICAg
IGNvbnRhaW5pbmdDb250ZW50UmVjdCA9IG1fd2ViUGFnZS0+Z2V0UmVjdXJzaXZlVmlzaWJsZVdp
bmRvd1JlY3QoZnJhbWUtPnZpZXcoKSwgdHJ1ZSAvKiBubyBjbGlwIHRvIG1haW4gZnJhbWUgd2lu
ZG93ICovKTsKKyAgICAgICAgY29udGFpbmluZ0NvbnRlbnRSZWN0ID0gbV93ZWJQYWdlLT5tX21h
aW5GcmFtZS0+dmlldygpLT53aW5kb3dUb0NvbnRlbnRzKGNvbnRhaW5pbmdDb250ZW50UmVjdCk7
CisgICAgICAgIHJlZ2lvbiA9IGludGVyc2VjdFJlZ2lvbnMoQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkludFJlY3RSZWdpb24oY29udGFpbmluZ0NvbnRlbnRSZWN0KSwgcmVnaW9uKTsKKyAgICB9CisK
KyAgICAvLyBEb24ndCBhbGxvdyB0aGUgcmVnaW9uIHRvIGV4dGVuZCBvdXRzaWRlIG9mIHRoZSBp
bnB1dCBmaWVsZC4KKyAgICBpZiAobV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNJbnB1dE1v
ZGUoKQorICAgICAgICAmJiBmcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKQorICAgICAg
ICAmJiBmcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKS0+cmVuZGVyZXIoKSkgeworCisg
ICAgICAgIC8vIEFkanVzdCB0aGUgYm91bmRpbmcgYm94IHRvIHRoZSBmcmFtZSBvZmZzZXQuCisg
ICAgICAgIEludFJlY3QgYm91bmRpbmdCb3goZnJhbWUtPmRvY3VtZW50KCktPmZvY3VzZWROb2Rl
KCktPnJlbmRlcmVyKCktPmFic29sdXRlQm91bmRpbmdCb3hSZWN0KCkpOworICAgICAgICBib3Vu
ZGluZ0JveCA9IG1fd2ViUGFnZS0+bWFpbkZyYW1lKCktPnZpZXcoKS0+d2luZG93VG9Db250ZW50
cyhmcmFtZS0+dmlldygpLT5jb250ZW50c1RvV2luZG93KGJvdW5kaW5nQm94KSk7CisKKyAgICAg
ICAgcmVnaW9uID0gaW50ZXJzZWN0UmVnaW9ucyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVj
dFJlZ2lvbihib3VuZGluZ0JveCksIHJlZ2lvbik7CisgICAgfQorfQorCitzdGF0aWMgSW50UG9p
bnQgcmVmZXJlbmNlUG9pbnQoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBwb3NpdGlvbiwgY29uc3Qg
SW50UmVjdCYgYm91bmRpbmdSZWN0LCBjb25zdCBJbnRQb2ludCYgZnJhbWVQb3NpdGlvbiwgYm9v
bCBpc1N0YXJ0Q2FyZXQsIGJvb2wgaXNSVEwpCit7CisgICAgLy8gSWYgb25lIG9mIHRoZSBjYXJl
dHMgaXMgaW52YWxpZCAodGhpcyBoYXBwZW5zLCBmb3IgaW5zdGFuY2UsIGlmIHRoZQorICAgIC8v
IHNlbGVjdGlvbiBlbmRzIGluIGFuIGVtcHR5IGRpdikgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBj
b3JuZXIgb2YgdGhlCisgICAgLy8gZW50aXJlIHJlZ2lvbiAod2hpY2ggaXMgYWxyZWFkeSBpbiBm
cmFtZSBjb29yZGluYXRlcyBzbyBkb2Vzbid0IG5lZWQKKyAgICAvLyBhZGp1c3RpbmcpLgorICAg
IEludFJlY3Qgc3RhcnRDYXJldEJvdW5kcyhwb3NpdGlvbi5hYnNvbHV0ZUNhcmV0Qm91bmRzKCkp
OworICAgIGlmIChzdGFydENhcmV0Qm91bmRzLmlzRW1wdHkoKSkKKyAgICAgICAgc3RhcnRDYXJl
dEJvdW5kcyA9IGJvdW5kaW5nUmVjdDsKKyAgICBlbHNlCisgICAgICAgIHN0YXJ0Q2FyZXRCb3Vu
ZHMubW92ZShmcmFtZVBvc2l0aW9uLngoKSwgZnJhbWVQb3NpdGlvbi55KCkpOworCisgICAgcmV0
dXJuIGNhcmV0Q29tcGFyaXNvblBvaW50Rm9yUmVjdChzdGFydENhcmV0Qm91bmRzLCBpc1N0YXJ0
Q2FyZXQsIGlzUlRMKTsKK30KKworLy8gTm90ZTogVGhpcyBpcyB0aGUgb25seSBmdW5jdGlvbiBp
biBTZWxlY3Rpb25IYW5kbGVyIGluIHdoaWNoIHRoZSBjb29yZGluYXRlCisvLyBzeXN0ZW0gaXMg
bm90IGVudGlyZWx5IFdlYktpdC4KK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6c2VsZWN0aW9uUG9z
aXRpb25DaGFuZ2VkKGJvb2wgdmlzdWFsQ2hhbmdlT25seSkKK3sKKyAgICBERUJVR19TRUxFQ1RJ
T04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlvbkhhbmRsZXI6
OnNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCB2aXNpYmxlQ2hhbmdlT25seSA9ICVzIiwgdmlzdWFs
Q2hhbmdlT25seSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCisgICAgLy8gVGhpcyBtZXRob2QgY2Fu
IGdldCBjYWxsZWQgZHVyaW5nIFdlYlBhZ2Ugc2h1dGRvd24gcHJvY2Vzcy4KKyAgICAvLyBJZiB0
aGF0IGlzIHRoZSBjYXNlLCBqdXN0IGJhaWwgb3V0IHNpbmNlIHRoZSBjbGllbnQgaXMgbm90Cisg
ICAgLy8gaW4gYSBzYWZlIHN0YXRlIG9mIHRydXN0IHRvIHJlcXVlc3QgYW55dGhpbmcgZWxzZSBm
cm9tIGl0LgorICAgIGlmICghbV93ZWJQYWdlLT5tX21haW5GcmFtZSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXItPmlzSW5wdXRNb2RlKCkgJiYg
bV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+cHJvY2Vzc2luZ0NoYW5nZSgpKSB7CisgICAgICAg
IG1fd2ViUGFnZS0+bV9jbGllbnQtPmNhbmNlbFNlbGVjdGlvblZpc3VhbHMoKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIGlmIChtX2NhcmV0QWN0aXZlIHx8IChtX3dlYlBhZ2UtPm1f
aW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpICYmIG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZy
YW1lKCktPnNlbGVjdGlvbigpLT5pc0NhcmV0KCkpKSB7CisgICAgICAgIC8vIFRoaXMgbWF5IHVw
ZGF0ZSB0aGUgY2FyZXQgdG8gbm8gbG9uZ2VyIGJlIGFjdGl2ZS4KKyAgICAgICAgY2FyZXRQb3Np
dGlvbkNoYW5nZWQoKTsKKyAgICB9CisKKyAgICAvLyBFbnRlciBzZWxlY3Rpb24gbW9kZSBpZiBz
ZWxlY3Rpb24gdHlwZSBpcyBSYW5nZVNlbGVjdGlvbiwgYW5kIGRpc2FibGUgc2VsZWN0aW9uIGlm
CisgICAgLy8gc2VsZWN0aW9uIGlzIGFjdGl2ZSBhbmQgYmVjb21lcyBjYXJldCBzZWxlY3Rpb24u
CisgICAgRnJhbWUqIGZyYW1lID0gbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAg
ICBJbnRQb2ludCBmcmFtZVBvcyA9IG1fd2ViUGFnZS0+ZnJhbWVPZmZzZXQoZnJhbWUpOworICAg
IGlmIChtX3NlbGVjdGlvbkFjdGl2ZSAmJiAobV9jYXJldEFjdGl2ZSB8fCBmcmFtZS0+c2VsZWN0
aW9uKCktPmlzTm9uZSgpKSkKKyAgICAgICAgbV9zZWxlY3Rpb25BY3RpdmUgPSBmYWxzZTsKKyAg
ICBlbHNlIGlmIChmcmFtZS0+c2VsZWN0aW9uKCktPmlzUmFuZ2UoKSkKKyAgICAgICAgbV9zZWxl
Y3Rpb25BY3RpdmUgPSB0cnVlOworICAgIGVsc2UgaWYgKCFtX3NlbGVjdGlvbkFjdGl2ZSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCBzdGFydENhcmV0OworICAgIEludFJlY3QgZW5k
Q2FyZXQ7CisKKyAgICAvLyBHZXQgdGhlIHRleHQgcmVjdHMgZnJvbSB0aGUgc2VsZWN0aW9ucyBy
YW5nZS4KKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiByZWdpb247Cisg
ICAgZ2V0Q29uc29saWRhdGVkUmVnaW9uT2ZUZXh0UXVhZHNGb3JTZWxlY3Rpb24oZnJhbWUtPnNl
bGVjdGlvbigpLT5zZWxlY3Rpb24oKSwgcmVnaW9uKTsKKworICAgIC8vIElmIHRoZXJlIGlzIG5v
IGNoYW5nZSBpbiBzZWxlY3RlZCB0ZXh0IGFuZCB0aGUgdmlzdWFsIHJlY3RzCisgICAgLy8gaGF2
ZSBub3QgY2hhbmdlZCB0aGVuIGRvbid0IGJvdGhlciBub3RpZnlpbmcgYW55dGhpbmcuCisgICAg
aWYgKHZpc3VhbENoYW5nZU9ubHkgJiYgbV9sYXN0U2VsZWN0aW9uUmVnaW9uLmlzRXF1YWwocmVn
aW9uKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9sYXN0U2VsZWN0aW9uUmVnaW9uID0gcmVn
aW9uOworCisgICAgaWYgKCFyZWdpb24uaXNFbXB0eSgpKSB7CisgICAgICAgIEludFJlY3QgdW5j
bGlwcGVkU3RhcnRDYXJldDsKKyAgICAgICAgSW50UmVjdCB1bmNsaXBwZWRFbmRDYXJldDsKKwor
ICAgICAgICBib29sIGlzUlRMID0gZGlyZWN0aW9uT2ZFbmNsb3NpbmdCbG9jayhmcmFtZS0+c2Vs
ZWN0aW9uKCkpID09IFJUTDsKKworICAgICAgICBzdGQ6OnZlY3RvcjxCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6SW50UmVjdD4gcmVjdExpc3QgPSByZWdpb24ucmVjdHMoKTsKKworICAgICAgICBJbnRQ
b2ludCBzdGFydENhcmV0UmVmZXJlbmNlUG9pbnQgPSByZWZlcmVuY2VQb2ludChmcmFtZS0+c2Vs
ZWN0aW9uKCktPnNlbGVjdGlvbigpLnZpc2libGVTdGFydCgpLCByZWdpb24uZXh0ZW50cygpLCBm
cmFtZVBvcywgdHJ1ZSAvKiBpc1N0YXJ0Q2FyZXQgKi8sIGlzUlRMKTsKKyAgICAgICAgSW50UG9p
bnQgZW5kQ2FyZXRSZWZlcmVuY2VQb2ludCA9IHJlZmVyZW5jZVBvaW50KGZyYW1lLT5zZWxlY3Rp
b24oKS0+c2VsZWN0aW9uKCkudmlzaWJsZUVuZCgpLCByZWdpb24uZXh0ZW50cygpLCBmcmFtZVBv
cywgZmFsc2UgLyogaXNTdGFydENhcmV0ICovLCBpc1JUTCk7CisKKyAgICAgICAgYWRqdXN0Q2Fy
ZXRSZWN0cyh1bmNsaXBwZWRTdGFydENhcmV0LCBmYWxzZSAvKiB1bmNsaXBwZWQgKi8sIHVuY2xp
cHBlZEVuZENhcmV0LCBmYWxzZSAvKiB1bmNsaXBwZWQgKi8sIHJlY3RMaXN0LCBzdGFydENhcmV0
UmVmZXJlbmNlUG9pbnQsIGVuZENhcmV0UmVmZXJlbmNlUG9pbnQsIGlzUlRMKTsKKworICAgICAg
ICBjbGlwUmVnaW9uVG9WaXNpYmxlQ29udGFpbmVyKHJlZ2lvbik7CisKKyNpZiBTSE9XREVCVUdf
U0VMRUNUSU9OSEFORExFUiAvLyBEb24ndCByZWx5IGp1c3Qgb24gREVCVUdfU0VMRUNUSU9OIHRv
IGF2b2lkIGxvb3AuCisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcmVjdExp
c3Quc2l6ZSgpOyBpKyspCisgICAgICAgICAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJSZWN0IGxpc3QgLSBVbm1vZGlmaWVkICMlZCwg
KCVkLCAlZCkgKCVkIHggJWQpIiwgaSwgcmVjdExpc3RbaV0ueCgpLCByZWN0TGlzdFtpXS55KCks
IHJlY3RMaXN0W2ldLndpZHRoKCksIHJlY3RMaXN0W2ldLmhlaWdodCgpKTsKKyAgICAgICAgZm9y
ICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCByZWdpb24ubnVtUmVjdHMoKTsgaSsrKQorICAgICAg
ICAgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRp
Y2FsLCAiUmVjdCBsaXN0ICAtIENvbnNvbGlkYXRlZCAjJWQsICglZCwgJWQpICglZCB4ICVkKSIs
IGksIHJlZ2lvbi5yZWN0cygpW2ldLngoKSwgcmVnaW9uLnJlY3RzKClbaV0ueSgpLCByZWdpb24u
cmVjdHMoKVtpXS53aWR0aCgpLCByZWdpb24ucmVjdHMoKVtpXS5oZWlnaHQoKSk7CisjZW5kaWYK
KworICAgICAgICBib29sIHNob3VsZENhcmVBYm91dFBvc3NpYmxlQ2xpcHBlZE91dFNlbGVjdGlv
biA9IGZyYW1lICE9IG1fd2ViUGFnZS0+bWFpbkZyYW1lKCkgfHwgbV93ZWJQYWdlLT5tX2lucHV0
SGFuZGxlci0+aXNJbnB1dE1vZGUoKTsKKworICAgICAgICBpZiAoIXJlZ2lvbi5pc0VtcHR5KCkg
fHwgc2hvdWxkQ2FyZUFib3V0UG9zc2libGVDbGlwcGVkT3V0U2VsZWN0aW9uKSB7CisgICAgICAg
ICAgICAvLyBBZGp1c3QgdGhlIGhhbmRsZSBtYXJrZXJzIHRvIGJlIGF0IHRoZSBlbmQgb2YgdGhl
IHBhaW50ZWQgcmVjdC4gV2hlbiBzZWxlY3RpbmcgbGlua3MKKyAgICAgICAgICAgIC8vIGFuZCBv
dGhlciBlbGVtZW50cyB0aGF0IG1heSBoYXZlIGEgbGFyZ2VyIHZpc2libGUgYXJlYSB0aGFuIG5l
ZWRzIHRvIGJlIHJlbmRlcmVkIGEgZ2FwCisgICAgICAgICAgICAvLyBjYW4gZXhpc3QgYmV0d2Vl
biB0aGUgaGFuZGxlIGFuZCBvdmVybGF5IHJlZ2lvbi4KKworICAgICAgICAgICAgYm9vbCBzaG91
bGRDbGlwU3RhcnRDYXJldCA9ICFyZWdpb24uaXNSZWN0SW5SZWdpb24odW5jbGlwcGVkU3RhcnRD
YXJldCk7CisgICAgICAgICAgICBib29sIHNob3VsZENsaXBFbmRDYXJldCA9ICFyZWdpb24uaXNS
ZWN0SW5SZWdpb24odW5jbGlwcGVkRW5kQ2FyZXQpOworCisgICAgICAgICAgICAvLyBGaW5kIHRo
ZSB0b3AgY29ybmVyIGFuZCBib3R0b20gY29ybmVyLgorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3Q+IGNsaXBwZWRSZWN0TGlzdCA9IHJlZ2lvbi5y
ZWN0cygpOworICAgICAgICAgICAgYWRqdXN0Q2FyZXRSZWN0cyhzdGFydENhcmV0LCBzaG91bGRD
bGlwU3RhcnRDYXJldCwgZW5kQ2FyZXQsIHNob3VsZENsaXBFbmRDYXJldCwgY2xpcHBlZFJlY3RM
aXN0LCBzdGFydENhcmV0UmVmZXJlbmNlUG9pbnQsIGVuZENhcmV0UmVmZXJlbmNlUG9pbnQsIGlz
UlRMKTsKKworICAgICAgICAgICAgLy8gVHJhbnNsYXRlIHRoZSBjYXJldCB2YWx1ZXMgYXMgdGhl
eSBtdXN0IGJlIGluIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgorICAgICAgICAgICAgaWYgKCFz
aG91bGRDbGlwU3RhcnRDYXJldCkgeworICAgICAgICAgICAgICAgIHN0YXJ0Q2FyZXQgPSBtX3dl
YlBhZ2UtPm1hcFRvVHJhbnNmb3JtZWQoc3RhcnRDYXJldCk7CisgICAgICAgICAgICAgICAgbV93
ZWJQYWdlLT5jbGlwVG9UcmFuc2Zvcm1lZENvbnRlbnRzUmVjdChzdGFydENhcmV0KTsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzaG91bGRDbGlwRW5kQ2FyZXQpIHsKKyAgICAg
ICAgICAgICAgICBlbmRDYXJldCA9IG1fd2ViUGFnZS0+bWFwVG9UcmFuc2Zvcm1lZChlbmRDYXJl
dCk7CisgICAgICAgICAgICAgICAgbV93ZWJQYWdlLT5jbGlwVG9UcmFuc2Zvcm1lZENvbnRlbnRz
UmVjdChlbmRDYXJldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBE
RUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVj
dGlvbkhhbmRsZXI6OnNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCBTdGFydCBSZWN0PSVzIEVuZCBS
ZWN0PSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q2FyZXQudG9TdHJpbmcoKS51
dGY4KCkuZGF0YSgpLCBlbmRDYXJldC50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAg
bV93ZWJQYWdlLT5tX2NsaWVudC0+bm90aWZ5U2VsZWN0aW9uRGV0YWlsc0NoYW5nZWQoc3RhcnRD
YXJldCwgZW5kQ2FyZXQsIHJlZ2lvbik7Cit9CisKKy8vIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMg
bm90IGluIFdlYktpdCBjb29yZGluYXRlcy4KK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6Y2FyZXRQ
b3NpdGlvbkNoYW5nZWQoKQoreworICAgIERFQlVHX1NFTEVDVElPTihCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiU2VsZWN0aW9uSGFuZGxlcjo6Y2FyZXRQb3NpdGlvbkNoYW5n
ZWQiKTsKKworICAgIEludFJlY3QgY2FyZXRMb2NhdGlvbjsKKyAgICAvLyBJZiB0aGUgaW5wdXQg
ZmllbGQgaXMgbm90IGFjdGl2ZSwgd2UgbXVzdCBiZSB0dXJuaW5nIG9mZiB0aGUgY2FyZXQuCisg
ICAgaWYgKCFtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpICYmIG1fY2Fy
ZXRBY3RpdmUpIHsKKyAgICAgICAgbV9jYXJldEFjdGl2ZSA9IGZhbHNlOworICAgICAgICAvLyBT
ZW5kIGFuIGVtcHR5IGNhcmV0IGNoYW5nZSB0byB0dXJuIG9mZiB0aGUgY2FyZXQuCisgICAgICAg
IG1fd2ViUGFnZS0+bV9jbGllbnQtPm5vdGlmeUNhcmV0Q2hhbmdlZChjYXJldExvY2F0aW9uLCBt
X3dlYlBhZ2UtPm1fdG91Y2hFdmVudEhhbmRsZXItPmxhc3RGYXRGaW5nZXJzUmVzdWx0KCkuaXNU
ZXh0SW5wdXQoKSAvKiB1c2VyVG91Y2hUcmlnZ2VyZWQgKi8pOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgQVNTRVJUKG1fd2ViUGFnZSAmJiBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5G
cmFtZSgpICYmIG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnNlbGVjdGlvbigpKTsK
KworICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgcmVhY2ggdGhpcyBwb2ludCBpZiBp
bnB1dCBtb2RlIGlzIGFjdGl2ZS4KKyAgICBBU1NFUlQobV93ZWJQYWdlLT5tX2lucHV0SGFuZGxl
ci0+aXNJbnB1dE1vZGUoKSk7CisKKyAgICBpZiAobV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJh
bWUoKS0+c2VsZWN0aW9uKCktPnNlbGVjdGlvblR5cGUoKSA9PSBWaXNpYmxlU2VsZWN0aW9uOjpD
YXJldFNlbGVjdGlvbikgeworICAgICAgICBJbnRQb2ludCBmcmFtZU9mZnNldCA9IG1fd2ViUGFn
ZS0+ZnJhbWVPZmZzZXQobV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKSk7CisKKyAgICAg
ICAgY2FyZXRMb2NhdGlvbiA9IG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnNlbGVj
dGlvbigpLT5zZWxlY3Rpb24oKS52aXNpYmxlU3RhcnQoKS5hYnNvbHV0ZUNhcmV0Qm91bmRzKCk7
CisgICAgICAgIGNhcmV0TG9jYXRpb24ubW92ZShmcmFtZU9mZnNldC54KCksIGZyYW1lT2Zmc2V0
LnkoKSk7CisKKyAgICAgICAgLy8gQ2xpcCBhZ2FpbnN0IHRoZSBjb250YWluaW5nIGZyYW1lIGFu
ZCBub2RlIGJvdW5kYXJpZXMuCisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0
UmVnaW9uIHJlZ2lvbihjYXJldExvY2F0aW9uKTsKKyAgICAgICAgY2xpcFJlZ2lvblRvVmlzaWJs
ZUNvbnRhaW5lcihyZWdpb24pOworICAgICAgICBjYXJldExvY2F0aW9uID0gcmVnaW9uLmV4dGVu
dHMoKTsKKyAgICB9CisKKyAgICBtX2NhcmV0QWN0aXZlID0gIWNhcmV0TG9jYXRpb24uaXNFbXB0
eSgpOworCisgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZl
bEluZm8sICJTZWxlY3Rpb25IYW5kbGVyOjpjYXJldFBvc2l0aW9uQ2hhbmdlZCBjYXJldCBSZWN0
ICVkLCAlZCwgJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXRMb2NhdGlvbi54
KCksIGNhcmV0TG9jYXRpb24ueSgpLCBjYXJldExvY2F0aW9uLndpZHRoKCksIGNhcmV0TG9jYXRp
b24uaGVpZ2h0KCkpOworCisgICAgY2FyZXRMb2NhdGlvbiA9IG1fd2ViUGFnZS0+bWFwVG9UcmFu
c2Zvcm1lZChjYXJldExvY2F0aW9uKTsKKyAgICBtX3dlYlBhZ2UtPmNsaXBUb1RyYW5zZm9ybWVk
Q29udGVudHNSZWN0KGNhcmV0TG9jYXRpb24pOworCisgICAgbV93ZWJQYWdlLT5tX2NsaWVudC0+
bm90aWZ5Q2FyZXRDaGFuZ2VkKGNhcmV0TG9jYXRpb24sIG1fd2ViUGFnZS0+bV90b3VjaEV2ZW50
SGFuZGxlci0+bGFzdEZhdEZpbmdlcnNSZXN1bHQoKS5pc1RleHRJbnB1dCgpIC8qIHVzZXJUb3Vj
aFRyaWdnZXJlZCAqLyk7Cit9CisKK2Jvb2wgU2VsZWN0aW9uSGFuZGxlcjo6c2VsZWN0aW9uQ29u
dGFpbnMoY29uc3QgSW50UG9pbnQmIHBvaW50KQoreworICAgIEFTU0VSVChtX3dlYlBhZ2UgJiYg
bV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKSAmJiBtX3dlYlBhZ2UtPmZvY3VzZWRPck1h
aW5GcmFtZSgpLT5zZWxlY3Rpb24oKSk7CisgICAgcmV0dXJuIG1fd2ViUGFnZS0+Zm9jdXNlZE9y
TWFpbkZyYW1lKCktPnNlbGVjdGlvbigpLT5jb250YWlucyhwb2ludCk7Cit9CisKK30KK30KZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1NlbGVjdGlv
bkhhbmRsZXIuaCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1NlbGVj
dGlvbkhhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wYmFkZmIyYjI5MjY4Mzg5ODU4MjEyNDQwMjI5MDNm
YjU1NzZlMDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dl
YktpdFN1cHBvcnQvU2VsZWN0aW9uSGFuZGxlci5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBw
dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg
aXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICog
TGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJl
ZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBTZWxl
Y3Rpb25IYW5kbGVyX2gKKyNkZWZpbmUgU2VsZWN0aW9uSGFuZGxlcl9oCisKKyNpbmNsdWRlICJC
bGFja0JlcnJ5UGxhdGZvcm1JbnRSZWN0UmVnaW9uLmgiCisjaW5jbHVkZSAiQmxhY2tCZXJyeVBs
YXRmb3JtUHJpbWl0aXZlcy5oIgorCituYW1lc3BhY2UgV1RGIHsKK2NsYXNzIFN0cmluZzsKK30K
KworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgSW50UG9pbnQ7CitjbGFzcyBJbnRSZWN0Owor
Y2xhc3MgTm9kZTsKK2NsYXNzIFRleHRHcmFudWxhcml0eTsKK2NsYXNzIFZpc2libGVQb3NpdGlv
bjsKK2NsYXNzIFZpc2libGVTZWxlY3Rpb247Cit9CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsK
KworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIFdlYlBhZ2VQcml2YXRlOworY2xhc3MgV2Vi
U3RyaW5nOworCitjbGFzcyBTZWxlY3Rpb25IYW5kbGVyIHsKK3B1YmxpYzoKKyAgICBTZWxlY3Rp
b25IYW5kbGVyKFdlYlBhZ2VQcml2YXRlKik7CisgICAgflNlbGVjdGlvbkhhbmRsZXIoKTsKKwor
ICAgIGJvb2wgaXNTZWxlY3Rpb25BY3RpdmUoKSB7IHJldHVybiBtX3NlbGVjdGlvbkFjdGl2ZTsg
fQorICAgIHZvaWQgc2V0U2VsZWN0aW9uQWN0aXZlKGJvb2wgYWN0aXZlKSB7IG1fc2VsZWN0aW9u
QWN0aXZlID0gYWN0aXZlOyB9CisKKyAgICB2b2lkIGNhbmNlbFNlbGVjdGlvbigpOworICAgIFdl
YlN0cmluZyBzZWxlY3RlZFRleHQoKSBjb25zdDsKKworICAgIGJvb2wgZmluZE5leHRTdHJpbmco
Y29uc3QgV1RGOjpTdHJpbmcmLCBib29sKTsKKyAgICBib29sIHNlbGVjdGlvbkNvbnRhaW5zKGNv
bnN0IEludFBvaW50Jik7CisKKyAgICB2b2lkIHNldFNlbGVjdGlvbihjb25zdCBJbnRQb2ludCYg
c3RhcnQsIGNvbnN0IEludFBvaW50JiBlbmQpOworICAgIHZvaWQgc2VsZWN0QXRQb2ludChjb25z
dCBJbnRQb2ludCYpOworICAgIHZvaWQgc2VsZWN0T2JqZWN0KGNvbnN0IEludFBvaW50JiwgVGV4
dEdyYW51bGFyaXR5KTsKKyAgICB2b2lkIHNlbGVjdE9iamVjdChUZXh0R3JhbnVsYXJpdHkpOwor
ICAgIHZvaWQgc2VsZWN0T2JqZWN0KE5vZGUqKTsKKworICAgIHZvaWQgc2VsZWN0aW9uUG9zaXRp
b25DaGFuZ2VkKGJvb2wgdmlzdWFsQ2hhbmdlT25seSA9IGZhbHNlKTsKKworICAgIHZvaWQgc2V0
Q2FyZXRQb3NpdGlvbihjb25zdCBJbnRQb2ludCYpOworCisgICAgYm9vbCBsYXN0VXBkYXRlZEVu
ZFBvaW50SXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1fbGFzdFVwZGF0ZWRFbmRQb2ludElzVmFs
aWQ7IH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGNhcmV0UG9zaXRpb25DaGFuZ2VkKCk7CisgICAg
dm9pZCBnZXRDb25zb2xpZGF0ZWRSZWdpb25PZlRleHRRdWFkc0ZvclNlbGVjdGlvbihjb25zdCBW
aXNpYmxlU2VsZWN0aW9uJiwgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb24mKSBj
b25zdDsKKyAgICB2b2lkIGNsaXBSZWdpb25Ub1Zpc2libGVDb250YWluZXIoQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkludFJlY3RSZWdpb24mKTsKKyAgICBib29sIHVwZGF0ZU9ySGFuZGxlSW5wdXRT
ZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbiYgbmV3U2VsZWN0aW9uLCBjb25zdCBJbnRQb2ludCYg
cmVsYXRpdmVTdGFydCwgY29uc3QgSW50UG9pbnQmIHJlbGF0aXZlRW5kKTsKKyAgICBOb2RlKiBE
T01Db250YWluZXJOb2RlRm9yVmlzaWJsZVBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYp
IGNvbnN0OworICAgIGJvb2wgc2hvdWxkVXBkYXRlU2VsZWN0aW9uT3JDYXJldEZvclBvaW50KGNv
bnN0IEludFBvaW50JiwgY29uc3QgSW50UmVjdCYsIGJvb2wgc3RhcnRDYXJldCA9IHRydWUpIGNv
bnN0OworICAgIHVuc2lnbmVkIHNob3J0IGV4dGVuZFNlbGVjdGlvblRvRmllbGRCb3VuZGFyeShi
b29sIGlzU3RhcnRIYW5kbGUsIGNvbnN0IEludFBvaW50JiBzZWxlY3Rpb25Qb2ludCwgVmlzaWJs
ZVNlbGVjdGlvbiYgbmV3U2VsZWN0aW9uKTsKKworICAgIFdlYlBhZ2VQcml2YXRlKiBtX3dlYlBh
Z2U7CisKKyAgICBib29sIG1fc2VsZWN0aW9uQWN0aXZlOworICAgIGJvb2wgbV9jYXJldEFjdGl2
ZTsKKyAgICBib29sIG1fbGFzdFVwZGF0ZWRFbmRQb2ludElzVmFsaWQ7CisgICAgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkludFJlY3RSZWdpb24gbV9sYXN0U2VsZWN0aW9uUmVnaW9uOworfTsKKwor
fQorfQorCisjZW5kaWYgLy8gU2VsZWN0aW9uSGFuZGxlcl9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126821</attachid>
            <date>2012-02-13 13:40:31 -0800</date>
            <delta_ts>2012-02-13 14:06:00 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78136-20120213163800.patch</filename>
            <type>text/plain</type>
            <size>46961</size>
            <attacher name="Nima Ghanavatian">nima.ghanavatian</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3MTEzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDljM2E2NmRhNThjMjhhYjI5
YzQwMjQ5YzBhNTcwYTg2YTA1N2IwNTIuLmFhNTU1MTFmMTA3YWI0YmYwNWNjMGM1YjdhZWZkNTg0
NmYwYjJmMDUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTItMDItMTMgIE5pbWEgR2hh
bmF2YXRpYW4gIDxuZ2hhbmF2YXRpYW5AcmltLmNvbT4KKworICAgICAgICBJbml0aWFsIHVwc3Ry
ZWFtaW5nIG9mIHNlbGVjdGlvbiBoYW5kbGluZyBjb2RlIGZvciBCbGFja0JlcnJ5IHBvcnQKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc4MTM2CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW5pdGlhbCB1cHN0
cmVhbWluZywgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJLaXRTdXBw
b3J0L1NlbGVjdGlvbkhhbmRsZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBibGFja2JlcnJ5L1dl
YktpdFN1cHBvcnQvU2VsZWN0aW9uSGFuZGxlci5oOiBBZGRlZC4KKwogMjAxMi0wMi0wOCAgUm9i
IEJ1aXMgIDxyYnVpc0ByaW0uY29tPgogCiAgICAgICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBE
dW1wUmVuZGVyVHJlZUJsYWNrQmVycnkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2ti
ZXJyeS9XZWJLaXRTdXBwb3J0L1NlbGVjdGlvbkhhbmRsZXIuY3BwIGIvU291cmNlL1dlYktpdC9i
bGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvU2VsZWN0aW9uSGFuZGxlci5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
YTM0MzAxNTM5MWQ0ZDI4OGZjY2U4NjMzMzVmMzY3MGY2ODIwMzc5MgotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1NlbGVjdGlvbkhhbmRs
ZXIuY3BwCkBAIC0wLDAgKzEsOTQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDEx
LCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAy
MTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTZWxl
Y3Rpb25IYW5kbGVyLmgiCisKKyNpbmNsdWRlICJET01TdXBwb3J0LmgiCisjaW5jbHVkZSAiRG9j
dW1lbnQuaCIKKyNpbmNsdWRlICJFZGl0b3IuaCIKKyNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIK
KyNpbmNsdWRlICJGYXRGaW5nZXJzLmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJG
cmFtZVNlbGVjdGlvbi5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxB
bmNob3JFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTEFyZWFFbGVtZW50LmgiCisjaW5jbHVkZSAi
SGl0VGVzdFJlc3VsdC5oIgorI2luY2x1ZGUgIklucHV0SGFuZGxlci5oIgorI2luY2x1ZGUgIklu
dFJlY3QuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUmVuZGVyUGFydC5oIgorI2lu
Y2x1ZGUgIlRleHRHcmFudWxhcml0eS5oIgorI2luY2x1ZGUgIlRvdWNoRXZlbnRIYW5kbGVyLmgi
CisjaW5jbHVkZSAiV2ViUGFnZS5oIgorI2luY2x1ZGUgIldlYlBhZ2VDbGllbnQuaCIKKyNpbmNs
dWRlICJXZWJQYWdlX3AuaCIKKworI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCisjaW5jbHVkZSAi
dmlzaWJsZV91bml0cy5oIgorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtSW50UmVjdFJl
Z2lvbi5oPgorCisjaW5jbHVkZSA8c3lzL2tleWNvZGVzLmg+CisKKyNkZWZpbmUgU0hPV0RFQlVH
X1NFTEVDVElPTkhBTkRMRVIgMAorCisjaWYgU0hPV0RFQlVHX1NFTEVDVElPTkhBTkRMRVIKKyNk
ZWZpbmUgREVCVUdfU0VMRUNUSU9OKHNldmVyaXR5LCBmb3JtYXQsIC4uLikgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OmxvZ0Fsd2F5cyhzZXZlcml0eSwgZm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykKKyNl
bHNlCisjZGVmaW5lIERFQlVHX1NFTEVDVElPTihzZXZlcml0eSwgZm9ybWF0LCAuLi4pCisjZW5k
aWYgLy8gU0hPV0RFQlVHX1NFTEVDVElPTkhBTkRMRVIKKwordXNpbmcgbmFtZXNwYWNlIFdlYkNv
cmU7CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworCitTZWxl
Y3Rpb25IYW5kbGVyOjpTZWxlY3Rpb25IYW5kbGVyKFdlYlBhZ2VQcml2YXRlKiBwYWdlKQorICAg
IDogbV93ZWJQYWdlKHBhZ2UpCisgICAgLCBtX3NlbGVjdGlvbkFjdGl2ZShmYWxzZSkKKyAgICAs
IG1fY2FyZXRBY3RpdmUoZmFsc2UpCisgICAgLCBtX2xhc3RVcGRhdGVkRW5kUG9pbnRJc1ZhbGlk
KGZhbHNlKQoreworfQorCitTZWxlY3Rpb25IYW5kbGVyOjp+U2VsZWN0aW9uSGFuZGxlcigpCit7
Cit9CisKK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6Y2FuY2VsU2VsZWN0aW9uKCkKK3sKKyAgICBt
X3NlbGVjdGlvbkFjdGl2ZSA9IGZhbHNlOworICAgIG1fbGFzdFNlbGVjdGlvblJlZ2lvbiA9IEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uKCk7CisKKyAgICBERUJVR19TRUxFQ1RJ
T04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlvbkhhbmRsZXI6
OmNhbmNlbFNlbGVjdGlvbiIpOworCisgICAgaWYgKG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXIt
PmlzSW5wdXRNb2RlKCkpCisgICAgICAgIG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXItPmNhbmNl
bFNlbGVjdGlvbigpOworICAgIGVsc2UKKyAgICAgICAgbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWlu
RnJhbWUoKS0+c2VsZWN0aW9uKCktPmNsZWFyKCk7Cit9CisKK1dlYlN0cmluZyBTZWxlY3Rpb25I
YW5kbGVyOjpzZWxlY3RlZFRleHQoKSBjb25zdAoreworICAgIHJldHVybiBtX3dlYlBhZ2UtPmZv
Y3VzZWRPck1haW5GcmFtZSgpLT5lZGl0b3IoKS0+c2VsZWN0ZWRUZXh0KCk7Cit9CisKK2Jvb2wg
U2VsZWN0aW9uSGFuZGxlcjo6ZmluZE5leHRTdHJpbmcoY29uc3QgV1RGOjpTdHJpbmcmIHNlYXJj
aFN0cmluZywgYm9vbCBmb3J3YXJkKQoreworICAgIGlmIChzZWFyY2hTdHJpbmcuaXNFbXB0eSgp
KSB7CisgICAgICAgIGNhbmNlbFNlbGVjdGlvbigpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgQVNTRVJUKG1fd2ViUGFnZS0+bV9wYWdlKTsKKworICAgIG1fd2ViUGFnZS0+
bV9wYWdlLT51bm1hcmtBbGxUZXh0TWF0Y2hlcygpOworCisgICAgYm9vbCByZXN1bHQgPSBtX3dl
YlBhZ2UtPm1fcGFnZS0+ZmluZFN0cmluZyhzZWFyY2hTdHJpbmcsIFdURjo6VGV4dENhc2VJbnNl
bnNpdGl2ZSwgZm9yd2FyZCA/IEZpbmREaXJlY3Rpb25Gb3J3YXJkIDogRmluZERpcmVjdGlvbkJh
Y2t3YXJkLCB0cnVlIC8qIHNob3VsZCB3cmFwICovKTsKKyAgICBpZiAocmVzdWx0ICYmIG1fd2Vi
UGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnNlbGVjdGlvbigpLT5zZWxlY3Rpb25UeXBlKCkg
PT0gVmlzaWJsZVNlbGVjdGlvbjo6Tm9TZWxlY3Rpb24pIHsKKyAgICAgICAgLy8gV29yZCB3YXMg
Zm91bmQgYnV0IGNvdWxkIG5vdCBiZSBzZWxlY3RlZCBvbiB0aGlzIHBhZ2UuCisgICAgICAgIHJl
c3VsdCA9IG1fd2ViUGFnZS0+bV9wYWdlLT5tYXJrQWxsTWF0Y2hlc0ZvclRleHQoc2VhcmNoU3Ry
aW5nLCBXVEY6OlRleHRDYXNlSW5zZW5zaXRpdmUsIHRydWUgLyogc2hvdWxkIGhpZ2hsaWdodCAq
LywgMCAvKiBsaW1pdCB0byBtYXRjaCAwID0gdW5saW1pdGVkICovKTsKKyAgICB9CisKKyAgICAv
LyBEZWZvY3VzIHRoZSBpbnB1dCBmaWVsZCBpZiBvbmUgaXMgYWN0aXZlLgorICAgIGlmIChtX3dl
YlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpKQorICAgICAgICBtX3dlYlBhZ2Ut
Pm1faW5wdXRIYW5kbGVyLT5ub2RlRm9jdXNlZCgwKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9
CisKK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6Z2V0Q29uc29saWRhdGVkUmVnaW9uT2ZUZXh0UXVh
ZHNGb3JTZWxlY3Rpb24oY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYgc2VsZWN0aW9uLCBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiYgcmVnaW9uKSBjb25zdAoreworICAgIEFTU0VS
VChyZWdpb24uaXNFbXB0eSgpKTsKKworICAgIGlmICghc2VsZWN0aW9uLmlzUmFuZ2UoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKHNlbGVjdGlvbi5maXJzdFJhbmdlKCkpOworCisg
ICAgVmVjdG9yPEZsb2F0UXVhZD4gcXVhZExpc3Q7CisgICAgRE9NU3VwcG9ydDo6dmlzaWJsZVRl
eHRRdWFkcygqKHNlbGVjdGlvbi5maXJzdFJhbmdlKCkpLCBxdWFkTGlzdCwgdHJ1ZSAvKiB1c2Ug
c2VsZWN0aW9uIGhlaWdodCAqLyk7CisKKyAgICBpZiAoIXF1YWRMaXN0LmlzRW1wdHkoKSkgewor
ICAgICAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZy
YW1lKCktPnZpZXcoKTsKKworICAgICAgICAvLyBmcmFtZVJlY3QgaXMgaW4gZnJhbWUgY29vcmRp
bmF0ZXMuCisgICAgICAgIEludFJlY3QgZnJhbWVSZWN0KEludFBvaW50KDAsIDApLCBmcmFtZVZp
ZXctPmNvbnRlbnRzU2l6ZSgpKTsKKworICAgICAgICAvLyBmcmFtZVBvc2l0aW9uIGlzIGluIG1h
aW4gZnJhbWUgY29vcmRpbmF0ZXMuCisgICAgICAgIEludFBvaW50IGZyYW1lUG9zaXRpb24gPSBt
X3dlYlBhZ2UtPmZyYW1lT2Zmc2V0KG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkpOwor
CisgICAgICAgIC8vIFRoZSByYW5nZXMgcmVjdCBsaXN0IGlzIGJhc2VkIG9uIHJlbmRlciBlbGVt
ZW50cyBhbmQgbWF5IGluY2x1ZGUgbXVsdGlwbGUgYWRqYWNlbnQgcmVjdHMuCisgICAgICAgIC8v
IFVzZSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiB0byBjb25zb2xpZGF0ZSB0
aGVzZSByZWN0cyBpbnRvIGJhbmRzIGFzIHdlbGwgYXMgYSBjb250YWluZXIgdG8gcGFzcworICAg
ICAgICAvLyB0byB0aGUgY2xpZW50LgorCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBxdWFkTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgSW50UmVjdCBlbmNsb3NpbmdS
ZWN0ID0gcXVhZExpc3RbaV0uZW5jbG9zaW5nQm91bmRpbmdCb3goKTsKKyAgICAgICAgICAgIGVu
Y2xvc2luZ1JlY3QuaW50ZXJzZWN0KGZyYW1lUmVjdCk7CisgICAgICAgICAgICBlbmNsb3NpbmdS
ZWN0Lm1vdmUoZnJhbWVQb3NpdGlvbi54KCksIGZyYW1lUG9zaXRpb24ueSgpKTsKKyAgICAgICAg
ICAgIHJlZ2lvbiA9IHVuaW9uUmVnaW9ucyhyZWdpb24sIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJ
bnRSZWN0UmVnaW9uKGVuY2xvc2luZ1JlY3QpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3Rh
dGljIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zaXRpb25Gb3JQb2ludElnbm9yaW5nQ2xpcHBp
bmcoY29uc3QgRnJhbWUmIGZyYW1lLCBjb25zdCBJbnRQb2ludCYgZnJhbWVQb2ludCkKK3sKKyAg
ICAvLyBGcmFtZTo6dmlzaWJsZVBvc2l0aW9uQXRQb2ludCBoYXJkLWNvZGVzIGlnbm9yZUNsaXBw
aW5nPWZhbHNlIGluIHRoZQorICAgIC8vIGNhbGwgdG8gaGl0VGVzdFJlc3VsdEF0UG9pbnQuIFRo
aXMgaGFzIGEgYnVnIHdoZXJlIHNvbWUgcGFnZXMgKHN1Y2ggYXMKKyAgICAvLyBtZXRhZmlsdGVy
KSB3aWxsIHJldHVybiB0aGUgd3JvbmcgVmlzaWJsZVBvc2l0aW9uIGZvciBwb2ludHMgdGhhdCBh
cmUKKyAgICAvLyBvdXRzaWRlIHRoZSB2aXNpYmxlIHJlY3QuIFRvIHdvcmsgYXJvdW5kIHRoZSBi
dWcsIHRoaXMgaXMgYSBjb3B5IG9mCisgICAgLy8gdmlzaWJsZVBvc2l0aW9uQXRQb2ludCB3aGlj
aCB3aGljaCBwYXNzZXMgaWdub3JlQ2xpcHBpbmc9dHJ1ZS4KKyAgICAvLyBTZWUgUklNIEJ1ZyAj
NDMxNS4KKyAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdCA9IGZyYW1lLmV2ZW50SGFuZGxlcigpLT5o
aXRUZXN0UmVzdWx0QXRQb2ludChmcmFtZVBvaW50LCB0cnVlIC8qIGFsbG93U2hhZG93Q29udGVu
dCAqLywgdHJ1ZSAvKiBpZ25vcmVDbGlwcGluZyAqLyk7CisKKyAgICBOb2RlKiBub2RlID0gcmVz
dWx0LmlubmVyTm9kZSgpOworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIFZpc2libGVQ
b3NpdGlvbigpOworCisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVy
KCk7CisgICAgaWYgKCFyZW5kZXJlcikKKyAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigp
OworCisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3MgPSByZW5kZXJlci0+cG9zaXRpb25G
b3JQb2ludChyZXN1bHQubG9jYWxQb2ludCgpKTsKKyAgICBpZiAodmlzaWJsZVBvcy5pc051bGwo
KSkKKyAgICAgICAgdmlzaWJsZVBvcyA9IFZpc2libGVQb3NpdGlvbihQb3NpdGlvbihjcmVhdGVM
ZWdhY3lFZGl0aW5nUG9zaXRpb24obm9kZSwgMCkpKTsKKworICAgIHJldHVybiB2aXNpYmxlUG9z
OworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZGlyZWN0aW9uT2ZQb2ludFJlbGF0aXZlVG9S
ZWN0KGNvbnN0IEludFBvaW50JiBwb2ludCwgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBB
U1NFUlQoIXJlY3QuY29udGFpbnMocG9pbnQpKTsKKworICAgIC8vIFBhZGRpbmcgdG8gcHJldmVu
dCBhY2NpZGVudGFsIHRyaWdnZXIgb2YgdXAvZG93biB3aGVuIGludGVuZGluZyB0byBkbyBob3Jp
em9udGFsIG1vdmVtZW50LgorICAgIGNvbnN0IGludCB2ZXJ0aWNhbFBhZGRpbmcgPSA1OworCisg
ICAgLy8gRG8gaGVpZ2h0IG1vdmVtZW50IGNoZWNrIGZpcnN0IGJ1dCBhZGQgcGFkZGluZy4gV2Ug
bWF5IGJlIG9mZiBvbiBib3RoIHggJiB5IGF4aXMgYW5kIG9ubHkKKyAgICAvLyB3YW50IHRvIG1v
dmUgaW4gb25lIGRpcmVjdGlvbiBhdCBhIHRpbWUuCisgICAgaWYgKHBvaW50LnkoKSArIHZlcnRp
Y2FsUGFkZGluZyA8IHJlY3QueSgpKQorICAgICAgICByZXR1cm4gS0VZQ09ERV9VUDsKKyAgICBp
ZiAocG9pbnQueSgpID4gcmVjdC5tYXhZKCkgKyB2ZXJ0aWNhbFBhZGRpbmcpCisgICAgICAgIHJl
dHVybiBLRVlDT0RFX0RPV047CisgICAgaWYgKHBvaW50LngoKSA8IHJlY3QubG9jYXRpb24oKS54
KCkpCisgICAgICAgIHJldHVybiBLRVlDT0RFX0xFRlQ7CisgICAgaWYgKHBvaW50LngoKSA+IHJl
Y3QubWF4WCgpKQorICAgICAgICByZXR1cm4gS0VZQ09ERV9SSUdIVDsKKworICAgIHJldHVybiAw
OworfQorCitib29sIFNlbGVjdGlvbkhhbmRsZXI6OnNob3VsZFVwZGF0ZVNlbGVjdGlvbk9yQ2Fy
ZXRGb3JQb2ludChjb25zdCBJbnRQb2ludCYgcG9pbnQsIGNvbnN0IEludFJlY3QmIGNhcmV0UmVj
dCwgYm9vbCBzdGFydENhcmV0KSBjb25zdAoreworICAgIEFTU0VSVChtX3dlYlBhZ2UtPm1faW5w
dXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpKTsKKworICAgIC8vIElmIHRoZSBwb2ludCBpc24ndCB2
YWxpZCBkb24ndCBibG9jayBjaGFuZ2UgYXMgaXQgaXMgbm90IGFjdHVhbGx5IGNoYW5naW5nLgor
ICAgIGlmIChwb2ludCA9PSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgVmlzaWJsZVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gbV93ZWJQ
YWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+c2VsZWN0aW9uKCktPnNlbGVjdGlvbigpOworCisg
ICAgLy8gSWYgdGhlIGlucHV0IGZpZWxkIGlzIHNpbmdsZSBsaW5lIG9yIHdlIGFyZSBvbiB0aGUg
Zmlyc3Qgb3IgbGFzdAorICAgIC8vIGxpbmUgb2YgYSBtdWx0aWxpbmUgaW5wdXQgZmllbGQgb25s
eSBob3Jpem9udGFsIG1vdmVtZW50IGlzIHN1cHBvcnRlZC4KKyAgICBib29sIGFib3ZlQ2FyZXQg
PSBwb2ludC55KCkgPCBjYXJldFJlY3QueSgpOworICAgIGJvb2wgYmVsb3dDYXJldCA9IHBvaW50
LnkoKSA+PSBjYXJldFJlY3QubWF4WSgpOworCisgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJTZWxlY3Rpb25IYW5kbGVyOjpzaG91bGRVcGRh
dGVTZWxlY3Rpb25PckNhcmV0Rm9yUG9pbnQgbXVsdGlsaW5lID0gJXMgYWJvdmUgPSAlcyBiZWxv
dyA9ICVzIGZpcnN0IGxpbmUgPSAlcyBsYXN0IGxpbmUgPSAlcyBzdGFydCA9ICVzIFxuIgorICAg
ICAgICAgICAgLCBtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc011bHRpbGluZUlucHV0TW9k
ZSgpID8gInRydWUiIDogImZhbHNlIiwgYWJvdmVDYXJldCA/ICJ0cnVlIiA6ICJmYWxzZSIsIGJl
bG93Q2FyZXQgPyAidHJ1ZSIgOiAiZmFsc2UiCisgICAgICAgICAgICAsIGluU2FtZUxpbmUoY3Vy
cmVudFNlbGVjdGlvbi52aXNpYmxlU3RhcnQoKSwgc3RhcnRPZkVkaXRhYmxlQ29udGVudChjdXJy
ZW50U2VsZWN0aW9uLnZpc2libGVTdGFydCgpKSkgPyAidHJ1ZSIgOiAiZmFsc2UiCisgICAgICAg
ICAgICAsIGluU2FtZUxpbmUoY3VycmVudFNlbGVjdGlvbi52aXNpYmxlRW5kKCksIGVuZE9mRWRp
dGFibGVDb250ZW50KGN1cnJlbnRTZWxlY3Rpb24udmlzaWJsZUVuZCgpKSkgPyAidHJ1ZSIgOiAi
ZmFsc2UiCisgICAgICAgICAgICAsIHN0YXJ0Q2FyZXQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKwor
ICAgIGlmICghbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNNdWx0aWxpbmVJbnB1dE1vZGUo
KSAmJiAoYWJvdmVDYXJldCB8fCBiZWxvd0NhcmV0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIGlmIChzdGFydENhcmV0ICYmIGluU2FtZUxpbmUoY3VycmVudFNlbGVjdGlvbi52aXNpYmxl
U3RhcnQoKSwgc3RhcnRPZkVkaXRhYmxlQ29udGVudChjdXJyZW50U2VsZWN0aW9uLnZpc2libGVT
dGFydCgpKSkgJiYgYWJvdmVDYXJldCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICgh
c3RhcnRDYXJldCAmJiBpblNhbWVMaW5lKGN1cnJlbnRTZWxlY3Rpb24udmlzaWJsZUVuZCgpLCBl
bmRPZkVkaXRhYmxlQ29udGVudChjdXJyZW50U2VsZWN0aW9uLnZpc2libGVFbmQoKSkpICYmIGJl
bG93Q2FyZXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQor
Cit2b2lkIFNlbGVjdGlvbkhhbmRsZXI6OnNldENhcmV0UG9zaXRpb24oY29uc3QgSW50UG9pbnQg
JnBvc2l0aW9uKQoreworICAgIGlmICghbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNJbnB1
dE1vZGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9jYXJldEFjdGl2ZSA9IHRydWU7CisK
KyAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywg
IlNlbGVjdGlvbkhhbmRsZXI6OnNldENhcmV0UG9zaXRpb24gcmVxdWVzdGVkIHBvaW50ICVkLCAl
ZCIsIHBvc2l0aW9uLngoKSwgcG9zaXRpb24ueSgpKTsKKworICAgIEZyYW1lKiBmb2N1c2VkRnJh
bWUgPSBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIEZyYW1lU2VsZWN0aW9u
KiBjb250cm9sbGVyID0gZm9jdXNlZEZyYW1lLT5zZWxlY3Rpb24oKTsKKyAgICBJbnRQb2ludCBy
ZWxhdGl2ZVBvaW50ID0gRE9NU3VwcG9ydDo6Y29udmVydFBvaW50VG9GcmFtZShtX3dlYlBhZ2Ut
Pm1haW5GcmFtZSgpLCBmb2N1c2VkRnJhbWUsIHBvc2l0aW9uKTsKKyAgICBJbnRSZWN0IGN1cnJl
bnRDYXJldFJlY3QgPSBjb250cm9sbGVyLT5zZWxlY3Rpb24oKS52aXNpYmxlU3RhcnQoKS5hYnNv
bHV0ZUNhcmV0Qm91bmRzKCk7CisKKyAgICBpZiAocmVsYXRpdmVQb2ludCA9PSBET01TdXBwb3J0
OjpJbnZhbGlkUG9pbnQgfHwgIXNob3VsZFVwZGF0ZVNlbGVjdGlvbk9yQ2FyZXRGb3JQb2ludChy
ZWxhdGl2ZVBvaW50LCBjdXJyZW50Q2FyZXRSZWN0KSkgeworICAgICAgICBzZWxlY3Rpb25Qb3Np
dGlvbkNoYW5nZWQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZpc2libGVQb3Np
dGlvbiB2aXNpYmxlQ2FyZXRQb3NpdGlvbihmb2N1c2VkRnJhbWUtPnZpc2libGVQb3NpdGlvbkZv
clBvaW50KHJlbGF0aXZlUG9pbnQpKTsKKworICAgIGlmICghRE9NU3VwcG9ydDo6aXNQb3NpdGlv
bkluTm9kZShtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5kb2N1bWVudCgpLT5mb2N1
c2VkTm9kZSgpLCB2aXNpYmxlQ2FyZXRQb3NpdGlvbi5kZWVwRXF1aXZhbGVudCgpKSkgeworICAg
ICAgICBpZiAodW5zaWduZWQgc2hvcnQgY2hhcmFjdGVyID0gZGlyZWN0aW9uT2ZQb2ludFJlbGF0
aXZlVG9SZWN0KHJlbGF0aXZlUG9pbnQsIGN1cnJlbnRDYXJldFJlY3QpKQorICAgICAgICAgICAg
bV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aGFuZGxlTmF2aWdhdGlvbk1vdmUoY2hhcmFjdGVy
LCBmYWxzZSAvKiBzaGlmdERvd24gKi8sIGZhbHNlIC8qIGFsdERvd24gKi8sIGZhbHNlIC8qIGNh
bkV4aXRGaWVsZCAqLyk7CisKKyAgICAgICAgc2VsZWN0aW9uUG9zaXRpb25DaGFuZ2VkKCk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWaXNpYmxlU2VsZWN0aW9uIG5ld1NlbGVjdGlv
bih2aXNpYmxlQ2FyZXRQb3NpdGlvbik7CisgICAgaWYgKGNvbnRyb2xsZXItPnNlbGVjdGlvbigp
ID09IG5ld1NlbGVjdGlvbikgeworICAgICAgICBzZWxlY3Rpb25Qb3NpdGlvbkNoYW5nZWQoKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnRyb2xsZXItPnNldFNlbGVjdGlvbihu
ZXdTZWxlY3Rpb24pOworCisgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpMb2dMZXZlbEluZm8sICJTZWxlY3Rpb25IYW5kbGVyOjpzZXRDYXJldFBvc2l0aW9uIHBvaW50
IHZhbGlkLCBjdXJzb3IgdXBkYXRlZCIpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIG1ha2VzIHN1
cmUgd2UgYXJlIG5vdCByZWR1Y2luZyB0aGUgc2VsZWN0aW9uIHRvIGEgY2FyZXQgc2VsZWN0aW9u
Lgorc3RhdGljIGJvb2wgc2hvdWxkRXh0ZW5kU2VsZWN0aW9uSW5EaXJlY3Rpb24oY29uc3QgVmlz
aWJsZVNlbGVjdGlvbiYgc2VsZWN0aW9uLCB1bnNpZ25lZCBzaG9ydCBjaGFyYWN0ZXIpCit7Cisg
ICAgRnJhbWVTZWxlY3Rpb24gdGVtcFNlbGVjdGlvbjsKKyAgICB0ZW1wU2VsZWN0aW9uLnNldFNl
bGVjdGlvbihzZWxlY3Rpb24pOworICAgIHN3aXRjaCAoY2hhcmFjdGVyKSB7CisgICAgY2FzZSBL
RVlDT0RFX0xFRlQ6CisgICAgICAgIHRlbXBTZWxlY3Rpb24ubW9kaWZ5KEZyYW1lU2VsZWN0aW9u
OjpBbHRlcmF0aW9uRXh0ZW5kLCBEaXJlY3Rpb25MZWZ0LCBDaGFyYWN0ZXJHcmFudWxhcml0eSk7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0VZQ09ERV9SSUdIVDoKKyAgICAgICAgdGVtcFNl
bGVjdGlvbi5tb2RpZnkoRnJhbWVTZWxlY3Rpb246OkFsdGVyYXRpb25FeHRlbmQsIERpcmVjdGlv
blJpZ2h0LCBDaGFyYWN0ZXJHcmFudWxhcml0eSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
S0VZQ09ERV9VUDoKKyAgICAgICAgdGVtcFNlbGVjdGlvbi5tb2RpZnkoRnJhbWVTZWxlY3Rpb246
OkFsdGVyYXRpb25FeHRlbmQsIERpcmVjdGlvbkJhY2t3YXJkLCBMaW5lR3JhbnVsYXJpdHkpOwor
ICAgICAgICBicmVhazsKKyAgICBjYXNlIEtFWUNPREVfRE9XTjoKKyAgICAgICAgdGVtcFNlbGVj
dGlvbi5tb2RpZnkoRnJhbWVTZWxlY3Rpb246OkFsdGVyYXRpb25FeHRlbmQsIERpcmVjdGlvbkZv
cndhcmQsIExpbmVHcmFudWxhcml0eSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6Cisg
ICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICgoY2hhcmFjdGVyID09IEtFWUNPREVfTEVG
VCB8fCBjaGFyYWN0ZXIgPT0gS0VZQ09ERV9SSUdIVCkKKyAgICAgICAgJiYgKCFpblNhbWVMaW5l
KHNlbGVjdGlvbi52aXNpYmxlU3RhcnQoKSwgdGVtcFNlbGVjdGlvbi5zZWxlY3Rpb24oKS52aXNp
YmxlU3RhcnQoKSkKKyAgICAgICAgICAgfHwgIWluU2FtZUxpbmUoc2VsZWN0aW9uLnZpc2libGVF
bmQoKSwgdGVtcFNlbGVjdGlvbi5zZWxlY3Rpb24oKS52aXNpYmxlRW5kKCkpKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRlbXBTZWxlY3Rpb24uc2VsZWN0aW9uKCkuc2Vs
ZWN0aW9uVHlwZSgpID09IFZpc2libGVTZWxlY3Rpb246OlJhbmdlU2VsZWN0aW9uOworfQorCitz
dGF0aWMgVmlzaWJsZVBvc2l0aW9uIGRpcmVjdGlvbmFsVmlzaWJsZVBvc2l0aW9uQXRFeHRlbnRP
ZkJveChGcmFtZSogZnJhbWUsIGNvbnN0IEludFJlY3QmIGJvdW5kaW5nQm94LCB1bnNpZ25lZCBz
aG9ydCBkaXJlY3Rpb24sIGNvbnN0IEludFBvaW50JiBiYXNlUG9pbnQpCit7CisgICAgQVNTRVJU
KGZyYW1lKTsKKworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRp
b24oKTsKKworICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7CisgICAgY2FzZSBLRVlDT0RFX0xFRlQ6
CisgICAgICAgIC8vIEV4dGVuZCB4IHRvIHN0YXJ0IHdpdGhvdXQgbW9kaWZ5aW5nIHkuCisgICAg
ICAgIHJldHVybiBmcmFtZS0+dmlzaWJsZVBvc2l0aW9uRm9yUG9pbnQoSW50UG9pbnQoYm91bmRp
bmdCb3gueCgpLCBiYXNlUG9pbnQueSgpKSk7CisgICAgY2FzZSBLRVlDT0RFX1JJR0hUOgorICAg
ICAgICAvLyBFeHRlbmQgeCB0byBlbmQgd2l0aG91dCBtb2RpZnlpbmcgeS4KKyAgICAgICAgcmV0
dXJuIGZyYW1lLT52aXNpYmxlUG9zaXRpb25Gb3JQb2ludChJbnRQb2ludChib3VuZGluZ0JveC5t
YXhYKCksIGJhc2VQb2ludC55KCkpKTsKKyAgICBjYXNlIEtFWUNPREVfVVA6CisgICAgICAgIC8v
IEV4dGVuZCB5IHRvIHRvcCB3aXRob3V0IG1vZGlmeWluZyB4LgorICAgICAgICByZXR1cm4gZnJh
bWUtPnZpc2libGVQb3NpdGlvbkZvclBvaW50KEludFBvaW50KGJhc2VQb2ludC54KCksIGJvdW5k
aW5nQm94LnkoKSkpOworICAgIGNhc2UgS0VZQ09ERV9ET1dOOgorICAgICAgICAvLyBFeHRlbmQg
eSB0byBib3R0b20gd2l0aG91dCBtb2RpZnlpbmcgeC4KKyAgICAgICAgcmV0dXJuIGZyYW1lLT52
aXNpYmxlUG9zaXRpb25Gb3JQb2ludChJbnRQb2ludChiYXNlUG9pbnQueCgpLCBib3VuZGluZ0Jv
eC5tYXhZKCkpKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBy
ZXR1cm4gZnJhbWUtPnZpc2libGVQb3NpdGlvbkZvclBvaW50KEludFBvaW50KGJhc2VQb2ludC54
KCksIGJhc2VQb2ludC55KCkpKTsKK30KKworc3RhdGljIGJvb2wgcG9pbnRJc091dHNpZGVPZkJv
dW5kaW5nQm94SW5EaXJlY3Rpb24odW5zaWduZWQgZGlyZWN0aW9uLCBjb25zdCBJbnRQb2ludCYg
c2VsZWN0aW9uUG9pbnQsIGNvbnN0IEludFJlY3QmIGJvdW5kaW5nQm94KQoreworICAgIGlmICgo
ZGlyZWN0aW9uID09IEtFWUNPREVfTEVGVCAmJiBzZWxlY3Rpb25Qb2ludC54KCkgPCBib3VuZGlu
Z0JveC54KCkpCisgICAgICAgIHx8IChkaXJlY3Rpb24gPT0gS0VZQ09ERV9VUCAmJiBzZWxlY3Rp
b25Qb2ludC55KCkgPCBib3VuZGluZ0JveC55KCkpCisgICAgICAgIHx8IChkaXJlY3Rpb24gPT0g
S0VZQ09ERV9SSUdIVCAmJiBzZWxlY3Rpb25Qb2ludC54KCkgPiBib3VuZGluZ0JveC5tYXhYKCkp
CisgICAgICAgIHx8IChkaXJlY3Rpb24gPT0gS0VZQ09ERV9ET1dOICYmIHNlbGVjdGlvblBvaW50
LnkoKSA+IGJvdW5kaW5nQm94Lm1heFkoKSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAg
cmV0dXJuIGZhbHNlOworfQorCit1bnNpZ25lZCBzaG9ydCBTZWxlY3Rpb25IYW5kbGVyOjpleHRl
bmRTZWxlY3Rpb25Ub0ZpZWxkQm91bmRhcnkoYm9vbCBpc1N0YXJ0SGFuZGxlLCBjb25zdCBJbnRQ
b2ludCYgc2VsZWN0aW9uUG9pbnQsIFZpc2libGVTZWxlY3Rpb24mIG5ld1NlbGVjdGlvbikKK3sK
KyAgICBGcmFtZSogZm9jdXNlZEZyYW1lID0gbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUo
KTsKKyAgICBpZiAoIWZvY3VzZWRGcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKSB8fCAh
Zm9jdXNlZEZyYW1lLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpLT5yZW5kZXJlcigpKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIEZyYW1lU2VsZWN0aW9uKiBjb250cm9sbGVyID0gZm9jdXNl
ZEZyYW1lLT5zZWxlY3Rpb24oKTsKKworICAgIEludFJlY3QgY2FyZXRSZWN0ID0gaXNTdGFydEhh
bmRsZSA/IGNvbnRyb2xsZXItPnNlbGVjdGlvbigpLnZpc2libGVTdGFydCgpLmFic29sdXRlQ2Fy
ZXRCb3VuZHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbnRy
b2xsZXItPnNlbGVjdGlvbigpLnZpc2libGVFbmQoKS5hYnNvbHV0ZUNhcmV0Qm91bmRzKCk7CisK
KyAgICBJbnRSZWN0IG5vZGVCb3VuZGluZ0JveCA9IGZvY3VzZWRGcmFtZS0+ZG9jdW1lbnQoKS0+
Zm9jdXNlZE5vZGUoKS0+cmVuZGVyZXIoKS0+YWJzb2x1dGVCb3VuZGluZ0JveFJlY3QoKTsKKwor
ICAgIC8vIFN0YXJ0IGhhbmRsZSBpcyBvdXRzaWRlIG9mIHRoZSBmaWVsZC4gVHJlYXQgaXQgYXMg
dGhlIGNoYW5nZWQgaGFuZGxlIGFuZCBtb3ZlCisgICAgLy8gcmVsYXRpdmUgdG8gdGhlIHN0YXJ0
IGNhcmV0IHJlY3QuCisgICAgdW5zaWduZWQgc2hvcnQgY2hhcmFjdGVyID0gZGlyZWN0aW9uT2ZQ
b2ludFJlbGF0aXZlVG9SZWN0KHNlbGVjdGlvblBvaW50LCBjYXJldFJlY3QpOworCisgICAgLy8g
UHJldmVudCBpbmNvcnJlY3QgbW92ZW1lbnQsIGhhbmRsZXMgY2FuIG9ubHkgZXh0ZW5kIHRoZSBz
ZWxlY3Rpb24gdGhpcyB3YXkKKyAgICAvLyB0byBwcmV2ZW50IGludmVyc2lvbiBvZiB0aGUgaGFu
ZGxlcy4KKyAgICBpZiAoaXNTdGFydEhhbmRsZSAmJiAoY2hhcmFjdGVyID09IEtFWUNPREVfUklH
SFQgfHwgY2hhcmFjdGVyID09IEtFWUNPREVfRE9XTikKKyAgICAgICAgfHwgIWlzU3RhcnRIYW5k
bGUgJiYgKGNoYXJhY3RlciA9PSBLRVlDT0RFX0xFRlQgfHwgY2hhcmFjdGVyID09IEtFWUNPREVf
VVApKQorICAgICAgICBjaGFyYWN0ZXIgPSAwOworCisgICAgVmlzaWJsZVBvc2l0aW9uIG5ld1Zp
c2libGVQb3NpdGlvbiA9IGNvbnRyb2xsZXItPnNlbGVjdGlvbigpLnN0YXJ0KCk7CisgICAgLy8g
RXh0ZW5kIHRoZSBzZWxlY3Rpb24gdG8gdGhlIGJvdW5kcyBvZiB0aGUgYm94IGJlZm9yZSBkb2lu
ZyBpbmNyZW1lbnRhbCBzY3JvbGwgaWYgdGhlIHBvaW50IGlzIG91dHNpZGUgdGhlIG5vZGUuCisg
ICAgLy8gRG9uJ3QgZXh0ZW5kIHNlbGVjdGlvbiBhbmQgaGFuZGxlIHRoZSBjaGFyYWN0ZXIgYXQg
dGhlIHNhbWUgdGltZS4KKyAgICBpZiAocG9pbnRJc091dHNpZGVPZkJvdW5kaW5nQm94SW5EaXJl
Y3Rpb24oY2hhcmFjdGVyLCBzZWxlY3Rpb25Qb2ludCwgbm9kZUJvdW5kaW5nQm94KSkKKyAgICAg
ICAgbmV3VmlzaWJsZVBvc2l0aW9uID0gZGlyZWN0aW9uYWxWaXNpYmxlUG9zaXRpb25BdEV4dGVu
dE9mQm94KGZvY3VzZWRGcmFtZSwgbm9kZUJvdW5kaW5nQm94LCBjaGFyYWN0ZXIsIHNlbGVjdGlv
blBvaW50KTsKKworICAgIGlmIChpc1N0YXJ0SGFuZGxlKQorICAgICAgICBuZXdTZWxlY3Rpb24g
PSBWaXNpYmxlU2VsZWN0aW9uKG5ld1Zpc2libGVQb3NpdGlvbiwgbmV3U2VsZWN0aW9uLnZpc2li
bGVFbmQoKSwgdHJ1ZSAvKmlzRGlyZWN0aW9uYWwqLyk7CisgICAgZWxzZQorICAgICAgICBuZXdT
ZWxlY3Rpb24gPSBWaXNpYmxlU2VsZWN0aW9uKG5ld1NlbGVjdGlvbi52aXNpYmxlU3RhcnQoKSwg
bmV3VmlzaWJsZVBvc2l0aW9uLCB0cnVlIC8qaXNEaXJlY3Rpb25hbCovKTsKKworICAgIC8vIElm
IG5vIHNlbGVjdGlvbiB3aWxsIGJlIGNoYW5nZWQsIHJldHVybiB0aGUgY2hhcmFjdGVyIHRvIGV4
dGVuZCB1c2luZyBuYXZpZ2F0aW9uLgorICAgIGlmIChjb250cm9sbGVyLT5zZWxlY3Rpb24oKSA9
PSBuZXdTZWxlY3Rpb24pCisgICAgICAgIHJldHVybiBjaGFyYWN0ZXI7CisKKyAgICAvLyBTZWxl
Y3Rpb24gaGFzIGJlZW4gdXBkYXRlZC4KKyAgICByZXR1cm4gMDsKK30KKworLy8gUmV0dXJucyB0
cnVlIGlmIGhhbmRsZWQuCitib29sIFNlbGVjdGlvbkhhbmRsZXI6OnVwZGF0ZU9ySGFuZGxlSW5w
dXRTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbiYgbmV3U2VsZWN0aW9uLCBjb25zdCBJbnRQb2lu
dCYgcmVsYXRpdmVTdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICwgY29uc3QgSW50UG9pbnQmIHJlbGF0aXZlRW5kKQoreworICAgIEFTU0VS
VChtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpKTsKKworICAgIEZyYW1l
KiBmb2N1c2VkRnJhbWUgPSBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIE5v
ZGUqIGZvY3VzZWROb2RlID0gZm9jdXNlZEZyYW1lLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgp
OworICAgIGlmICghZm9jdXNlZE5vZGUgfHwgIWZvY3VzZWROb2RlLT5yZW5kZXJlcigpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBGcmFtZVNlbGVjdGlvbiogY29udHJvbGxlciA9IGZv
Y3VzZWRGcmFtZS0+c2VsZWN0aW9uKCk7CisKKyAgICBJbnRSZWN0IGN1cnJlbnRTdGFydENhcmV0
UmVjdCA9IGNvbnRyb2xsZXItPnNlbGVjdGlvbigpLnZpc2libGVTdGFydCgpLmFic29sdXRlQ2Fy
ZXRCb3VuZHMoKTsKKyAgICBJbnRSZWN0IGN1cnJlbnRFbmRDYXJldFJlY3QgPSBjb250cm9sbGVy
LT5zZWxlY3Rpb24oKS52aXNpYmxlRW5kKCkuYWJzb2x1dGVDYXJldEJvdW5kcygpOworCisgICAg
Ly8gQ2hlY2sgaWYgdGhlIGhhbmRsZSBtb3ZlbWVudCBpcyB2YWxpZC4KKyAgICBpZiAoIXNob3Vs
ZFVwZGF0ZVNlbGVjdGlvbk9yQ2FyZXRGb3JQb2ludChyZWxhdGl2ZVN0YXJ0LCBjdXJyZW50U3Rh
cnRDYXJldFJlY3QsIHRydWUgLyogc3RhcnRDYXJldCAqLykKKyAgICAgICAgfHwgIXNob3VsZFVw
ZGF0ZVNlbGVjdGlvbk9yQ2FyZXRGb3JQb2ludChyZWxhdGl2ZUVuZCwgY3VycmVudEVuZENhcmV0
UmVjdCwgZmFsc2UgLyogc3RhcnRDYXJldCAqLykpIHsKKyAgICAgICAgc2VsZWN0aW9uUG9zaXRp
b25DaGFuZ2VkKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEludFJlY3Qg
bm9kZUJvdW5kaW5nQm94ID0gZm9jdXNlZE5vZGUtPnJlbmRlcmVyKCktPmFic29sdXRlQm91bmRp
bmdCb3hSZWN0KCk7CisKKyAgICAvLyBPbmx5IGRvIHNwZWNpYWwgaGFuZGxpbmcgaWYgb25lIGhh
bmRsZSBpcyBvdXRzaWRlIG9mIHRoZSBub2RlLgorICAgIGJvb2wgc3RhcnRJc091dHNpZGVPZkZp
ZWxkID0gcmVsYXRpdmVTdGFydCAhPSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQgJiYgIW5vZGVC
b3VuZGluZ0JveC5jb250YWlucyhyZWxhdGl2ZVN0YXJ0KTsKKyAgICBib29sIGVuZElzT3V0c2lk
ZU9mRmllbGQgPSByZWxhdGl2ZUVuZCAhPSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQgJiYgIW5v
ZGVCb3VuZGluZ0JveC5jb250YWlucyhyZWxhdGl2ZUVuZCk7CisgICAgaWYgKHN0YXJ0SXNPdXRz
aWRlT2ZGaWVsZCAmJiBlbmRJc091dHNpZGVPZkZpZWxkKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICB1bnNpZ25lZCBzaG9ydCBjaGFyYWN0ZXIgPSAwOworICAgIGlmIChzdGFydElzT3V0
c2lkZU9mRmllbGQpIHsKKyAgICAgICAgY2hhcmFjdGVyID0gZXh0ZW5kU2VsZWN0aW9uVG9GaWVs
ZEJvdW5kYXJ5KHRydWUgLyogaXNTdGFydEhhbmRsZSAqLywgcmVsYXRpdmVTdGFydCwgbmV3U2Vs
ZWN0aW9uKTsKKyAgICAgICAgaWYgKGNoYXJhY3RlcikgeworICAgICAgICAgICAgLy8gSW52ZXJ0
IHRoZSBzZWxlY3Rpb24gc28gdGhhdCB0aGUgY3Vyc29yIHBvaW50IGlzIGF0IHRoZSBiZWdpbm5p
bmcuCisgICAgICAgICAgICBjb250cm9sbGVyLT5zZXRTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlv
bihjb250cm9sbGVyLT5zZWxlY3Rpb24oKS5lbmQoKSwgY29udHJvbGxlci0+c2VsZWN0aW9uKCku
c3RhcnQoKSkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChlbmRJc091dHNpZGVPZkZpZWxk
KSB7CisgICAgICAgIGNoYXJhY3RlciA9IGV4dGVuZFNlbGVjdGlvblRvRmllbGRCb3VuZGFyeShm
YWxzZSAvKiBpc1N0YXJ0SGFuZGxlICovLCByZWxhdGl2ZUVuZCwgbmV3U2VsZWN0aW9uKTsKKyAg
ICAgICAgaWYgKGNoYXJhY3RlcikgeworICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHNlbGVjdGlv
biBzbyB0aGF0IHRoZSBlbmQgaXMgdGhlIGVkaXQgcG9pbnQuCisgICAgICAgICAgICBjb250cm9s
bGVyLT5zZXRTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbihjb250cm9sbGVyLT5zZWxlY3Rpb24o
KS5zdGFydCgpLCBjb250cm9sbGVyLT5zZWxlY3Rpb24oKS5lbmQoKSkpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgaWYgKCFjaGFyYWN0ZXIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IERFQlVHX1NFTEVDVElPTihCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiU2Vs
ZWN0aW9uSGFuZGxlcjo6c2V0U2VsZWN0aW9uIG1ha2luZyBzZWxlY3Rpb24gY2hhbmdlIGF0dGVt
cHQgdXNpbmcgbmF2aWdhdGlvbiIpOworCisgICAgaWYgKHNob3VsZEV4dGVuZFNlbGVjdGlvbklu
RGlyZWN0aW9uKGNvbnRyb2xsZXItPnNlbGVjdGlvbigpLCBjaGFyYWN0ZXIpKQorICAgICAgICBt
X3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5oYW5kbGVOYXZpZ2F0aW9uTW92ZShjaGFyYWN0ZXIs
IHRydWUgLyogc2hpZnREb3duICovLCBmYWxzZSAvKiBhbHREb3duICovLCBmYWxzZSAvKiBjYW5F
eGl0RmllbGQgKi8pOworCisgICAgLy8gTXVzdCBzZW5kIHRoZSBzZWxlY3Rpb25Qb3NpdGlvbkNo
YW5nZWQgZXZlcnkgdGltZSwgc29tZXRpbWVzIHRoaXMgd2lsbCBkdXBsaWNhdGUgYnV0IGFuIGFj
Y2VwdGVkCisgICAgLy8gaGFuZGxlTmF2aWdhdGlvbk1vdmUgbWF5IG5vdCBtYWtlIGFuIGFjdHVh
bCBzZWxlY3Rpb24gY2hhbmdlLgorICAgIHNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCgpOworICAg
IHJldHVybiB0cnVlOworfQorCit2b2lkIFNlbGVjdGlvbkhhbmRsZXI6OnNldFNlbGVjdGlvbihj
b25zdCBJbnRQb2ludCYgc3RhcnQsIGNvbnN0IEludFBvaW50JiBlbmQpCit7CisgICAgbV9zZWxl
Y3Rpb25BY3RpdmUgPSB0cnVlOworCisgICAgQVNTRVJUKG1fd2ViUGFnZSk7CisgICAgQVNTRVJU
KG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkpOworICAgIEFTU0VSVChtX3dlYlBhZ2Ut
PmZvY3VzZWRPck1haW5GcmFtZSgpLT5zZWxlY3Rpb24oKSk7CisKKyAgICBGcmFtZSogZm9jdXNl
ZEZyYW1lID0gbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICBGcmFtZVNlbGVj
dGlvbiogY29udHJvbGxlciA9IGZvY3VzZWRGcmFtZS0+c2VsZWN0aW9uKCk7CisKKyAgICBERUJV
R19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlv
bkhhbmRsZXI6OnNldFNlbGVjdGlvbiBhZGp1c3RlZCBwb2ludHMgJWQsICVkLCAlZCwgJWQiLCBz
dGFydC54KCksIHN0YXJ0LnkoKSwgZW5kLngoKSwgZW5kLnkoKSk7CisKKyAgICAvLyBOb3RlIHRo
YXQgSW50UG9pbnQoLTEsIC0xKSBpcyBiZWluZyBvdXIgc2VudGluZWwgc28gZmFyIGZvcgorICAg
IC8vIGNsaXBwZWQgb3V0IHNlbGVjdGlvbiBzdGFydGluZyBvciBlbmRpbmcgbG9jYXRpb24uCisg
ICAgYm9vbCBzdGFydElzVmFsaWQgPSBzdGFydCAhPSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQ7
CisgICAgbV9sYXN0VXBkYXRlZEVuZFBvaW50SXNWYWxpZCA9IGVuZCAhPSBET01TdXBwb3J0OjpJ
bnZhbGlkUG9pbnQ7CisKKyAgICAvLyBBdCBsZWFzdCBvbmUgb2YgdGhlIGxvY2F0aW9ucyBtdXN0
IGJlIHZhbGlkLgorICAgIEFTU0VSVChzdGFydElzVmFsaWQgfHwgbV9sYXN0VXBkYXRlZEVuZFBv
aW50SXNWYWxpZCk7CisKKyAgICBJbnRQb2ludCByZWxhdGl2ZVN0YXJ0ID0gc3RhcnQ7CisgICAg
SW50UG9pbnQgcmVsYXRpdmVFbmQgPSBlbmQ7CisKKyAgICBWaXNpYmxlU2VsZWN0aW9uIG5ld1Nl
bGVjdGlvbihjb250cm9sbGVyLT5zZWxlY3Rpb24oKSk7CisKKyAgICAvLyBXZSBuZWVkIHRoZSBz
ZWxlY3Rpb24gdG8gYmUgb3JkZXJlZCBiYXNlIHRoZW4gZXh0ZW50LgorICAgIGlmICghY29udHJv
bGxlci0+c2VsZWN0aW9uKCkuaXNCYXNlRmlyc3QoKSkKKyAgICAgICAgY29udHJvbGxlci0+c2V0
U2VsZWN0aW9uKFZpc2libGVTZWxlY3Rpb24oY29udHJvbGxlci0+c2VsZWN0aW9uKCkuc3RhcnQo
KSwgY29udHJvbGxlci0+c2VsZWN0aW9uKCkuZW5kKCkpKTsKKworICAgIGlmIChzdGFydElzVmFs
aWQpIHsKKyAgICAgICAgcmVsYXRpdmVTdGFydCA9IERPTVN1cHBvcnQ6OmNvbnZlcnRQb2ludFRv
RnJhbWUobV93ZWJQYWdlLT5tYWluRnJhbWUoKSwgZm9jdXNlZEZyYW1lLCBzdGFydCk7CisKKyAg
ICAgICAgLy8gU2V0IHRoZSBzZWxlY3Rpb24gd2l0aCB2YWxpZGF0aW9uLgorICAgICAgICBuZXdT
ZWxlY3Rpb24uc2V0QmFzZSh2aXNpYmxlUG9zaXRpb25Gb3JQb2ludElnbm9yaW5nQ2xpcHBpbmco
KmZvY3VzZWRGcmFtZSwgcmVsYXRpdmVTdGFydCkpOworCisgICAgICAgIC8vIFJlc2V0IHRoZSBz
ZWxlY3Rpb24gdXNpbmcgdGhlIGV4aXN0aW5nIGV4dGVudCB3aXRob3V0IHZhbGlkYXRpb24uCisg
ICAgICAgIG5ld1NlbGVjdGlvbi5zZXRXaXRob3V0VmFsaWRhdGlvbihuZXdTZWxlY3Rpb24uYmFz
ZSgpLCBjb250cm9sbGVyLT5zZWxlY3Rpb24oKS5lbmQoKSk7CisgICAgfQorCisgICAgaWYgKG1f
bGFzdFVwZGF0ZWRFbmRQb2ludElzVmFsaWQpIHsKKyAgICAgICAgcmVsYXRpdmVFbmQgPSBET01T
dXBwb3J0Ojpjb252ZXJ0UG9pbnRUb0ZyYW1lKG1fd2ViUGFnZS0+bWFpbkZyYW1lKCksIGZvY3Vz
ZWRGcmFtZSwgZW5kKTsKKworICAgICAgICAvLyBTZXQgdGhlIHNlbGVjdGlvbiB3aXRoIHZhbGlk
YXRpb24uCisgICAgICAgIG5ld1NlbGVjdGlvbi5zZXRFeHRlbnQodmlzaWJsZVBvc2l0aW9uRm9y
UG9pbnRJZ25vcmluZ0NsaXBwaW5nKCpmb2N1c2VkRnJhbWUsIHJlbGF0aXZlRW5kKSk7CisKKyAg
ICAgICAgLy8gUmVzZXQgdGhlIHNlbGVjdGlvbiB1c2luZyB0aGUgZXhpc3RpbmcgYmFzZSB3aXRo
b3V0IHZhbGlkYXRpb24uCisgICAgICAgIG5ld1NlbGVjdGlvbi5zZXRXaXRob3V0VmFsaWRhdGlv
bihjb250cm9sbGVyLT5zZWxlY3Rpb24oKS5zdGFydCgpLCBuZXdTZWxlY3Rpb24uZXh0ZW50KCkp
OworICAgIH0KKworICAgIGlmIChtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9k
ZSgpKSB7CisgICAgICAgIGlmICh1cGRhdGVPckhhbmRsZUlucHV0U2VsZWN0aW9uKG5ld1NlbGVj
dGlvbiwgcmVsYXRpdmVTdGFydCwgcmVsYXRpdmVFbmQpKQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIGlmIChjb250cm9sbGVyLT5zZWxlY3Rpb24oKSA9PSBuZXdTZWxlY3Rpb24p
IHsKKyAgICAgICAgc2VsZWN0aW9uUG9zaXRpb25DaGFuZ2VkKCk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIHNpemUgaXMgcmVkdWNlIHRvIGxlc3Mg
dGhhbiBhIGNoYXJhY3Rlciwgc2VsZWN0aW9uIHR5cGUgYmVjb21lcworICAgIC8vIENhcmV0LiBB
cyBsb25nIGFzIGl0IGlzIHN0aWxsIGEgcmFuZ2UsIGl0J3MgYSB2YWxpZCBzZWxlY3Rpb24uIFNl
bGVjdGlvbiBjYW5ub3QKKyAgICAvLyBiZSBjYW5jZWxsZWQgdGhyb3VnaCB0aGlzIGZ1bmN0aW9u
LgorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIHJlZ2lvbjsKKyAgICBn
ZXRDb25zb2xpZGF0ZWRSZWdpb25PZlRleHRRdWFkc0ZvclNlbGVjdGlvbihuZXdTZWxlY3Rpb24s
IHJlZ2lvbik7CisgICAgY2xpcFJlZ2lvblRvVmlzaWJsZUNvbnRhaW5lcihyZWdpb24pOworICAg
IGlmICghcmVnaW9uLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBDaGVjayBpZiB0aGUgaGFuZGxl
cyByZXZlcnNlZCBwb3NpdGlvbi4KKyAgICAgICAgaWYgKG1fc2VsZWN0aW9uQWN0aXZlICYmICFu
ZXdTZWxlY3Rpb24uaXNCYXNlRmlyc3QoKSkKKyAgICAgICAgICAgIG1fd2ViUGFnZS0+bV9jbGll
bnQtPm5vdGlmeVNlbGVjdGlvbkhhbmRsZXNSZXZlcnNlZCgpOworCisgICAgICAgIGNvbnRyb2xs
ZXItPnNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb24pOworCisgICAgICAgIERFQlVHX1NFTEVDVElP
TihCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiU2VsZWN0aW9uSGFuZGxlcjo6
c2V0U2VsZWN0aW9uIHNlbGVjdGlvbiBwb2ludHMgdmFsaWQsIHNlbGVjdGlvbiB1cGRhdGVkIik7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUmVxdWVzdGVkIHNlbGVjdGlvbiByZXN1bHRzIGlu
IGFuIGVtcHR5IHNlbGVjdGlvbiwgc2tpcCB0aGlzIGNoYW5nZS4KKyAgICAgICAgc2VsZWN0aW9u
UG9zaXRpb25DaGFuZ2VkKCk7CisKKyAgICAgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpMb2dMZXZlbFdhcm4sICJTZWxlY3Rpb25IYW5kbGVyOjpzZXRTZWxlY3Rpb24g
c2VsZWN0aW9uIHBvaW50cyBpbnZhbGlkLCBzZWxlY3Rpb24gbm90IHVwZGF0ZWQiKTsKKyAgICB9
Cit9CisKKy8vIEZJWE1FIHJlLXVzZSB0aGlzIGluIGNvbnRleHQuIE11c3QgYmUgdXBkYXRlZCB0
byBpbmNsdWRlIGFuIG9wdGlvbiB0byByZXR1cm4gdGhlIGhyZWYuCisvLyBUaGlzIGZ1bmN0aW9u
IHNob3VsZCBiZSBtb3ZlZCB0byBhIG5ldyB1bml0IGZpbGUuIE5hbWVzIHN1Z2dldGlvbnMgaW5j
bHVkZSBET01RdWVyaWVzCisvLyBhbmQgTm9kZVR5cGVzLiBGdW5jdGlvbnMgY3VycmVudGx5IGlu
IElucHV0SGFuZGxlci5jcHAsIFNlbGVjdGlvbkhhbmRsZXIuY3BwIGFuZCBXZWJQYWdlLmNwcAor
Ly8gY2FuIGFsbCBiZSBtb3ZlZCBpbi4KK3N0YXRpYyBOb2RlKiBlbmNsb3NpbmdMaW5rRXZlbnRQ
YXJlbnRGb3JOb2RlKE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1
cm4gMDsKKworICAgIE5vZGUqIGxpbmtOb2RlID0gbm9kZS0+ZW5jbG9zaW5nTGlua0V2ZW50UGFy
ZW50T3JTZWxmKCk7CisgICAgcmV0dXJuIGxpbmtOb2RlICYmIGxpbmtOb2RlLT5pc0xpbmsoKSA/
IGxpbmtOb2RlIDogMDsKK30KKwordm9pZCBTZWxlY3Rpb25IYW5kbGVyOjpzZWxlY3RBdFBvaW50
KGNvbnN0IEludFBvaW50JiBsb2NhdGlvbikKK3sKKyAgICAvLyBJZiBwb2ludCBpcyBpbnZhbGlk
IHRyaWdnZXIgc2VsZWN0aW9uIGJhc2VkIGV4cGFuc2lvbi4KKyAgICBpZiAobG9jYXRpb24gPT0g
RE9NU3VwcG9ydDo6SW52YWxpZFBvaW50KSB7CisgICAgICAgIHNlbGVjdE9iamVjdChXb3JkR3Jh
bnVsYXJpdHkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTm9kZSogdGFyZ2V0Tm9k
ZTsKKyAgICBJbnRQb2ludCB0YXJnZXRQb3NpdGlvbjsKKyAgICAvLyBGSVhNRTogRmFjdG9yeSB0
aGlzIGdldCByaWdodCBmYXQgZmluZ2VyIGNvZGUgaW50byBhIGhlbHBlci4KKyAgICBjb25zdCBG
YXRGaW5nZXJzUmVzdWx0IGxhc3RGYXRGaW5nZXJzUmVzdWx0ID0gbV93ZWJQYWdlLT5tX3RvdWNo
RXZlbnRIYW5kbGVyLT5sYXN0RmF0RmluZ2Vyc1Jlc3VsdCgpOworICAgIGlmIChsYXN0RmF0Rmlu
Z2Vyc1Jlc3VsdC5wb3NpdGlvbldhc0FkanVzdGVkKCkgJiYgbGFzdEZhdEZpbmdlcnNSZXN1bHQu
bm9kZUFzRWxlbWVudElmQXBwbGljYWJsZSgpKSB7CisgICAgICAgIHRhcmdldE5vZGUgPSBsYXN0
RmF0RmluZ2Vyc1Jlc3VsdC52YWxpZE5vZGUoKTsKKyAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBs
YXN0RmF0RmluZ2Vyc1Jlc3VsdC5hZGp1c3RlZFBvc2l0aW9uKCk7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgRmF0RmluZ2Vyc1Jlc3VsdCBuZXdGYXRGaW5nZXJzUmVzdWx0ID0gRmF0RmluZ2Vycyht
X3dlYlBhZ2UsIGxvY2F0aW9uLCBGYXRGaW5nZXJzOjpUZXh0KS5maW5kQmVzdFBvaW50KCk7Cisg
ICAgICAgIGlmICghbmV3RmF0RmluZ2Vyc1Jlc3VsdC5wb3NpdGlvbldhc0FkanVzdGVkKCkpCisg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBuZXdGYXRGaW5n
ZXJzUmVzdWx0LmFkanVzdGVkUG9zaXRpb24oKTsKKyAgICAgICAgdGFyZ2V0Tm9kZSA9IG5ld0Zh
dEZpbmdlcnNSZXN1bHQudmFsaWROb2RlKCk7CisgICAgfQorCisgICAgQVNTRVJUKHRhcmdldE5v
ZGUpOworCisgICAgLy8gSWYgdGhlIG5vZGUgYXQgdGhlIHBvaW50IGlzIGEgbGluaywgZm9jdXMg
b24gdGhlIGVudGlyZSBsaW5rLCBub3QgYSB3b3JkLgorICAgIGlmIChOb2RlKiBsaW5rID0gZW5j
bG9zaW5nTGlua0V2ZW50UGFyZW50Rm9yTm9kZSh0YXJnZXROb2RlKSkgeworICAgICAgICBzZWxl
Y3RPYmplY3QobGluayk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBzZWxlY3RB
dFBvaW50IEFQSSBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBXb3JkR3JhbnVsYXJpdHkgYnV0IG1h
eSBiZSBleHRlbmRlZCBpbiB0aGUgZnV0dXJlLgorICAgIHNlbGVjdE9iamVjdCh0YXJnZXRQb3Np
dGlvbiwgV29yZEdyYW51bGFyaXR5KTsKK30KKworc3RhdGljIGJvb2wgZXhwYW5kU2VsZWN0aW9u
VG9HcmFudWxhcml0eShGcmFtZSogZnJhbWUsIFZpc2libGVTZWxlY3Rpb24gc2VsZWN0aW9uLCBU
ZXh0R3JhbnVsYXJpdHkgZ3JhbnVsYXJpdHksIGJvb2wgaXNJbnB1dE1vZGUpCit7CisgICAgQVNT
RVJUKGZyYW1lKTsKKyAgICBBU1NFUlQoZnJhbWUtPnNlbGVjdGlvbigpKTsKKworICAgIGlmICgh
KHNlbGVjdGlvbi5zdGFydCgpLmFuY2hvck5vZGUoKSAmJiBzZWxlY3Rpb24uc3RhcnQoKS5hbmNo
b3JOb2RlKCktPmlzVGV4dE5vZGUoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlm
IChncmFudWxhcml0eSA9PSBXb3JkR3JhbnVsYXJpdHkpCisgICAgICAgIHNlbGVjdGlvbiA9IERP
TVN1cHBvcnQ6OnZpc2libGVTZWxlY3Rpb25Gb3JDbG9zZXN0QWN0dWFsV29yZFN0YXJ0KHNlbGVj
dGlvbik7CisKKyAgICBzZWxlY3Rpb24uZXhwYW5kVXNpbmdHcmFudWxhcml0eShncmFudWxhcml0
eSk7CisgICAgUmVmUHRyPFJhbmdlPiBuZXdSYW5nZSA9IHNlbGVjdGlvbi50b05vcm1hbGl6ZWRS
YW5nZSgpOworICAgIFJlZlB0cjxSYW5nZT4gb2xkUmFuZ2UgPSBmcmFtZS0+c2VsZWN0aW9uKCkt
PnNlbGVjdGlvbigpLnRvTm9ybWFsaXplZFJhbmdlKCk7CisgICAgRUFmZmluaXR5IGFmZmluaXR5
ID0gZnJhbWUtPnNlbGVjdGlvbigpLT5hZmZpbml0eSgpOworCisgICAgaWYgKGlzSW5wdXRNb2Rl
ICYmICFmcmFtZS0+ZWRpdG9yKCktPmNsaWVudCgpLT5zaG91bGRDaGFuZ2VTZWxlY3RlZFJhbmdl
KG9sZFJhbmdlLmdldCgpLCBuZXdSYW5nZS5nZXQoKSwgYWZmaW5pdHksIGZhbHNlKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGZyYW1lLT5zZWxlY3Rpb24oKS0+c2V0U2Vs
ZWN0ZWRSYW5nZShuZXdSYW5nZS5nZXQoKSwgYWZmaW5pdHksIHRydWUpOworfQorCit2b2lkIFNl
bGVjdGlvbkhhbmRsZXI6OnNlbGVjdE9iamVjdChjb25zdCBJbnRQb2ludCYgbG9jYXRpb24sIFRl
eHRHcmFudWxhcml0eSBncmFudWxhcml0eSkKK3sKKyAgICBBU1NFUlQobG9jYXRpb24ueCgpID49
IDAgJiYgbG9jYXRpb24ueSgpID49IDApOworICAgIEFTU0VSVChtX3dlYlBhZ2UgJiYgbV93ZWJQ
YWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKSAmJiBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFt
ZSgpLT5zZWxlY3Rpb24oKSk7CisgICAgRnJhbWUqIGZvY3VzZWRGcmFtZSA9IG1fd2ViUGFnZS0+
Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisKKyAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlvbkhhbmRsZXI6OnNlbGVjdE9iamVjdCBh
ZGp1c3RlZCBwb2ludHMgJWQsICVkIiwgbG9jYXRpb24ueCgpLCBsb2NhdGlvbi55KCkpOworCisg
ICAgSW50UG9pbnQgcmVsYXRpdmVQb2ludCA9IERPTVN1cHBvcnQ6OmNvbnZlcnRQb2ludFRvRnJh
bWUobV93ZWJQYWdlLT5tYWluRnJhbWUoKSwgZm9jdXNlZEZyYW1lLCBsb2NhdGlvbik7CisgICAg
VmlzaWJsZVBvc2l0aW9uIHBvaW50TG9jYXRpb24oZm9jdXNlZEZyYW1lLT52aXNpYmxlUG9zaXRp
b25Gb3JQb2ludChyZWxhdGl2ZVBvaW50KSk7CisgICAgVmlzaWJsZVNlbGVjdGlvbiBzZWxlY3Rp
b24gPSBWaXNpYmxlU2VsZWN0aW9uKHBvaW50TG9jYXRpb24sIHBvaW50TG9jYXRpb24pOworCisg
ICAgbV9zZWxlY3Rpb25BY3RpdmUgPSBleHBhbmRTZWxlY3Rpb25Ub0dyYW51bGFyaXR5KGZvY3Vz
ZWRGcmFtZSwgc2VsZWN0aW9uLCBncmFudWxhcml0eSwgbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxl
ci0+aXNJbnB1dE1vZGUoKSk7Cit9CisKK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6c2VsZWN0T2Jq
ZWN0KFRleHRHcmFudWxhcml0eSBncmFudWxhcml0eSkKK3sKKyAgICBBU1NFUlQobV93ZWJQYWdl
ICYmIG1faW5wdXRIYW5kbGVyKTsKKyAgICAvLyBVc2luZyBjYXJldCBsb2NhdGlvbiwgbXVzdCBi
ZSBpbnNpZGUgYW4gaW5wdXQgZmllbGQuCisgICAgaWYgKCFtX3dlYlBhZ2UtPm1faW5wdXRIYW5k
bGVyLT5pc0lucHV0TW9kZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQobV93ZWJQ
YWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKSAmJiBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFt
ZSgpLT5zZWxlY3Rpb24oKSk7CisgICAgRnJhbWUqIGZvY3VzZWRGcmFtZSA9IG1fd2ViUGFnZS0+
Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisKKyAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlvbkhhbmRsZXI6OnNlbGVjdE9iamVjdCB1
c2luZyBjdXJyZW50IHNlbGVjdGlvbiIpOworCisgICAgLy8gVXNlIHRoZSBjdXJyZW50IHNlbGVj
dGlvbiBhcyB0aGUgc2VsZWN0aW9uIHBvaW50LgorICAgIEFTU0VSVChmb2N1c2VkRnJhbWUtPnNl
bGVjdGlvbigpLT5zZWxlY3Rpb25UeXBlKCkgIT0gVmlzaWJsZVNlbGVjdGlvbjo6Tm9TZWxlY3Rp
b24pOworICAgIG1fc2VsZWN0aW9uQWN0aXZlID0gZXhwYW5kU2VsZWN0aW9uVG9HcmFudWxhcml0
eShmb2N1c2VkRnJhbWUsIGZvY3VzZWRGcmFtZS0+c2VsZWN0aW9uKCktPnNlbGVjdGlvbigpLCBn
cmFudWxhcml0eSwgdHJ1ZSAvKiBpc0lucHV0TW9kZSAqLyk7Cit9CisKK3ZvaWQgU2VsZWN0aW9u
SGFuZGxlcjo6c2VsZWN0T2JqZWN0KE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFub2RlKQorICAg
ICAgICByZXR1cm47CisKKyAgICBtX3NlbGVjdGlvbkFjdGl2ZSA9IHRydWU7CisKKyAgICBBU1NF
UlQobV93ZWJQYWdlICYmIG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkgJiYgbV93ZWJQ
YWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+c2VsZWN0aW9uKCkpOworICAgIEZyYW1lKiBmb2N1
c2VkRnJhbWUgPSBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpOworCisgICAgREVCVUdf
U0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJTZWxlY3Rpb25I
YW5kbGVyOjpzZWxlY3ROb2RlIik7CisKKyAgICBWaXNpYmxlU2VsZWN0aW9uIHNlbGVjdGlvbiA9
IFZpc2libGVTZWxlY3Rpb246OnNlbGVjdGlvbkZyb21Db250ZW50c09mTm9kZShub2RlKTsKKyAg
ICBmb2N1c2VkRnJhbWUtPnNlbGVjdGlvbigpLT5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKK30K
Kworc3RhdGljIFRleHREaXJlY3Rpb24gZGlyZWN0aW9uT2ZFbmNsb3NpbmdCbG9jayhGcmFtZVNl
bGVjdGlvbiogc2VsZWN0aW9uKQoreworICAgIE5vZGUqIGVuY2xvc2luZ0Jsb2NrTm9kZSA9IGVu
Y2xvc2luZ0Jsb2NrKHNlbGVjdGlvbi0+c2VsZWN0aW9uKCkuZXh0ZW50KCkuZGVwcmVjYXRlZE5v
ZGUoKSk7CisgICAgaWYgKCFlbmNsb3NpbmdCbG9ja05vZGUpCisgICAgICAgIHJldHVybiBMVFI7
CisKKyAgICBpZiAoUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGVuY2xvc2luZ0Jsb2NrTm9kZS0+
cmVuZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuIHJlbmRlcmVyLT5zdHlsZSgpLT5kaXJlY3Rpb24o
KTsKKworICAgIHJldHVybiBMVFI7Cit9CisKKy8vIFJldHVybnMgPiAwIGlmIHAxIGlzICJjbG9z
ZXIiIHRvIHJlZmVyZW5jZVBvaW50LCA8IDAgaWYgcDIgaXMgImNsb3NlciIsIDAgaWYgdGhleSBh
cmUgZXF1aWRpc3RhbnQuCisvLyBCZWNhdXNlIHRleHQgaXMgdXN1YWxseSBhcnJhbmdlZCBpbiBo
b3Jpem9udGFsIHJvd3MsIGRpc3RhbmNlIGlzIG1lYXN1cmVkIGFsb25nIHRoZSB5LWF4aXMsIHdp
dGggeC1heGlzIHVzZWQgb25seSB0byBicmVhayB0aWVzLgorLy8gSWYgcmlnaHRHcmF2aXR5IGlz
IHRydWUsIHRoZSByaWdodC1tb3N0IHgtY29vcmRpbmF0ZSBpcyBjaG9zZW4sIG90aGVyd2lzZSB0
ZWggbGVmdC1tb3N0IGNvb3JkaW5hdGUgaXMgY2hvc2VuLgorc3RhdGljIGlubGluZSBpbnQgY29t
cGFyZVBvaW50c1RvUmVmZXJlbmNlUG9pbnQoY29uc3QgSW50UG9pbnQmIHAxLCBjb25zdCBJbnRQ
b2ludCYgcDIsIGNvbnN0IEludFBvaW50JiByZWZlcmVuY2VQb2ludCwgYm9vbCByaWdodEdyYXZp
dHkpCit7CisgICAgaW50IGR5MSA9IGFicyhyZWZlcmVuY2VQb2ludC55KCkgLSBwMS55KCkpOwor
ICAgIGludCBkeTIgPSBhYnMocmVmZXJlbmNlUG9pbnQueSgpIC0gcDIueSgpKTsKKyAgICBpZiAo
ZHkxICE9IGR5MikKKyAgICAgICAgcmV0dXJuIGR5MiAtIGR5MTsKKworICAgIC8vIFNhbWUgeS1j
b29yZGluYXRlLCBjaG9vc2UgdGhlIGZhcnRoZXN0IHJpZ2h0IChvciBsZWZ0KSBwb2ludC4KKyAg
ICBpZiAocDEueCgpID09IHAyLngoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAocDEu
eCgpID4gcDIueCgpKQorICAgICAgICByZXR1cm4gcmlnaHRHcmF2aXR5ID8gMSA6IC0xOworCisg
ICAgcmV0dXJuIHJpZ2h0R3Jhdml0eSA/IC0xIDogMTsKK30KKworLy8gTk9URS9GSVhNRTogRHVl
IHRvIHI3NzI4Niwgd2UgYXJlIGdldHRpbmcgb2ZmLWJ5LW9uZSByZXN1bHRzIGluIHRoZSBJbnRS
ZWN0IGNsYXNzIGNvdW50ZXJwYXJ0IGltcGxlbWVudGF0aW9uIG9mIHRoZQorLy8gICAgICAgICAg
ICAgbWV0aG9kcyBiZWxvdy4gQXMgZG9uZSBpbiByODk4MDMsIHI3NzkyOCBhbmQgYSBmZXcgb3Ro
ZXJzLCBsZXRzIHVzZSBsb2NhbCBtZXRob2QgdG8gZml4IGl0LgorLy8gICAgICAgICAgICAgV2Ug
c2hvdWxkIGtlZXAgb3VyIGV5ZXMgdmVyeSBvcGVuIG9uIGl0LCBzaW5jZSBpdCBjYW4gYWZmZWN0
IEJhY2tpbmdTdG9yZSB2ZXJ5IGJhZGx5Lgorc3RhdGljIEludFBvaW50IG1pblhNaW5ZQ29ybmVy
KGNvbnN0IEludFJlY3QmIHJlY3QpIHsgcmV0dXJuIHJlY3QubG9jYXRpb24oKTsgfSAvLyB0eXBp
Y2FsbHkgdG9wTGVmdAorc3RhdGljIEludFBvaW50IG1heFhNaW5ZQ29ybmVyKGNvbnN0IEludFJl
Y3QmIHJlY3QpIHsgcmV0dXJuIEludFBvaW50KHJlY3QueCgpICsgcmVjdC53aWR0aCgpIC0gMSwg
cmVjdC55KCkpOyB9IC8vIHR5cGljYWxseSB0b3BSaWdodAorc3RhdGljIEludFBvaW50IG1pblhN
YXhZQ29ybmVyKGNvbnN0IEludFJlY3QmIHJlY3QpIHsgcmV0dXJuIEludFBvaW50KHJlY3QueCgp
LCByZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCkgLSAxKTsgfSAvLyB0eXBpY2FsbHkgYm90dG9tTGVm
dAorc3RhdGljIEludFBvaW50IG1heFhNYXhZQ29ybmVyKGNvbnN0IEludFJlY3QmIHJlY3QpIHsg
cmV0dXJuIEludFBvaW50KHJlY3QueCgpICsgcmVjdC53aWR0aCgpIC0gMSwgcmVjdC55KCkgKyBy
ZWN0LmhlaWdodCgpIC0gMSk7IH0gLy8gdHlwaWNhbGx5IGJvdHRvbVJpZ2h0CisKKy8vIFRoZSBj
YXJldCBpcyBhIG9uZS1waXhlbCB3aWRlIGxpbmUgZG93biBlaXRoZXIgdGhlIHJpZ2h0IG9yIGxl
ZnQgZWRnZSBvZiBhCisvLyByZWN0LCBkZXBlbmRpbmcgb24gdGhlIHRleHQgZGlyZWN0aW9uLgor
c3RhdGljIGlubGluZSBib29sIGNhcmV0SXNPbkxlZnQoYm9vbCBpc1N0YXJ0Q2FyZXQsIGJvb2wg
aXNSVEwpCit7CisgICAgaWYgKGlzU3RhcnRDYXJldCkKKyAgICAgICAgcmV0dXJuICFpc1JUTDsK
KworICAgIHJldHVybiBpc1JUTDsKK30KKworc3RhdGljIGlubGluZSBJbnRQb2ludCBjYXJldExv
Y2F0aW9uRm9yUmVjdChjb25zdCBJbnRSZWN0JiByZWN0LCBib29sIGlzU3RhcnRDYXJldCwgYm9v
bCBpc1JUTCkKK3sKKyAgICByZXR1cm4gY2FyZXRJc09uTGVmdChpc1N0YXJ0Q2FyZXQsIGlzUlRM
KSA/IG1pblhNaW5ZQ29ybmVyKHJlY3QpIDogbWF4WE1pbllDb3JuZXIocmVjdCk7Cit9CisKK3N0
YXRpYyBpbmxpbmUgSW50UG9pbnQgY2FyZXRDb21wYXJpc29uUG9pbnRGb3JSZWN0KGNvbnN0IElu
dFJlY3QmIHJlY3QsIGJvb2wgaXNTdGFydENhcmV0LCBib29sIGlzUlRMKQoreworICAgIGlmIChp
c1N0YXJ0Q2FyZXQpCisgICAgICAgIHJldHVybiBjYXJldElzT25MZWZ0KGlzU3RhcnRDYXJldCwg
aXNSVEwpID8gbWluWE1pbllDb3JuZXIocmVjdCkgOiBtYXhYTWluWUNvcm5lcihyZWN0KTsKKwor
ICAgIHJldHVybiBjYXJldElzT25MZWZ0KGlzU3RhcnRDYXJldCwgaXNSVEwpID8gbWluWE1heFlD
b3JuZXIocmVjdCkgOiBtYXhYTWF4WUNvcm5lcihyZWN0KTsKK30KKworc3RhdGljIHZvaWQgYWRq
dXN0Q2FyZXRSZWN0cyhJbnRSZWN0JiBzdGFydENhcmV0LCBib29sIGlzU3RhcnRDYXJldENsaXBw
ZWRPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFJlY3QmIGVuZENhcmV0LCBi
b29sIGlzRW5kQ2FyZXRDbGlwcGVkT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b25zdCBzdGQ6OnZlY3RvcjxCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdD4gcmVjdExpc3Qs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludFBvaW50JiBzdGFydFJlZmVy
ZW5jZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRQb2ludCYg
ZW5kUmVmZXJlbmNlUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNS
VEwpCit7CisgICAgLy8gc3RhcnRSZWZlcmVuY2VQb2ludCBpcyB0aGUgYmVzdCBndWVzcyBhdCB0
aGUgdG9wIGxlZnQgb2YgdGhlIHNlbGVjdGlvbjsgZW5kUmVmZXJlbmNlUG9pbnQgaXMgdGhlIGJl
c3QgZ3Vlc3MgYXQgdGhlIGJvdHRvbSByaWdodC4KKyAgICBpZiAoaXNTdGFydENhcmV0Q2xpcHBl
ZE91dCkKKyAgICAgICAgc3RhcnRDYXJldC5zZXRMb2NhdGlvbihET01TdXBwb3J0OjpJbnZhbGlk
UG9pbnQpOworICAgIGVsc2UgeworICAgICAgICBzdGFydENhcmV0ID0gcmVjdExpc3RbMF07Cisg
ICAgICAgIHN0YXJ0Q2FyZXQuc2V0TG9jYXRpb24oY2FyZXRMb2NhdGlvbkZvclJlY3Qoc3RhcnRD
YXJldCwgdHJ1ZSwgaXNSVEwpKTsKKyAgICB9CisKKyAgICBpZiAoaXNFbmRDYXJldENsaXBwZWRP
dXQpCisgICAgICAgIGVuZENhcmV0LnNldExvY2F0aW9uKERPTVN1cHBvcnQ6OkludmFsaWRQb2lu
dCk7CisgICAgZWxzZSB7CisgICAgICAgIGVuZENhcmV0ID0gcmVjdExpc3RbMF07CisgICAgICAg
IGVuZENhcmV0LnNldExvY2F0aW9uKGNhcmV0TG9jYXRpb25Gb3JSZWN0KGVuZENhcmV0LCBmYWxz
ZSwgaXNSVEwpKTsKKyAgICB9CisKKyAgICBpZiAoaXNTdGFydENhcmV0Q2xpcHBlZE91dCAmJiBp
c0VuZENhcmV0Q2xpcHBlZE91dCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gUmVzZXQgd2lk
dGggdG8gMSBhcyB3ZSBhcmUgc3RyaWN0bHkgaW50ZXJlc3RlZCBpbiBjYXJldCBsb2NhdGlvbi4K
KyAgICBzdGFydENhcmV0LnNldFdpZHRoKDEpOworICAgIGVuZENhcmV0LnNldFdpZHRoKDEpOwor
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IHJlY3RMaXN0LnNpemUoKTsgaSsrKSB7Cisg
ICAgICAgIEludFJlY3QgY3VycmVudFJlY3QocmVjdExpc3RbaV0pOworCisgICAgICAgIC8vIENv
bXBhcmUgYW5kIHVwZGF0ZSB0aGUgc3RhcnQgYW5kIGVuZCBjYXJldHMgd2l0aCB0aGVpciByZXNw
ZWN0aXZlIHJlZmVyZW5jZSBwb2ludHMuCisgICAgICAgIGlmICghaXNTdGFydENhcmV0Q2xpcHBl
ZE91dCAmJiBjb21wYXJlUG9pbnRzVG9SZWZlcmVuY2VQb2ludCgKKyAgICAgICAgICAgICAgICAg
ICAgY2FyZXRDb21wYXJpc29uUG9pbnRGb3JSZWN0KGN1cnJlbnRSZWN0LCB0cnVlLCBpc1JUTCks
CisgICAgICAgICAgICAgICAgICAgIGNhcmV0Q29tcGFyaXNvblBvaW50Rm9yUmVjdChzdGFydENh
cmV0LCB0cnVlLCBpc1JUTCksCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0UmVmZXJlbmNlUG9p
bnQsIGlzUlRMKSA+IDApIHsKKyAgICAgICAgICAgIHN0YXJ0Q2FyZXQuc2V0TG9jYXRpb24oY2Fy
ZXRMb2NhdGlvbkZvclJlY3QoY3VycmVudFJlY3QsIHRydWUsIGlzUlRMKSk7CisgICAgICAgICAg
ICBzdGFydENhcmV0LnNldEhlaWdodChjdXJyZW50UmVjdC5oZWlnaHQoKSk7CisgICAgICAgIH0K
KworICAgICAgICBpZiAoIWlzRW5kQ2FyZXRDbGlwcGVkT3V0ICYmIGNvbXBhcmVQb2ludHNUb1Jl
ZmVyZW5jZVBvaW50KAorICAgICAgICAgICAgICAgICAgICBjYXJldENvbXBhcmlzb25Qb2ludEZv
clJlY3QoY3VycmVudFJlY3QsIGZhbHNlLCBpc1JUTCksCisgICAgICAgICAgICAgICAgICAgIGNh
cmV0Q29tcGFyaXNvblBvaW50Rm9yUmVjdChlbmRDYXJldCwgZmFsc2UsIGlzUlRMKSwKKyAgICAg
ICAgICAgICAgICAgICAgZW5kUmVmZXJlbmNlUG9pbnQsICFpc1JUTCkgPiAwKSB7CisgICAgICAg
ICAgICBlbmRDYXJldC5zZXRMb2NhdGlvbihjYXJldExvY2F0aW9uRm9yUmVjdChjdXJyZW50UmVj
dCwgZmFsc2UsIGlzUlRMKSk7CisgICAgICAgICAgICBlbmRDYXJldC5zZXRIZWlnaHQoY3VycmVu
dFJlY3QuaGVpZ2h0KCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFNlbGVjdGlvbkhh
bmRsZXI6OmNsaXBSZWdpb25Ub1Zpc2libGVDb250YWluZXIoQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkludFJlY3RSZWdpb24mIHJlZ2lvbikKK3sKKyAgICBBU1NFUlQobV93ZWJQYWdlLT5tX21haW5G
cmFtZSAmJiBtX3dlYlBhZ2UtPm1fbWFpbkZyYW1lLT52aWV3KCkpOworCisgICAgRnJhbWUqIGZy
YW1lID0gbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKworICAgIC8vIERvbid0IGFs
bG93IHRoZSByZWdpb24gdG8gZXh0ZW5kIG91dHNpZGUgb2YgdGhlIGFsbCBpdHMgYW5jZXN0b3Ig
ZnJhbWVzJyB2aXNpYmxlIGFyZWEuCisgICAgaWYgKGZyYW1lICE9IG1fd2ViUGFnZS0+bWFpbkZy
YW1lKCkpIHsKKyAgICAgICAgSW50UmVjdCBjb250YWluaW5nQ29udGVudFJlY3Q7CisgICAgICAg
IGNvbnRhaW5pbmdDb250ZW50UmVjdCA9IG1fd2ViUGFnZS0+Z2V0UmVjdXJzaXZlVmlzaWJsZVdp
bmRvd1JlY3QoZnJhbWUtPnZpZXcoKSwgdHJ1ZSAvKiBubyBjbGlwIHRvIG1haW4gZnJhbWUgd2lu
ZG93ICovKTsKKyAgICAgICAgY29udGFpbmluZ0NvbnRlbnRSZWN0ID0gbV93ZWJQYWdlLT5tX21h
aW5GcmFtZS0+dmlldygpLT53aW5kb3dUb0NvbnRlbnRzKGNvbnRhaW5pbmdDb250ZW50UmVjdCk7
CisgICAgICAgIHJlZ2lvbiA9IGludGVyc2VjdFJlZ2lvbnMoQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkludFJlY3RSZWdpb24oY29udGFpbmluZ0NvbnRlbnRSZWN0KSwgcmVnaW9uKTsKKyAgICB9CisK
KyAgICAvLyBEb24ndCBhbGxvdyB0aGUgcmVnaW9uIHRvIGV4dGVuZCBvdXRzaWRlIG9mIHRoZSBp
bnB1dCBmaWVsZC4KKyAgICBpZiAobV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNJbnB1dE1v
ZGUoKQorICAgICAgICAmJiBmcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKQorICAgICAg
ICAmJiBmcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKS0+cmVuZGVyZXIoKSkgeworCisg
ICAgICAgIC8vIEFkanVzdCB0aGUgYm91bmRpbmcgYm94IHRvIHRoZSBmcmFtZSBvZmZzZXQuCisg
ICAgICAgIEludFJlY3QgYm91bmRpbmdCb3goZnJhbWUtPmRvY3VtZW50KCktPmZvY3VzZWROb2Rl
KCktPnJlbmRlcmVyKCktPmFic29sdXRlQm91bmRpbmdCb3hSZWN0KCkpOworICAgICAgICBib3Vu
ZGluZ0JveCA9IG1fd2ViUGFnZS0+bWFpbkZyYW1lKCktPnZpZXcoKS0+d2luZG93VG9Db250ZW50
cyhmcmFtZS0+dmlldygpLT5jb250ZW50c1RvV2luZG93KGJvdW5kaW5nQm94KSk7CisKKyAgICAg
ICAgcmVnaW9uID0gaW50ZXJzZWN0UmVnaW9ucyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVj
dFJlZ2lvbihib3VuZGluZ0JveCksIHJlZ2lvbik7CisgICAgfQorfQorCitzdGF0aWMgSW50UG9p
bnQgcmVmZXJlbmNlUG9pbnQoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBwb3NpdGlvbiwgY29uc3Qg
SW50UmVjdCYgYm91bmRpbmdSZWN0LCBjb25zdCBJbnRQb2ludCYgZnJhbWVQb3NpdGlvbiwgYm9v
bCBpc1N0YXJ0Q2FyZXQsIGJvb2wgaXNSVEwpCit7CisgICAgLy8gSWYgb25lIG9mIHRoZSBjYXJl
dHMgaXMgaW52YWxpZCAodGhpcyBoYXBwZW5zLCBmb3IgaW5zdGFuY2UsIGlmIHRoZQorICAgIC8v
IHNlbGVjdGlvbiBlbmRzIGluIGFuIGVtcHR5IGRpdikgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBj
b3JuZXIgb2YgdGhlCisgICAgLy8gZW50aXJlIHJlZ2lvbiAod2hpY2ggaXMgYWxyZWFkeSBpbiBm
cmFtZSBjb29yZGluYXRlcyBzbyBkb2Vzbid0IG5lZWQKKyAgICAvLyBhZGp1c3RpbmcpLgorICAg
IEludFJlY3Qgc3RhcnRDYXJldEJvdW5kcyhwb3NpdGlvbi5hYnNvbHV0ZUNhcmV0Qm91bmRzKCkp
OworICAgIGlmIChzdGFydENhcmV0Qm91bmRzLmlzRW1wdHkoKSkKKyAgICAgICAgc3RhcnRDYXJl
dEJvdW5kcyA9IGJvdW5kaW5nUmVjdDsKKyAgICBlbHNlCisgICAgICAgIHN0YXJ0Q2FyZXRCb3Vu
ZHMubW92ZShmcmFtZVBvc2l0aW9uLngoKSwgZnJhbWVQb3NpdGlvbi55KCkpOworCisgICAgcmV0
dXJuIGNhcmV0Q29tcGFyaXNvblBvaW50Rm9yUmVjdChzdGFydENhcmV0Qm91bmRzLCBpc1N0YXJ0
Q2FyZXQsIGlzUlRMKTsKK30KKworLy8gTm90ZTogVGhpcyBpcyB0aGUgb25seSBmdW5jdGlvbiBp
biBTZWxlY3Rpb25IYW5kbGVyIGluIHdoaWNoIHRoZSBjb29yZGluYXRlCisvLyBzeXN0ZW0gaXMg
bm90IGVudGlyZWx5IFdlYktpdC4KK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6c2VsZWN0aW9uUG9z
aXRpb25DaGFuZ2VkKGJvb2wgdmlzdWFsQ2hhbmdlT25seSkKK3sKKyAgICBERUJVR19TRUxFQ1RJ
T04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlvbkhhbmRsZXI6
OnNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCB2aXNpYmxlQ2hhbmdlT25seSA9ICVzIiwgdmlzdWFs
Q2hhbmdlT25seSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCisgICAgLy8gVGhpcyBtZXRob2QgY2Fu
IGdldCBjYWxsZWQgZHVyaW5nIFdlYlBhZ2Ugc2h1dGRvd24gcHJvY2Vzcy4KKyAgICAvLyBJZiB0
aGF0IGlzIHRoZSBjYXNlLCBqdXN0IGJhaWwgb3V0IHNpbmNlIHRoZSBjbGllbnQgaXMgbm90Cisg
ICAgLy8gaW4gYSBzYWZlIHN0YXRlIG9mIHRydXN0IHRvIHJlcXVlc3QgYW55dGhpbmcgZWxzZSBm
cm9tIGl0LgorICAgIGlmICghbV93ZWJQYWdlLT5tX21haW5GcmFtZSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXItPmlzSW5wdXRNb2RlKCkgJiYg
bV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+cHJvY2Vzc2luZ0NoYW5nZSgpKSB7CisgICAgICAg
IG1fd2ViUGFnZS0+bV9jbGllbnQtPmNhbmNlbFNlbGVjdGlvblZpc3VhbHMoKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIGlmIChtX2NhcmV0QWN0aXZlIHx8IChtX3dlYlBhZ2UtPm1f
aW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpICYmIG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZy
YW1lKCktPnNlbGVjdGlvbigpLT5pc0NhcmV0KCkpKSB7CisgICAgICAgIC8vIFRoaXMgbWF5IHVw
ZGF0ZSB0aGUgY2FyZXQgdG8gbm8gbG9uZ2VyIGJlIGFjdGl2ZS4KKyAgICAgICAgY2FyZXRQb3Np
dGlvbkNoYW5nZWQoKTsKKyAgICB9CisKKyAgICAvLyBFbnRlciBzZWxlY3Rpb24gbW9kZSBpZiBz
ZWxlY3Rpb24gdHlwZSBpcyBSYW5nZVNlbGVjdGlvbiwgYW5kIGRpc2FibGUgc2VsZWN0aW9uIGlm
CisgICAgLy8gc2VsZWN0aW9uIGlzIGFjdGl2ZSBhbmQgYmVjb21lcyBjYXJldCBzZWxlY3Rpb24u
CisgICAgRnJhbWUqIGZyYW1lID0gbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAg
ICBJbnRQb2ludCBmcmFtZVBvcyA9IG1fd2ViUGFnZS0+ZnJhbWVPZmZzZXQoZnJhbWUpOworICAg
IGlmIChtX3NlbGVjdGlvbkFjdGl2ZSAmJiAobV9jYXJldEFjdGl2ZSB8fCBmcmFtZS0+c2VsZWN0
aW9uKCktPmlzTm9uZSgpKSkKKyAgICAgICAgbV9zZWxlY3Rpb25BY3RpdmUgPSBmYWxzZTsKKyAg
ICBlbHNlIGlmIChmcmFtZS0+c2VsZWN0aW9uKCktPmlzUmFuZ2UoKSkKKyAgICAgICAgbV9zZWxl
Y3Rpb25BY3RpdmUgPSB0cnVlOworICAgIGVsc2UgaWYgKCFtX3NlbGVjdGlvbkFjdGl2ZSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCBzdGFydENhcmV0OworICAgIEludFJlY3QgZW5k
Q2FyZXQ7CisKKyAgICAvLyBHZXQgdGhlIHRleHQgcmVjdHMgZnJvbSB0aGUgc2VsZWN0aW9ucyBy
YW5nZS4KKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiByZWdpb247Cisg
ICAgZ2V0Q29uc29saWRhdGVkUmVnaW9uT2ZUZXh0UXVhZHNGb3JTZWxlY3Rpb24oZnJhbWUtPnNl
bGVjdGlvbigpLT5zZWxlY3Rpb24oKSwgcmVnaW9uKTsKKworICAgIC8vIElmIHRoZXJlIGlzIG5v
IGNoYW5nZSBpbiBzZWxlY3RlZCB0ZXh0IGFuZCB0aGUgdmlzdWFsIHJlY3RzCisgICAgLy8gaGF2
ZSBub3QgY2hhbmdlZCB0aGVuIGRvbid0IGJvdGhlciBub3RpZnlpbmcgYW55dGhpbmcuCisgICAg
aWYgKHZpc3VhbENoYW5nZU9ubHkgJiYgbV9sYXN0U2VsZWN0aW9uUmVnaW9uLmlzRXF1YWwocmVn
aW9uKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9sYXN0U2VsZWN0aW9uUmVnaW9uID0gcmVn
aW9uOworCisgICAgaWYgKCFyZWdpb24uaXNFbXB0eSgpKSB7CisgICAgICAgIEludFJlY3QgdW5j
bGlwcGVkU3RhcnRDYXJldDsKKyAgICAgICAgSW50UmVjdCB1bmNsaXBwZWRFbmRDYXJldDsKKwor
ICAgICAgICBib29sIGlzUlRMID0gZGlyZWN0aW9uT2ZFbmNsb3NpbmdCbG9jayhmcmFtZS0+c2Vs
ZWN0aW9uKCkpID09IFJUTDsKKworICAgICAgICBzdGQ6OnZlY3RvcjxCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6SW50UmVjdD4gcmVjdExpc3QgPSByZWdpb24ucmVjdHMoKTsKKworICAgICAgICBJbnRQ
b2ludCBzdGFydENhcmV0UmVmZXJlbmNlUG9pbnQgPSByZWZlcmVuY2VQb2ludChmcmFtZS0+c2Vs
ZWN0aW9uKCktPnNlbGVjdGlvbigpLnZpc2libGVTdGFydCgpLCByZWdpb24uZXh0ZW50cygpLCBm
cmFtZVBvcywgdHJ1ZSAvKiBpc1N0YXJ0Q2FyZXQgKi8sIGlzUlRMKTsKKyAgICAgICAgSW50UG9p
bnQgZW5kQ2FyZXRSZWZlcmVuY2VQb2ludCA9IHJlZmVyZW5jZVBvaW50KGZyYW1lLT5zZWxlY3Rp
b24oKS0+c2VsZWN0aW9uKCkudmlzaWJsZUVuZCgpLCByZWdpb24uZXh0ZW50cygpLCBmcmFtZVBv
cywgZmFsc2UgLyogaXNTdGFydENhcmV0ICovLCBpc1JUTCk7CisKKyAgICAgICAgYWRqdXN0Q2Fy
ZXRSZWN0cyh1bmNsaXBwZWRTdGFydENhcmV0LCBmYWxzZSAvKiB1bmNsaXBwZWQgKi8sIHVuY2xp
cHBlZEVuZENhcmV0LCBmYWxzZSAvKiB1bmNsaXBwZWQgKi8sIHJlY3RMaXN0LCBzdGFydENhcmV0
UmVmZXJlbmNlUG9pbnQsIGVuZENhcmV0UmVmZXJlbmNlUG9pbnQsIGlzUlRMKTsKKworICAgICAg
ICBjbGlwUmVnaW9uVG9WaXNpYmxlQ29udGFpbmVyKHJlZ2lvbik7CisKKyNpZiBTSE9XREVCVUdf
U0VMRUNUSU9OSEFORExFUiAvLyBEb24ndCByZWx5IGp1c3Qgb24gREVCVUdfU0VMRUNUSU9OIHRv
IGF2b2lkIGxvb3AuCisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcmVjdExp
c3Quc2l6ZSgpOyBpKyspCisgICAgICAgICAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJSZWN0IGxpc3QgLSBVbm1vZGlmaWVkICMlZCwg
KCVkLCAlZCkgKCVkIHggJWQpIiwgaSwgcmVjdExpc3RbaV0ueCgpLCByZWN0TGlzdFtpXS55KCks
IHJlY3RMaXN0W2ldLndpZHRoKCksIHJlY3RMaXN0W2ldLmhlaWdodCgpKTsKKyAgICAgICAgZm9y
ICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCByZWdpb24ubnVtUmVjdHMoKTsgaSsrKQorICAgICAg
ICAgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRp
Y2FsLCAiUmVjdCBsaXN0ICAtIENvbnNvbGlkYXRlZCAjJWQsICglZCwgJWQpICglZCB4ICVkKSIs
IGksIHJlZ2lvbi5yZWN0cygpW2ldLngoKSwgcmVnaW9uLnJlY3RzKClbaV0ueSgpLCByZWdpb24u
cmVjdHMoKVtpXS53aWR0aCgpLCByZWdpb24ucmVjdHMoKVtpXS5oZWlnaHQoKSk7CisjZW5kaWYK
KworICAgICAgICBib29sIHNob3VsZENhcmVBYm91dFBvc3NpYmxlQ2xpcHBlZE91dFNlbGVjdGlv
biA9IGZyYW1lICE9IG1fd2ViUGFnZS0+bWFpbkZyYW1lKCkgfHwgbV93ZWJQYWdlLT5tX2lucHV0
SGFuZGxlci0+aXNJbnB1dE1vZGUoKTsKKworICAgICAgICBpZiAoIXJlZ2lvbi5pc0VtcHR5KCkg
fHwgc2hvdWxkQ2FyZUFib3V0UG9zc2libGVDbGlwcGVkT3V0U2VsZWN0aW9uKSB7CisgICAgICAg
ICAgICAvLyBBZGp1c3QgdGhlIGhhbmRsZSBtYXJrZXJzIHRvIGJlIGF0IHRoZSBlbmQgb2YgdGhl
IHBhaW50ZWQgcmVjdC4gV2hlbiBzZWxlY3RpbmcgbGlua3MKKyAgICAgICAgICAgIC8vIGFuZCBv
dGhlciBlbGVtZW50cyB0aGF0IG1heSBoYXZlIGEgbGFyZ2VyIHZpc2libGUgYXJlYSB0aGFuIG5l
ZWRzIHRvIGJlIHJlbmRlcmVkIGEgZ2FwCisgICAgICAgICAgICAvLyBjYW4gZXhpc3QgYmV0d2Vl
biB0aGUgaGFuZGxlIGFuZCBvdmVybGF5IHJlZ2lvbi4KKworICAgICAgICAgICAgYm9vbCBzaG91
bGRDbGlwU3RhcnRDYXJldCA9ICFyZWdpb24uaXNSZWN0SW5SZWdpb24odW5jbGlwcGVkU3RhcnRD
YXJldCk7CisgICAgICAgICAgICBib29sIHNob3VsZENsaXBFbmRDYXJldCA9ICFyZWdpb24uaXNS
ZWN0SW5SZWdpb24odW5jbGlwcGVkRW5kQ2FyZXQpOworCisgICAgICAgICAgICAvLyBGaW5kIHRo
ZSB0b3AgY29ybmVyIGFuZCBib3R0b20gY29ybmVyLgorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3Q+IGNsaXBwZWRSZWN0TGlzdCA9IHJlZ2lvbi5y
ZWN0cygpOworICAgICAgICAgICAgYWRqdXN0Q2FyZXRSZWN0cyhzdGFydENhcmV0LCBzaG91bGRD
bGlwU3RhcnRDYXJldCwgZW5kQ2FyZXQsIHNob3VsZENsaXBFbmRDYXJldCwgY2xpcHBlZFJlY3RM
aXN0LCBzdGFydENhcmV0UmVmZXJlbmNlUG9pbnQsIGVuZENhcmV0UmVmZXJlbmNlUG9pbnQsIGlz
UlRMKTsKKworICAgICAgICAgICAgLy8gVHJhbnNsYXRlIHRoZSBjYXJldCB2YWx1ZXMgYXMgdGhl
eSBtdXN0IGJlIGluIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgorICAgICAgICAgICAgaWYgKCFz
aG91bGRDbGlwU3RhcnRDYXJldCkgeworICAgICAgICAgICAgICAgIHN0YXJ0Q2FyZXQgPSBtX3dl
YlBhZ2UtPm1hcFRvVHJhbnNmb3JtZWQoc3RhcnRDYXJldCk7CisgICAgICAgICAgICAgICAgbV93
ZWJQYWdlLT5jbGlwVG9UcmFuc2Zvcm1lZENvbnRlbnRzUmVjdChzdGFydENhcmV0KTsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzaG91bGRDbGlwRW5kQ2FyZXQpIHsKKyAgICAg
ICAgICAgICAgICBlbmRDYXJldCA9IG1fd2ViUGFnZS0+bWFwVG9UcmFuc2Zvcm1lZChlbmRDYXJl
dCk7CisgICAgICAgICAgICAgICAgbV93ZWJQYWdlLT5jbGlwVG9UcmFuc2Zvcm1lZENvbnRlbnRz
UmVjdChlbmRDYXJldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBE
RUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVj
dGlvbkhhbmRsZXI6OnNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCBTdGFydCBSZWN0PSVzIEVuZCBS
ZWN0PSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q2FyZXQudG9TdHJpbmcoKS51
dGY4KCkuZGF0YSgpLCBlbmRDYXJldC50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAg
bV93ZWJQYWdlLT5tX2NsaWVudC0+bm90aWZ5U2VsZWN0aW9uRGV0YWlsc0NoYW5nZWQoc3RhcnRD
YXJldCwgZW5kQ2FyZXQsIHJlZ2lvbik7Cit9CisKKy8vIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMg
bm90IGluIFdlYktpdCBjb29yZGluYXRlcy4KK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6Y2FyZXRQ
b3NpdGlvbkNoYW5nZWQoKQoreworICAgIERFQlVHX1NFTEVDVElPTihCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiU2VsZWN0aW9uSGFuZGxlcjo6Y2FyZXRQb3NpdGlvbkNoYW5n
ZWQiKTsKKworICAgIEludFJlY3QgY2FyZXRMb2NhdGlvbjsKKyAgICAvLyBJZiB0aGUgaW5wdXQg
ZmllbGQgaXMgbm90IGFjdGl2ZSwgd2UgbXVzdCBiZSB0dXJuaW5nIG9mZiB0aGUgY2FyZXQuCisg
ICAgaWYgKCFtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpICYmIG1fY2Fy
ZXRBY3RpdmUpIHsKKyAgICAgICAgbV9jYXJldEFjdGl2ZSA9IGZhbHNlOworICAgICAgICAvLyBT
ZW5kIGFuIGVtcHR5IGNhcmV0IGNoYW5nZSB0byB0dXJuIG9mZiB0aGUgY2FyZXQuCisgICAgICAg
IG1fd2ViUGFnZS0+bV9jbGllbnQtPm5vdGlmeUNhcmV0Q2hhbmdlZChjYXJldExvY2F0aW9uLCBt
X3dlYlBhZ2UtPm1fdG91Y2hFdmVudEhhbmRsZXItPmxhc3RGYXRGaW5nZXJzUmVzdWx0KCkuaXNU
ZXh0SW5wdXQoKSAvKiB1c2VyVG91Y2hUcmlnZ2VyZWQgKi8pOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgQVNTRVJUKG1fd2ViUGFnZSAmJiBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5G
cmFtZSgpICYmIG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnNlbGVjdGlvbigpKTsK
KworICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgcmVhY2ggdGhpcyBwb2ludCBpZiBp
bnB1dCBtb2RlIGlzIGFjdGl2ZS4KKyAgICBBU1NFUlQobV93ZWJQYWdlLT5tX2lucHV0SGFuZGxl
ci0+aXNJbnB1dE1vZGUoKSk7CisKKyAgICBpZiAobV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJh
bWUoKS0+c2VsZWN0aW9uKCktPnNlbGVjdGlvblR5cGUoKSA9PSBWaXNpYmxlU2VsZWN0aW9uOjpD
YXJldFNlbGVjdGlvbikgeworICAgICAgICBJbnRQb2ludCBmcmFtZU9mZnNldCA9IG1fd2ViUGFn
ZS0+ZnJhbWVPZmZzZXQobV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKSk7CisKKyAgICAg
ICAgY2FyZXRMb2NhdGlvbiA9IG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnNlbGVj
dGlvbigpLT5zZWxlY3Rpb24oKS52aXNpYmxlU3RhcnQoKS5hYnNvbHV0ZUNhcmV0Qm91bmRzKCk7
CisgICAgICAgIGNhcmV0TG9jYXRpb24ubW92ZShmcmFtZU9mZnNldC54KCksIGZyYW1lT2Zmc2V0
LnkoKSk7CisKKyAgICAgICAgLy8gQ2xpcCBhZ2FpbnN0IHRoZSBjb250YWluaW5nIGZyYW1lIGFu
ZCBub2RlIGJvdW5kYXJpZXMuCisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0
UmVnaW9uIHJlZ2lvbihjYXJldExvY2F0aW9uKTsKKyAgICAgICAgY2xpcFJlZ2lvblRvVmlzaWJs
ZUNvbnRhaW5lcihyZWdpb24pOworICAgICAgICBjYXJldExvY2F0aW9uID0gcmVnaW9uLmV4dGVu
dHMoKTsKKyAgICB9CisKKyAgICBtX2NhcmV0QWN0aXZlID0gIWNhcmV0TG9jYXRpb24uaXNFbXB0
eSgpOworCisgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZl
bEluZm8sICJTZWxlY3Rpb25IYW5kbGVyOjpjYXJldFBvc2l0aW9uQ2hhbmdlZCBjYXJldCBSZWN0
ICVkLCAlZCwgJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXRMb2NhdGlvbi54
KCksIGNhcmV0TG9jYXRpb24ueSgpLCBjYXJldExvY2F0aW9uLndpZHRoKCksIGNhcmV0TG9jYXRp
b24uaGVpZ2h0KCkpOworCisgICAgY2FyZXRMb2NhdGlvbiA9IG1fd2ViUGFnZS0+bWFwVG9UcmFu
c2Zvcm1lZChjYXJldExvY2F0aW9uKTsKKyAgICBtX3dlYlBhZ2UtPmNsaXBUb1RyYW5zZm9ybWVk
Q29udGVudHNSZWN0KGNhcmV0TG9jYXRpb24pOworCisgICAgbV93ZWJQYWdlLT5tX2NsaWVudC0+
bm90aWZ5Q2FyZXRDaGFuZ2VkKGNhcmV0TG9jYXRpb24sIG1fd2ViUGFnZS0+bV90b3VjaEV2ZW50
SGFuZGxlci0+bGFzdEZhdEZpbmdlcnNSZXN1bHQoKS5pc1RleHRJbnB1dCgpIC8qIHVzZXJUb3Vj
aFRyaWdnZXJlZCAqLyk7Cit9CisKK2Jvb2wgU2VsZWN0aW9uSGFuZGxlcjo6c2VsZWN0aW9uQ29u
dGFpbnMoY29uc3QgSW50UG9pbnQmIHBvaW50KQoreworICAgIEFTU0VSVChtX3dlYlBhZ2UgJiYg
bV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKSAmJiBtX3dlYlBhZ2UtPmZvY3VzZWRPck1h
aW5GcmFtZSgpLT5zZWxlY3Rpb24oKSk7CisgICAgcmV0dXJuIG1fd2ViUGFnZS0+Zm9jdXNlZE9y
TWFpbkZyYW1lKCktPnNlbGVjdGlvbigpLT5jb250YWlucyhwb2ludCk7Cit9CisKK30KK30KZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1NlbGVjdGlv
bkhhbmRsZXIuaCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1NlbGVj
dGlvbkhhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42MjM3NjQ5YjJhNjFkZWZmNGFlNzA3NzIwMzU4N2E3
YTFiNWEwZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dl
YktpdFN1cHBvcnQvU2VsZWN0aW9uSGFuZGxlci5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBw
dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg
aXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICog
TGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJl
ZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBTZWxl
Y3Rpb25IYW5kbGVyX2gKKyNkZWZpbmUgU2VsZWN0aW9uSGFuZGxlcl9oCisKKyNpbmNsdWRlICJC
bGFja0JlcnJ5UGxhdGZvcm1JbnRSZWN0UmVnaW9uLmgiCisjaW5jbHVkZSAiQmxhY2tCZXJyeVBs
YXRmb3JtUHJpbWl0aXZlcy5oIgorI2luY2x1ZGUgIlRleHRHcmFudWxhcml0eS5oIgorCituYW1l
c3BhY2UgV1RGIHsKK2NsYXNzIFN0cmluZzsKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xh
c3MgSW50UG9pbnQ7CitjbGFzcyBJbnRSZWN0OworY2xhc3MgTm9kZTsKK2NsYXNzIFRleHRHcmFu
dWxhcml0eTsKK2NsYXNzIFZpc2libGVQb3NpdGlvbjsKK2NsYXNzIFZpc2libGVTZWxlY3Rpb247
Cit9CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2Ns
YXNzIFdlYlBhZ2VQcml2YXRlOworY2xhc3MgV2ViU3RyaW5nOworCitjbGFzcyBTZWxlY3Rpb25I
YW5kbGVyIHsKK3B1YmxpYzoKKyAgICBTZWxlY3Rpb25IYW5kbGVyKFdlYlBhZ2VQcml2YXRlKik7
CisgICAgflNlbGVjdGlvbkhhbmRsZXIoKTsKKworICAgIGJvb2wgaXNTZWxlY3Rpb25BY3RpdmUo
KSB7IHJldHVybiBtX3NlbGVjdGlvbkFjdGl2ZTsgfQorICAgIHZvaWQgc2V0U2VsZWN0aW9uQWN0
aXZlKGJvb2wgYWN0aXZlKSB7IG1fc2VsZWN0aW9uQWN0aXZlID0gYWN0aXZlOyB9CisKKyAgICB2
b2lkIGNhbmNlbFNlbGVjdGlvbigpOworICAgIFdlYlN0cmluZyBzZWxlY3RlZFRleHQoKSBjb25z
dDsKKworICAgIGJvb2wgZmluZE5leHRTdHJpbmcoY29uc3QgV1RGOjpTdHJpbmcmLCBib29sKTsK
KyAgICBib29sIHNlbGVjdGlvbkNvbnRhaW5zKGNvbnN0IFdlYkNvcmU6OkludFBvaW50Jik7CisK
KyAgICB2b2lkIHNldFNlbGVjdGlvbihjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgc3RhcnQsIGNv
bnN0IFdlYkNvcmU6OkludFBvaW50JiBlbmQpOworICAgIHZvaWQgc2VsZWN0QXRQb2ludChjb25z
dCBXZWJDb3JlOjpJbnRQb2ludCYpOworICAgIHZvaWQgc2VsZWN0T2JqZWN0KGNvbnN0IFdlYkNv
cmU6OkludFBvaW50JiwgV2ViQ29yZTo6VGV4dEdyYW51bGFyaXR5KTsKKyAgICB2b2lkIHNlbGVj
dE9iamVjdChXZWJDb3JlOjpUZXh0R3JhbnVsYXJpdHkpOworICAgIHZvaWQgc2VsZWN0T2JqZWN0
KFdlYkNvcmU6Ok5vZGUqKTsKKworICAgIHZvaWQgc2VsZWN0aW9uUG9zaXRpb25DaGFuZ2VkKGJv
b2wgdmlzdWFsQ2hhbmdlT25seSA9IGZhbHNlKTsKKworICAgIHZvaWQgc2V0Q2FyZXRQb3NpdGlv
bihjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYpOworCisgICAgYm9vbCBsYXN0VXBkYXRlZEVuZFBv
aW50SXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1fbGFzdFVwZGF0ZWRFbmRQb2ludElzVmFsaWQ7
IH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGNhcmV0UG9zaXRpb25DaGFuZ2VkKCk7CisgICAgdm9p
ZCBnZXRDb25zb2xpZGF0ZWRSZWdpb25PZlRleHRRdWFkc0ZvclNlbGVjdGlvbihjb25zdCBXZWJD
b3JlOjpWaXNpYmxlU2VsZWN0aW9uJiwgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdp
b24mKSBjb25zdDsKKyAgICB2b2lkIGNsaXBSZWdpb25Ub1Zpc2libGVDb250YWluZXIoQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb24mKTsKKyAgICBib29sIHVwZGF0ZU9ySGFuZGxl
SW5wdXRTZWxlY3Rpb24oV2ViQ29yZTo6VmlzaWJsZVNlbGVjdGlvbiYgbmV3U2VsZWN0aW9uLCBj
b25zdCBXZWJDb3JlOjpJbnRQb2ludCYgcmVsYXRpdmVTdGFydAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiByZWxhdGl2ZUVu
ZCk7CisgICAgV2ViQ29yZTo6Tm9kZSogRE9NQ29udGFpbmVyTm9kZUZvclZpc2libGVQb3NpdGlv
bihjb25zdCBXZWJDb3JlOjpWaXNpYmxlUG9zaXRpb24mKSBjb25zdDsKKyAgICBib29sIHNob3Vs
ZFVwZGF0ZVNlbGVjdGlvbk9yQ2FyZXRGb3JQb2ludChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYs
IGNvbnN0IFdlYkNvcmU6OkludFJlY3QmLCBib29sIHN0YXJ0Q2FyZXQgPSB0cnVlKSBjb25zdDsK
KyAgICB1bnNpZ25lZCBzaG9ydCBleHRlbmRTZWxlY3Rpb25Ub0ZpZWxkQm91bmRhcnkoYm9vbCBp
c1N0YXJ0SGFuZGxlLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgc2VsZWN0aW9uUG9pbnQsIFdl
YkNvcmU6OlZpc2libGVTZWxlY3Rpb24mIG5ld1NlbGVjdGlvbik7CisKKyAgICBXZWJQYWdlUHJp
dmF0ZSogbV93ZWJQYWdlOworCisgICAgYm9vbCBtX3NlbGVjdGlvbkFjdGl2ZTsKKyAgICBib29s
IG1fY2FyZXRBY3RpdmU7CisgICAgYm9vbCBtX2xhc3RVcGRhdGVkRW5kUG9pbnRJc1ZhbGlkOwor
ICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIG1fbGFzdFNlbGVjdGlvblJl
Z2lvbjsKK307CisKK30KK30KKworI2VuZGlmIC8vIFNlbGVjdGlvbkhhbmRsZXJfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126832</attachid>
            <date>2012-02-13 14:06:04 -0800</date>
            <delta_ts>2012-02-13 23:31:36 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78136-20120213170333.patch</filename>
            <type>text/plain</type>
            <size>46898</size>
            <attacher name="Nima Ghanavatian">nima.ghanavatian</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3MTEzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDljM2E2NmRhNThjMjhhYjI5
YzQwMjQ5YzBhNTcwYTg2YTA1N2IwNTIuLmFhNTU1MTFmMTA3YWI0YmYwNWNjMGM1YjdhZWZkNTg0
NmYwYjJmMDUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTItMDItMTMgIE5pbWEgR2hh
bmF2YXRpYW4gIDxuZ2hhbmF2YXRpYW5AcmltLmNvbT4KKworICAgICAgICBJbml0aWFsIHVwc3Ry
ZWFtaW5nIG9mIHNlbGVjdGlvbiBoYW5kbGluZyBjb2RlIGZvciBCbGFja0JlcnJ5IHBvcnQKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc4MTM2CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW5pdGlhbCB1cHN0
cmVhbWluZywgbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJLaXRTdXBw
b3J0L1NlbGVjdGlvbkhhbmRsZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBibGFja2JlcnJ5L1dl
YktpdFN1cHBvcnQvU2VsZWN0aW9uSGFuZGxlci5oOiBBZGRlZC4KKwogMjAxMi0wMi0wOCAgUm9i
IEJ1aXMgIDxyYnVpc0ByaW0uY29tPgogCiAgICAgICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBE
dW1wUmVuZGVyVHJlZUJsYWNrQmVycnkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2ti
ZXJyeS9XZWJLaXRTdXBwb3J0L1NlbGVjdGlvbkhhbmRsZXIuY3BwIGIvU291cmNlL1dlYktpdC9i
bGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvU2VsZWN0aW9uSGFuZGxlci5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
M2M3NjJjYTYxMmM2NjM0NDdmN2ZhMTNjYTI4OTFlYjQ3ODQwOWM3NQotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L1NlbGVjdGlvbkhhbmRs
ZXIuY3BwCkBAIC0wLDAgKzEsOTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDEx
LCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAy
MTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTZWxl
Y3Rpb25IYW5kbGVyLmgiCisKKyNpbmNsdWRlICJET01TdXBwb3J0LmgiCisjaW5jbHVkZSAiRG9j
dW1lbnQuaCIKKyNpbmNsdWRlICJFZGl0b3IuaCIKKyNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIK
KyNpbmNsdWRlICJGYXRGaW5nZXJzLmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJG
cmFtZVNlbGVjdGlvbi5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxB
bmNob3JFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTEFyZWFFbGVtZW50LmgiCisjaW5jbHVkZSAi
SGl0VGVzdFJlc3VsdC5oIgorI2luY2x1ZGUgIklucHV0SGFuZGxlci5oIgorI2luY2x1ZGUgIklu
dFJlY3QuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUmVuZGVyUGFydC5oIgorI2lu
Y2x1ZGUgIlRleHRHcmFudWxhcml0eS5oIgorI2luY2x1ZGUgIlRvdWNoRXZlbnRIYW5kbGVyLmgi
CisjaW5jbHVkZSAiV2ViUGFnZS5oIgorI2luY2x1ZGUgIldlYlBhZ2VDbGllbnQuaCIKKyNpbmNs
dWRlICJXZWJQYWdlX3AuaCIKKworI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCisjaW5jbHVkZSAi
dmlzaWJsZV91bml0cy5oIgorCisjaW5jbHVkZSA8c3lzL2tleWNvZGVzLmg+CisKKyNkZWZpbmUg
U0hPV0RFQlVHX1NFTEVDVElPTkhBTkRMRVIgMAorCisjaWYgU0hPV0RFQlVHX1NFTEVDVElPTkhB
TkRMRVIKKyNkZWZpbmUgREVCVUdfU0VMRUNUSU9OKHNldmVyaXR5LCBmb3JtYXQsIC4uLikgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OmxvZ0Fsd2F5cyhzZXZlcml0eSwgZm9ybWF0LCAjIyBfX1ZBX0FS
R1NfXykKKyNlbHNlCisjZGVmaW5lIERFQlVHX1NFTEVDVElPTihzZXZlcml0eSwgZm9ybWF0LCAu
Li4pCisjZW5kaWYgLy8gU0hPV0RFQlVHX1NFTEVDVElPTkhBTkRMRVIKKwordXNpbmcgbmFtZXNw
YWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQg
eworCitTZWxlY3Rpb25IYW5kbGVyOjpTZWxlY3Rpb25IYW5kbGVyKFdlYlBhZ2VQcml2YXRlKiBw
YWdlKQorICAgIDogbV93ZWJQYWdlKHBhZ2UpCisgICAgLCBtX3NlbGVjdGlvbkFjdGl2ZShmYWxz
ZSkKKyAgICAsIG1fY2FyZXRBY3RpdmUoZmFsc2UpCisgICAgLCBtX2xhc3RVcGRhdGVkRW5kUG9p
bnRJc1ZhbGlkKGZhbHNlKQoreworfQorCitTZWxlY3Rpb25IYW5kbGVyOjp+U2VsZWN0aW9uSGFu
ZGxlcigpCit7Cit9CisKK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6Y2FuY2VsU2VsZWN0aW9uKCkK
K3sKKyAgICBtX3NlbGVjdGlvbkFjdGl2ZSA9IGZhbHNlOworICAgIG1fbGFzdFNlbGVjdGlvblJl
Z2lvbiA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uKCk7CisKKyAgICBERUJV
R19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlv
bkhhbmRsZXI6OmNhbmNlbFNlbGVjdGlvbiIpOworCisgICAgaWYgKG1fd2ViUGFnZS0+bV9pbnB1
dEhhbmRsZXItPmlzSW5wdXRNb2RlKCkpCisgICAgICAgIG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRs
ZXItPmNhbmNlbFNlbGVjdGlvbigpOworICAgIGVsc2UKKyAgICAgICAgbV93ZWJQYWdlLT5mb2N1
c2VkT3JNYWluRnJhbWUoKS0+c2VsZWN0aW9uKCktPmNsZWFyKCk7Cit9CisKK1dlYlN0cmluZyBT
ZWxlY3Rpb25IYW5kbGVyOjpzZWxlY3RlZFRleHQoKSBjb25zdAoreworICAgIHJldHVybiBtX3dl
YlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5lZGl0b3IoKS0+c2VsZWN0ZWRUZXh0KCk7Cit9
CisKK2Jvb2wgU2VsZWN0aW9uSGFuZGxlcjo6ZmluZE5leHRTdHJpbmcoY29uc3QgV1RGOjpTdHJp
bmcmIHNlYXJjaFN0cmluZywgYm9vbCBmb3J3YXJkKQoreworICAgIGlmIChzZWFyY2hTdHJpbmcu
aXNFbXB0eSgpKSB7CisgICAgICAgIGNhbmNlbFNlbGVjdGlvbigpOworICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfQorCisgICAgQVNTRVJUKG1fd2ViUGFnZS0+bV9wYWdlKTsKKworICAgIG1f
d2ViUGFnZS0+bV9wYWdlLT51bm1hcmtBbGxUZXh0TWF0Y2hlcygpOworCisgICAgYm9vbCByZXN1
bHQgPSBtX3dlYlBhZ2UtPm1fcGFnZS0+ZmluZFN0cmluZyhzZWFyY2hTdHJpbmcsIFdURjo6VGV4
dENhc2VJbnNlbnNpdGl2ZSwgZm9yd2FyZCA/IEZpbmREaXJlY3Rpb25Gb3J3YXJkIDogRmluZERp
cmVjdGlvbkJhY2t3YXJkLCB0cnVlIC8qIHNob3VsZCB3cmFwICovKTsKKyAgICBpZiAocmVzdWx0
ICYmIG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnNlbGVjdGlvbigpLT5zZWxlY3Rp
b25UeXBlKCkgPT0gVmlzaWJsZVNlbGVjdGlvbjo6Tm9TZWxlY3Rpb24pIHsKKyAgICAgICAgLy8g
V29yZCB3YXMgZm91bmQgYnV0IGNvdWxkIG5vdCBiZSBzZWxlY3RlZCBvbiB0aGlzIHBhZ2UuCisg
ICAgICAgIHJlc3VsdCA9IG1fd2ViUGFnZS0+bV9wYWdlLT5tYXJrQWxsTWF0Y2hlc0ZvclRleHQo
c2VhcmNoU3RyaW5nLCBXVEY6OlRleHRDYXNlSW5zZW5zaXRpdmUsIHRydWUgLyogc2hvdWxkIGhp
Z2hsaWdodCAqLywgMCAvKiBsaW1pdCB0byBtYXRjaCAwID0gdW5saW1pdGVkICovKTsKKyAgICB9
CisKKyAgICAvLyBEZWZvY3VzIHRoZSBpbnB1dCBmaWVsZCBpZiBvbmUgaXMgYWN0aXZlLgorICAg
IGlmIChtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpKQorICAgICAgICBt
X3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5ub2RlRm9jdXNlZCgwKTsKKworICAgIHJldHVybiBy
ZXN1bHQ7Cit9CisKK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6Z2V0Q29uc29saWRhdGVkUmVnaW9u
T2ZUZXh0UXVhZHNGb3JTZWxlY3Rpb24oY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYgc2VsZWN0aW9u
LCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiYgcmVnaW9uKSBjb25zdAorewor
ICAgIEFTU0VSVChyZWdpb24uaXNFbXB0eSgpKTsKKworICAgIGlmICghc2VsZWN0aW9uLmlzUmFu
Z2UoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKHNlbGVjdGlvbi5maXJzdFJhbmdl
KCkpOworCisgICAgVmVjdG9yPEZsb2F0UXVhZD4gcXVhZExpc3Q7CisgICAgRE9NU3VwcG9ydDo6
dmlzaWJsZVRleHRRdWFkcygqKHNlbGVjdGlvbi5maXJzdFJhbmdlKCkpLCBxdWFkTGlzdCwgdHJ1
ZSAvKiB1c2Ugc2VsZWN0aW9uIGhlaWdodCAqLyk7CisKKyAgICBpZiAoIXF1YWRMaXN0LmlzRW1w
dHkoKSkgeworICAgICAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IG1fd2ViUGFnZS0+Zm9jdXNl
ZE9yTWFpbkZyYW1lKCktPnZpZXcoKTsKKworICAgICAgICAvLyBmcmFtZVJlY3QgaXMgaW4gZnJh
bWUgY29vcmRpbmF0ZXMuCisgICAgICAgIEludFJlY3QgZnJhbWVSZWN0KEludFBvaW50KDAsIDAp
LCBmcmFtZVZpZXctPmNvbnRlbnRzU2l6ZSgpKTsKKworICAgICAgICAvLyBmcmFtZVBvc2l0aW9u
IGlzIGluIG1haW4gZnJhbWUgY29vcmRpbmF0ZXMuCisgICAgICAgIEludFBvaW50IGZyYW1lUG9z
aXRpb24gPSBtX3dlYlBhZ2UtPmZyYW1lT2Zmc2V0KG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZy
YW1lKCkpOworCisgICAgICAgIC8vIFRoZSByYW5nZXMgcmVjdCBsaXN0IGlzIGJhc2VkIG9uIHJl
bmRlciBlbGVtZW50cyBhbmQgbWF5IGluY2x1ZGUgbXVsdGlwbGUgYWRqYWNlbnQgcmVjdHMuCisg
ICAgICAgIC8vIFVzZSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiB0byBjb25z
b2xpZGF0ZSB0aGVzZSByZWN0cyBpbnRvIGJhbmRzIGFzIHdlbGwgYXMgYSBjb250YWluZXIgdG8g
cGFzcworICAgICAgICAvLyB0byB0aGUgY2xpZW50LgorICAgICAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgcXVhZExpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEludFJlY3QgZW5j
bG9zaW5nUmVjdCA9IHF1YWRMaXN0W2ldLmVuY2xvc2luZ0JvdW5kaW5nQm94KCk7CisgICAgICAg
ICAgICBlbmNsb3NpbmdSZWN0LmludGVyc2VjdChmcmFtZVJlY3QpOworICAgICAgICAgICAgZW5j
bG9zaW5nUmVjdC5tb3ZlKGZyYW1lUG9zaXRpb24ueCgpLCBmcmFtZVBvc2l0aW9uLnkoKSk7Cisg
ICAgICAgICAgICByZWdpb24gPSB1bmlvblJlZ2lvbnMocmVnaW9uLCBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6SW50UmVjdFJlZ2lvbihlbmNsb3NpbmdSZWN0KSk7CisgICAgICAgIH0KKyAgICB9Cit9
CisKK3N0YXRpYyBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVBvc2l0aW9uRm9yUG9pbnRJZ25vcmlu
Z0NsaXBwaW5nKGNvbnN0IEZyYW1lJiBmcmFtZSwgY29uc3QgSW50UG9pbnQmIGZyYW1lUG9pbnQp
Cit7CisgICAgLy8gRnJhbWU6OnZpc2libGVQb3NpdGlvbkF0UG9pbnQgaGFyZC1jb2RlcyBpZ25v
cmVDbGlwcGluZz1mYWxzZSBpbiB0aGUKKyAgICAvLyBjYWxsIHRvIGhpdFRlc3RSZXN1bHRBdFBv
aW50LiBUaGlzIGhhcyBhIGJ1ZyB3aGVyZSBzb21lIHBhZ2VzIChzdWNoIGFzCisgICAgLy8gbWV0
YWZpbHRlcikgd2lsbCByZXR1cm4gdGhlIHdyb25nIFZpc2libGVQb3NpdGlvbiBmb3IgcG9pbnRz
IHRoYXQgYXJlCisgICAgLy8gb3V0c2lkZSB0aGUgdmlzaWJsZSByZWN0LiBUbyB3b3JrIGFyb3Vu
ZCB0aGUgYnVnLCB0aGlzIGlzIGEgY29weSBvZgorICAgIC8vIHZpc2libGVQb3NpdGlvbkF0UG9p
bnQgd2hpY2ggd2hpY2ggcGFzc2VzIGlnbm9yZUNsaXBwaW5nPXRydWUuCisgICAgLy8gU2VlIFJJ
TSBCdWcgIzQzMTUuCisgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQgPSBmcmFtZS5ldmVudEhhbmRs
ZXIoKS0+aGl0VGVzdFJlc3VsdEF0UG9pbnQoZnJhbWVQb2ludCwgdHJ1ZSAvKiBhbGxvd1NoYWRv
d0NvbnRlbnQgKi8sIHRydWUgLyogaWdub3JlQ2xpcHBpbmcgKi8pOworCisgICAgTm9kZSogbm9k
ZSA9IHJlc3VsdC5pbm5lck5vZGUoKTsKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiBW
aXNpYmxlUG9zaXRpb24oKTsKKworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBub2RlLT5y
ZW5kZXJlcigpOworICAgIGlmICghcmVuZGVyZXIpCisgICAgICAgIHJldHVybiBWaXNpYmxlUG9z
aXRpb24oKTsKKworICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zID0gcmVuZGVyZXItPnBv
c2l0aW9uRm9yUG9pbnQocmVzdWx0LmxvY2FsUG9pbnQoKSk7CisgICAgaWYgKHZpc2libGVQb3Mu
aXNOdWxsKCkpCisgICAgICAgIHZpc2libGVQb3MgPSBWaXNpYmxlUG9zaXRpb24oUG9zaXRpb24o
Y3JlYXRlTGVnYWN5RWRpdGluZ1Bvc2l0aW9uKG5vZGUsIDApKSk7CisKKyAgICByZXR1cm4gdmlz
aWJsZVBvczsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGRpcmVjdGlvbk9mUG9pbnRSZWxh
dGl2ZVRvUmVjdChjb25zdCBJbnRQb2ludCYgcG9pbnQsIGNvbnN0IEludFJlY3QmIHJlY3QpCit7
CisgICAgQVNTRVJUKCFyZWN0LmNvbnRhaW5zKHBvaW50KSk7CisKKyAgICAvLyBQYWRkaW5nIHRv
IHByZXZlbnQgYWNjaWRlbnRhbCB0cmlnZ2VyIG9mIHVwL2Rvd24gd2hlbiBpbnRlbmRpbmcgdG8g
ZG8gaG9yaXpvbnRhbCBtb3ZlbWVudC4KKyAgICBjb25zdCBpbnQgdmVydGljYWxQYWRkaW5nID0g
NTsKKworICAgIC8vIERvIGhlaWdodCBtb3ZlbWVudCBjaGVjayBmaXJzdCBidXQgYWRkIHBhZGRp
bmcuIFdlIG1heSBiZSBvZmYgb24gYm90aCB4ICYgeSBheGlzIGFuZCBvbmx5CisgICAgLy8gd2Fu
dCB0byBtb3ZlIGluIG9uZSBkaXJlY3Rpb24gYXQgYSB0aW1lLgorICAgIGlmIChwb2ludC55KCkg
KyB2ZXJ0aWNhbFBhZGRpbmcgPCByZWN0LnkoKSkKKyAgICAgICAgcmV0dXJuIEtFWUNPREVfVVA7
CisgICAgaWYgKHBvaW50LnkoKSA+IHJlY3QubWF4WSgpICsgdmVydGljYWxQYWRkaW5nKQorICAg
ICAgICByZXR1cm4gS0VZQ09ERV9ET1dOOworICAgIGlmIChwb2ludC54KCkgPCByZWN0LmxvY2F0
aW9uKCkueCgpKQorICAgICAgICByZXR1cm4gS0VZQ09ERV9MRUZUOworICAgIGlmIChwb2ludC54
KCkgPiByZWN0Lm1heFgoKSkKKyAgICAgICAgcmV0dXJuIEtFWUNPREVfUklHSFQ7CisKKyAgICBy
ZXR1cm4gMDsKK30KKworYm9vbCBTZWxlY3Rpb25IYW5kbGVyOjpzaG91bGRVcGRhdGVTZWxlY3Rp
b25PckNhcmV0Rm9yUG9pbnQoY29uc3QgSW50UG9pbnQmIHBvaW50LCBjb25zdCBJbnRSZWN0JiBj
YXJldFJlY3QsIGJvb2wgc3RhcnRDYXJldCkgY29uc3QKK3sKKyAgICBBU1NFUlQobV93ZWJQYWdl
LT5tX2lucHV0SGFuZGxlci0+aXNJbnB1dE1vZGUoKSk7CisKKyAgICAvLyBJZiB0aGUgcG9pbnQg
aXNuJ3QgdmFsaWQgZG9uJ3QgYmxvY2sgY2hhbmdlIGFzIGl0IGlzIG5vdCBhY3R1YWxseSBjaGFu
Z2luZy4KKyAgICBpZiAocG9pbnQgPT0gRE9NU3VwcG9ydDo6SW52YWxpZFBvaW50KQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKworICAgIFZpc2libGVTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9
IG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnNlbGVjdGlvbigpLT5zZWxlY3Rpb24o
KTsKKworICAgIC8vIElmIHRoZSBpbnB1dCBmaWVsZCBpcyBzaW5nbGUgbGluZSBvciB3ZSBhcmUg
b24gdGhlIGZpcnN0IG9yIGxhc3QKKyAgICAvLyBsaW5lIG9mIGEgbXVsdGlsaW5lIGlucHV0IGZp
ZWxkIG9ubHkgaG9yaXpvbnRhbCBtb3ZlbWVudCBpcyBzdXBwb3J0ZWQuCisgICAgYm9vbCBhYm92
ZUNhcmV0ID0gcG9pbnQueSgpIDwgY2FyZXRSZWN0LnkoKTsKKyAgICBib29sIGJlbG93Q2FyZXQg
PSBwb2ludC55KCkgPj0gY2FyZXRSZWN0Lm1heFkoKTsKKworICAgIERFQlVHX1NFTEVDVElPTihC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiU2VsZWN0aW9uSGFuZGxlcjo6c2hv
dWxkVXBkYXRlU2VsZWN0aW9uT3JDYXJldEZvclBvaW50IG11bHRpbGluZSA9ICVzIGFib3ZlID0g
JXMgYmVsb3cgPSAlcyBmaXJzdCBsaW5lID0gJXMgbGFzdCBsaW5lID0gJXMgc3RhcnQgPSAlcyBc
biIKKyAgICAgICAgICAgICwgbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNNdWx0aWxpbmVJ
bnB1dE1vZGUoKSA/ICJ0cnVlIiA6ICJmYWxzZSIsIGFib3ZlQ2FyZXQgPyAidHJ1ZSIgOiAiZmFs
c2UiLCBiZWxvd0NhcmV0ID8gInRydWUiIDogImZhbHNlIgorICAgICAgICAgICAgLCBpblNhbWVM
aW5lKGN1cnJlbnRTZWxlY3Rpb24udmlzaWJsZVN0YXJ0KCksIHN0YXJ0T2ZFZGl0YWJsZUNvbnRl
bnQoY3VycmVudFNlbGVjdGlvbi52aXNpYmxlU3RhcnQoKSkpID8gInRydWUiIDogImZhbHNlIgor
ICAgICAgICAgICAgLCBpblNhbWVMaW5lKGN1cnJlbnRTZWxlY3Rpb24udmlzaWJsZUVuZCgpLCBl
bmRPZkVkaXRhYmxlQ29udGVudChjdXJyZW50U2VsZWN0aW9uLnZpc2libGVFbmQoKSkpID8gInRy
dWUiIDogImZhbHNlIgorICAgICAgICAgICAgLCBzdGFydENhcmV0ID8gInRydWUiIDogImZhbHNl
Iik7CisKKyAgICBpZiAoIW1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXItPmlzTXVsdGlsaW5lSW5w
dXRNb2RlKCkgJiYgKGFib3ZlQ2FyZXQgfHwgYmVsb3dDYXJldCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICBpZiAoc3RhcnRDYXJldCAmJiBpblNhbWVMaW5lKGN1cnJlbnRTZWxlY3Rpb24u
dmlzaWJsZVN0YXJ0KCksIHN0YXJ0T2ZFZGl0YWJsZUNvbnRlbnQoY3VycmVudFNlbGVjdGlvbi52
aXNpYmxlU3RhcnQoKSkpICYmIGFib3ZlQ2FyZXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICBpZiAoIXN0YXJ0Q2FyZXQgJiYgaW5TYW1lTGluZShjdXJyZW50U2VsZWN0aW9uLnZpc2libGVF
bmQoKSwgZW5kT2ZFZGl0YWJsZUNvbnRlbnQoY3VycmVudFNlbGVjdGlvbi52aXNpYmxlRW5kKCkp
KSAmJiBiZWxvd0NhcmV0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKwordm9pZCBTZWxlY3Rpb25IYW5kbGVyOjpzZXRDYXJldFBvc2l0aW9uKGNvbnN0IElu
dFBvaW50ICZwb3NpdGlvbikKK3sKKyAgICBpZiAoIW1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXIt
PmlzSW5wdXRNb2RlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fY2FyZXRBY3RpdmUgPSB0
cnVlOworCisgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZl
bEluZm8sICJTZWxlY3Rpb25IYW5kbGVyOjpzZXRDYXJldFBvc2l0aW9uIHJlcXVlc3RlZCBwb2lu
dCAlZCwgJWQiLCBwb3NpdGlvbi54KCksIHBvc2l0aW9uLnkoKSk7CisKKyAgICBGcmFtZSogZm9j
dXNlZEZyYW1lID0gbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICBGcmFtZVNl
bGVjdGlvbiogY29udHJvbGxlciA9IGZvY3VzZWRGcmFtZS0+c2VsZWN0aW9uKCk7CisgICAgSW50
UG9pbnQgcmVsYXRpdmVQb2ludCA9IERPTVN1cHBvcnQ6OmNvbnZlcnRQb2ludFRvRnJhbWUobV93
ZWJQYWdlLT5tYWluRnJhbWUoKSwgZm9jdXNlZEZyYW1lLCBwb3NpdGlvbik7CisgICAgSW50UmVj
dCBjdXJyZW50Q2FyZXRSZWN0ID0gY29udHJvbGxlci0+c2VsZWN0aW9uKCkudmlzaWJsZVN0YXJ0
KCkuYWJzb2x1dGVDYXJldEJvdW5kcygpOworCisgICAgaWYgKHJlbGF0aXZlUG9pbnQgPT0gRE9N
U3VwcG9ydDo6SW52YWxpZFBvaW50IHx8ICFzaG91bGRVcGRhdGVTZWxlY3Rpb25PckNhcmV0Rm9y
UG9pbnQocmVsYXRpdmVQb2ludCwgY3VycmVudENhcmV0UmVjdCkpIHsKKyAgICAgICAgc2VsZWN0
aW9uUG9zaXRpb25DaGFuZ2VkKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWaXNp
YmxlUG9zaXRpb24gdmlzaWJsZUNhcmV0UG9zaXRpb24oZm9jdXNlZEZyYW1lLT52aXNpYmxlUG9z
aXRpb25Gb3JQb2ludChyZWxhdGl2ZVBvaW50KSk7CisKKyAgICBpZiAoIURPTVN1cHBvcnQ6Omlz
UG9zaXRpb25Jbk5vZGUobV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+ZG9jdW1lbnQo
KS0+Zm9jdXNlZE5vZGUoKSwgdmlzaWJsZUNhcmV0UG9zaXRpb24uZGVlcEVxdWl2YWxlbnQoKSkp
IHsKKyAgICAgICAgaWYgKHVuc2lnbmVkIHNob3J0IGNoYXJhY3RlciA9IGRpcmVjdGlvbk9mUG9p
bnRSZWxhdGl2ZVRvUmVjdChyZWxhdGl2ZVBvaW50LCBjdXJyZW50Q2FyZXRSZWN0KSkKKyAgICAg
ICAgICAgIG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXItPmhhbmRsZU5hdmlnYXRpb25Nb3ZlKGNo
YXJhY3RlciwgZmFsc2UgLyogc2hpZnREb3duICovLCBmYWxzZSAvKiBhbHREb3duICovLCBmYWxz
ZSAvKiBjYW5FeGl0RmllbGQgKi8pOworCisgICAgICAgIHNlbGVjdGlvblBvc2l0aW9uQ2hhbmdl
ZCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmlzaWJsZVNlbGVjdGlvbiBuZXdT
ZWxlY3Rpb24odmlzaWJsZUNhcmV0UG9zaXRpb24pOworICAgIGlmIChjb250cm9sbGVyLT5zZWxl
Y3Rpb24oKSA9PSBuZXdTZWxlY3Rpb24pIHsKKyAgICAgICAgc2VsZWN0aW9uUG9zaXRpb25DaGFu
Z2VkKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb250cm9sbGVyLT5zZXRTZWxl
Y3Rpb24obmV3U2VsZWN0aW9uKTsKKworICAgIERFQlVHX1NFTEVDVElPTihCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiU2VsZWN0aW9uSGFuZGxlcjo6c2V0Q2FyZXRQb3NpdGlv
biBwb2ludCB2YWxpZCwgY3Vyc29yIHVwZGF0ZWQiKTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBt
YWtlcyBzdXJlIHdlIGFyZSBub3QgcmVkdWNpbmcgdGhlIHNlbGVjdGlvbiB0byBhIGNhcmV0IHNl
bGVjdGlvbi4KK3N0YXRpYyBib29sIHNob3VsZEV4dGVuZFNlbGVjdGlvbkluRGlyZWN0aW9uKGNv
bnN0IFZpc2libGVTZWxlY3Rpb24mIHNlbGVjdGlvbiwgdW5zaWduZWQgc2hvcnQgY2hhcmFjdGVy
KQoreworICAgIEZyYW1lU2VsZWN0aW9uIHRlbXBTZWxlY3Rpb247CisgICAgdGVtcFNlbGVjdGlv
bi5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKKyAgICBzd2l0Y2ggKGNoYXJhY3RlcikgeworICAg
IGNhc2UgS0VZQ09ERV9MRUZUOgorICAgICAgICB0ZW1wU2VsZWN0aW9uLm1vZGlmeShGcmFtZVNl
bGVjdGlvbjo6QWx0ZXJhdGlvbkV4dGVuZCwgRGlyZWN0aW9uTGVmdCwgQ2hhcmFjdGVyR3JhbnVs
YXJpdHkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtFWUNPREVfUklHSFQ6CisgICAgICAg
IHRlbXBTZWxlY3Rpb24ubW9kaWZ5KEZyYW1lU2VsZWN0aW9uOjpBbHRlcmF0aW9uRXh0ZW5kLCBE
aXJlY3Rpb25SaWdodCwgQ2hhcmFjdGVyR3JhbnVsYXJpdHkpOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIEtFWUNPREVfVVA6CisgICAgICAgIHRlbXBTZWxlY3Rpb24ubW9kaWZ5KEZyYW1lU2Vs
ZWN0aW9uOjpBbHRlcmF0aW9uRXh0ZW5kLCBEaXJlY3Rpb25CYWNrd2FyZCwgTGluZUdyYW51bGFy
aXR5KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLRVlDT0RFX0RPV046CisgICAgICAgIHRl
bXBTZWxlY3Rpb24ubW9kaWZ5KEZyYW1lU2VsZWN0aW9uOjpBbHRlcmF0aW9uRXh0ZW5kLCBEaXJl
Y3Rpb25Gb3J3YXJkLCBMaW5lR3JhbnVsYXJpdHkpOworICAgICAgICBicmVhazsKKyAgICBkZWZh
dWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoKGNoYXJhY3RlciA9PSBLRVlD
T0RFX0xFRlQgfHwgY2hhcmFjdGVyID09IEtFWUNPREVfUklHSFQpCisgICAgICAgICYmICghaW5T
YW1lTGluZShzZWxlY3Rpb24udmlzaWJsZVN0YXJ0KCksIHRlbXBTZWxlY3Rpb24uc2VsZWN0aW9u
KCkudmlzaWJsZVN0YXJ0KCkpCisgICAgICAgICAgIHx8ICFpblNhbWVMaW5lKHNlbGVjdGlvbi52
aXNpYmxlRW5kKCksIHRlbXBTZWxlY3Rpb24uc2VsZWN0aW9uKCkudmlzaWJsZUVuZCgpKSkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0ZW1wU2VsZWN0aW9uLnNlbGVjdGlv
bigpLnNlbGVjdGlvblR5cGUoKSA9PSBWaXNpYmxlU2VsZWN0aW9uOjpSYW5nZVNlbGVjdGlvbjsK
K30KKworc3RhdGljIFZpc2libGVQb3NpdGlvbiBkaXJlY3Rpb25hbFZpc2libGVQb3NpdGlvbkF0
RXh0ZW50T2ZCb3goRnJhbWUqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiBib3VuZGluZ0JveCwgdW5z
aWduZWQgc2hvcnQgZGlyZWN0aW9uLCBjb25zdCBJbnRQb2ludCYgYmFzZVBvaW50KQoreworICAg
IEFTU0VSVChmcmFtZSk7CisKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gVmlzaWJs
ZVBvc2l0aW9uKCk7CisKKyAgICBzd2l0Y2ggKGRpcmVjdGlvbikgeworICAgIGNhc2UgS0VZQ09E
RV9MRUZUOgorICAgICAgICAvLyBFeHRlbmQgeCB0byBzdGFydCB3aXRob3V0IG1vZGlmeWluZyB5
LgorICAgICAgICByZXR1cm4gZnJhbWUtPnZpc2libGVQb3NpdGlvbkZvclBvaW50KEludFBvaW50
KGJvdW5kaW5nQm94LngoKSwgYmFzZVBvaW50LnkoKSkpOworICAgIGNhc2UgS0VZQ09ERV9SSUdI
VDoKKyAgICAgICAgLy8gRXh0ZW5kIHggdG8gZW5kIHdpdGhvdXQgbW9kaWZ5aW5nIHkuCisgICAg
ICAgIHJldHVybiBmcmFtZS0+dmlzaWJsZVBvc2l0aW9uRm9yUG9pbnQoSW50UG9pbnQoYm91bmRp
bmdCb3gubWF4WCgpLCBiYXNlUG9pbnQueSgpKSk7CisgICAgY2FzZSBLRVlDT0RFX1VQOgorICAg
ICAgICAvLyBFeHRlbmQgeSB0byB0b3Agd2l0aG91dCBtb2RpZnlpbmcgeC4KKyAgICAgICAgcmV0
dXJuIGZyYW1lLT52aXNpYmxlUG9zaXRpb25Gb3JQb2ludChJbnRQb2ludChiYXNlUG9pbnQueCgp
LCBib3VuZGluZ0JveC55KCkpKTsKKyAgICBjYXNlIEtFWUNPREVfRE9XTjoKKyAgICAgICAgLy8g
RXh0ZW5kIHkgdG8gYm90dG9tIHdpdGhvdXQgbW9kaWZ5aW5nIHguCisgICAgICAgIHJldHVybiBm
cmFtZS0+dmlzaWJsZVBvc2l0aW9uRm9yUG9pbnQoSW50UG9pbnQoYmFzZVBvaW50LngoKSwgYm91
bmRpbmdCb3gubWF4WSgpKSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQor
CisgICAgcmV0dXJuIGZyYW1lLT52aXNpYmxlUG9zaXRpb25Gb3JQb2ludChJbnRQb2ludChiYXNl
UG9pbnQueCgpLCBiYXNlUG9pbnQueSgpKSk7Cit9CisKK3N0YXRpYyBib29sIHBvaW50SXNPdXRz
aWRlT2ZCb3VuZGluZ0JveEluRGlyZWN0aW9uKHVuc2lnbmVkIGRpcmVjdGlvbiwgY29uc3QgSW50
UG9pbnQmIHNlbGVjdGlvblBvaW50LCBjb25zdCBJbnRSZWN0JiBib3VuZGluZ0JveCkKK3sKKyAg
ICBpZiAoKGRpcmVjdGlvbiA9PSBLRVlDT0RFX0xFRlQgJiYgc2VsZWN0aW9uUG9pbnQueCgpIDwg
Ym91bmRpbmdCb3gueCgpKQorICAgICAgICB8fCAoZGlyZWN0aW9uID09IEtFWUNPREVfVVAgJiYg
c2VsZWN0aW9uUG9pbnQueSgpIDwgYm91bmRpbmdCb3gueSgpKQorICAgICAgICB8fCAoZGlyZWN0
aW9uID09IEtFWUNPREVfUklHSFQgJiYgc2VsZWN0aW9uUG9pbnQueCgpID4gYm91bmRpbmdCb3gu
bWF4WCgpKQorICAgICAgICB8fCAoZGlyZWN0aW9uID09IEtFWUNPREVfRE9XTiAmJiBzZWxlY3Rp
b25Qb2ludC55KCkgPiBib3VuZGluZ0JveC5tYXhZKCkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIHJldHVybiBmYWxzZTsKK30KKwordW5zaWduZWQgc2hvcnQgU2VsZWN0aW9uSGFuZGxl
cjo6ZXh0ZW5kU2VsZWN0aW9uVG9GaWVsZEJvdW5kYXJ5KGJvb2wgaXNTdGFydEhhbmRsZSwgY29u
c3QgSW50UG9pbnQmIHNlbGVjdGlvblBvaW50LCBWaXNpYmxlU2VsZWN0aW9uJiBuZXdTZWxlY3Rp
b24pCit7CisgICAgRnJhbWUqIGZvY3VzZWRGcmFtZSA9IG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFp
bkZyYW1lKCk7CisgICAgaWYgKCFmb2N1c2VkRnJhbWUtPmRvY3VtZW50KCktPmZvY3VzZWROb2Rl
KCkgfHwgIWZvY3VzZWRGcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKS0+cmVuZGVyZXIo
KSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBGcmFtZVNlbGVjdGlvbiogY29udHJvbGxlciA9
IGZvY3VzZWRGcmFtZS0+c2VsZWN0aW9uKCk7CisKKyAgICBJbnRSZWN0IGNhcmV0UmVjdCA9IGlz
U3RhcnRIYW5kbGUgPyBjb250cm9sbGVyLT5zZWxlY3Rpb24oKS52aXNpYmxlU3RhcnQoKS5hYnNv
bHV0ZUNhcmV0Qm91bmRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
OiBjb250cm9sbGVyLT5zZWxlY3Rpb24oKS52aXNpYmxlRW5kKCkuYWJzb2x1dGVDYXJldEJvdW5k
cygpOworCisgICAgSW50UmVjdCBub2RlQm91bmRpbmdCb3ggPSBmb2N1c2VkRnJhbWUtPmRvY3Vt
ZW50KCktPmZvY3VzZWROb2RlKCktPnJlbmRlcmVyKCktPmFic29sdXRlQm91bmRpbmdCb3hSZWN0
KCk7CisKKyAgICAvLyBTdGFydCBoYW5kbGUgaXMgb3V0c2lkZSBvZiB0aGUgZmllbGQuIFRyZWF0
IGl0IGFzIHRoZSBjaGFuZ2VkIGhhbmRsZSBhbmQgbW92ZQorICAgIC8vIHJlbGF0aXZlIHRvIHRo
ZSBzdGFydCBjYXJldCByZWN0LgorICAgIHVuc2lnbmVkIHNob3J0IGNoYXJhY3RlciA9IGRpcmVj
dGlvbk9mUG9pbnRSZWxhdGl2ZVRvUmVjdChzZWxlY3Rpb25Qb2ludCwgY2FyZXRSZWN0KTsKKwor
ICAgIC8vIFByZXZlbnQgaW5jb3JyZWN0IG1vdmVtZW50LCBoYW5kbGVzIGNhbiBvbmx5IGV4dGVu
ZCB0aGUgc2VsZWN0aW9uIHRoaXMgd2F5CisgICAgLy8gdG8gcHJldmVudCBpbnZlcnNpb24gb2Yg
dGhlIGhhbmRsZXMuCisgICAgaWYgKGlzU3RhcnRIYW5kbGUgJiYgKGNoYXJhY3RlciA9PSBLRVlD
T0RFX1JJR0hUIHx8IGNoYXJhY3RlciA9PSBLRVlDT0RFX0RPV04pCisgICAgICAgIHx8ICFpc1N0
YXJ0SGFuZGxlICYmIChjaGFyYWN0ZXIgPT0gS0VZQ09ERV9MRUZUIHx8IGNoYXJhY3RlciA9PSBL
RVlDT0RFX1VQKSkKKyAgICAgICAgY2hhcmFjdGVyID0gMDsKKworICAgIFZpc2libGVQb3NpdGlv
biBuZXdWaXNpYmxlUG9zaXRpb24gPSBjb250cm9sbGVyLT5zZWxlY3Rpb24oKS5zdGFydCgpOwor
ICAgIC8vIEV4dGVuZCB0aGUgc2VsZWN0aW9uIHRvIHRoZSBib3VuZHMgb2YgdGhlIGJveCBiZWZv
cmUgZG9pbmcgaW5jcmVtZW50YWwgc2Nyb2xsIGlmIHRoZSBwb2ludCBpcyBvdXRzaWRlIHRoZSBu
b2RlLgorICAgIC8vIERvbid0IGV4dGVuZCBzZWxlY3Rpb24gYW5kIGhhbmRsZSB0aGUgY2hhcmFj
dGVyIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgaWYgKHBvaW50SXNPdXRzaWRlT2ZCb3VuZGluZ0Jv
eEluRGlyZWN0aW9uKGNoYXJhY3Rlciwgc2VsZWN0aW9uUG9pbnQsIG5vZGVCb3VuZGluZ0JveCkp
CisgICAgICAgIG5ld1Zpc2libGVQb3NpdGlvbiA9IGRpcmVjdGlvbmFsVmlzaWJsZVBvc2l0aW9u
QXRFeHRlbnRPZkJveChmb2N1c2VkRnJhbWUsIG5vZGVCb3VuZGluZ0JveCwgY2hhcmFjdGVyLCBz
ZWxlY3Rpb25Qb2ludCk7CisKKyAgICBpZiAoaXNTdGFydEhhbmRsZSkKKyAgICAgICAgbmV3U2Vs
ZWN0aW9uID0gVmlzaWJsZVNlbGVjdGlvbihuZXdWaXNpYmxlUG9zaXRpb24sIG5ld1NlbGVjdGlv
bi52aXNpYmxlRW5kKCksIHRydWUgLyppc0RpcmVjdGlvbmFsKi8pOworICAgIGVsc2UKKyAgICAg
ICAgbmV3U2VsZWN0aW9uID0gVmlzaWJsZVNlbGVjdGlvbihuZXdTZWxlY3Rpb24udmlzaWJsZVN0
YXJ0KCksIG5ld1Zpc2libGVQb3NpdGlvbiwgdHJ1ZSAvKmlzRGlyZWN0aW9uYWwqLyk7CisKKyAg
ICAvLyBJZiBubyBzZWxlY3Rpb24gd2lsbCBiZSBjaGFuZ2VkLCByZXR1cm4gdGhlIGNoYXJhY3Rl
ciB0byBleHRlbmQgdXNpbmcgbmF2aWdhdGlvbi4KKyAgICBpZiAoY29udHJvbGxlci0+c2VsZWN0
aW9uKCkgPT0gbmV3U2VsZWN0aW9uKQorICAgICAgICByZXR1cm4gY2hhcmFjdGVyOworCisgICAg
Ly8gU2VsZWN0aW9uIGhhcyBiZWVuIHVwZGF0ZWQuCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIFJl
dHVybnMgdHJ1ZSBpZiBoYW5kbGVkLgorYm9vbCBTZWxlY3Rpb25IYW5kbGVyOjp1cGRhdGVPckhh
bmRsZUlucHV0U2VsZWN0aW9uKFZpc2libGVTZWxlY3Rpb24mIG5ld1NlbGVjdGlvbiwgY29uc3Qg
SW50UG9pbnQmIHJlbGF0aXZlU3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAsIGNvbnN0IEludFBvaW50JiByZWxhdGl2ZUVuZCkKK3sKKyAg
ICBBU1NFUlQobV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNJbnB1dE1vZGUoKSk7CisKKyAg
ICBGcmFtZSogZm9jdXNlZEZyYW1lID0gbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsK
KyAgICBOb2RlKiBmb2N1c2VkTm9kZSA9IGZvY3VzZWRGcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNl
ZE5vZGUoKTsKKyAgICBpZiAoIWZvY3VzZWROb2RlIHx8ICFmb2N1c2VkTm9kZS0+cmVuZGVyZXIo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgRnJhbWVTZWxlY3Rpb24qIGNvbnRyb2xs
ZXIgPSBmb2N1c2VkRnJhbWUtPnNlbGVjdGlvbigpOworCisgICAgSW50UmVjdCBjdXJyZW50U3Rh
cnRDYXJldFJlY3QgPSBjb250cm9sbGVyLT5zZWxlY3Rpb24oKS52aXNpYmxlU3RhcnQoKS5hYnNv
bHV0ZUNhcmV0Qm91bmRzKCk7CisgICAgSW50UmVjdCBjdXJyZW50RW5kQ2FyZXRSZWN0ID0gY29u
dHJvbGxlci0+c2VsZWN0aW9uKCkudmlzaWJsZUVuZCgpLmFic29sdXRlQ2FyZXRCb3VuZHMoKTsK
KworICAgIC8vIENoZWNrIGlmIHRoZSBoYW5kbGUgbW92ZW1lbnQgaXMgdmFsaWQuCisgICAgaWYg
KCFzaG91bGRVcGRhdGVTZWxlY3Rpb25PckNhcmV0Rm9yUG9pbnQocmVsYXRpdmVTdGFydCwgY3Vy
cmVudFN0YXJ0Q2FyZXRSZWN0LCB0cnVlIC8qIHN0YXJ0Q2FyZXQgKi8pCisgICAgICAgIHx8ICFz
aG91bGRVcGRhdGVTZWxlY3Rpb25PckNhcmV0Rm9yUG9pbnQocmVsYXRpdmVFbmQsIGN1cnJlbnRF
bmRDYXJldFJlY3QsIGZhbHNlIC8qIHN0YXJ0Q2FyZXQgKi8pKSB7CisgICAgICAgIHNlbGVjdGlv
blBvc2l0aW9uQ2hhbmdlZCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBJ
bnRSZWN0IG5vZGVCb3VuZGluZ0JveCA9IGZvY3VzZWROb2RlLT5yZW5kZXJlcigpLT5hYnNvbHV0
ZUJvdW5kaW5nQm94UmVjdCgpOworCisgICAgLy8gT25seSBkbyBzcGVjaWFsIGhhbmRsaW5nIGlm
IG9uZSBoYW5kbGUgaXMgb3V0c2lkZSBvZiB0aGUgbm9kZS4KKyAgICBib29sIHN0YXJ0SXNPdXRz
aWRlT2ZGaWVsZCA9IHJlbGF0aXZlU3RhcnQgIT0gRE9NU3VwcG9ydDo6SW52YWxpZFBvaW50ICYm
ICFub2RlQm91bmRpbmdCb3guY29udGFpbnMocmVsYXRpdmVTdGFydCk7CisgICAgYm9vbCBlbmRJ
c091dHNpZGVPZkZpZWxkID0gcmVsYXRpdmVFbmQgIT0gRE9NU3VwcG9ydDo6SW52YWxpZFBvaW50
ICYmICFub2RlQm91bmRpbmdCb3guY29udGFpbnMocmVsYXRpdmVFbmQpOworICAgIGlmIChzdGFy
dElzT3V0c2lkZU9mRmllbGQgJiYgZW5kSXNPdXRzaWRlT2ZGaWVsZCkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgdW5zaWduZWQgc2hvcnQgY2hhcmFjdGVyID0gMDsKKyAgICBpZiAoc3Rh
cnRJc091dHNpZGVPZkZpZWxkKSB7CisgICAgICAgIGNoYXJhY3RlciA9IGV4dGVuZFNlbGVjdGlv
blRvRmllbGRCb3VuZGFyeSh0cnVlIC8qIGlzU3RhcnRIYW5kbGUgKi8sIHJlbGF0aXZlU3RhcnQs
IG5ld1NlbGVjdGlvbik7CisgICAgICAgIGlmIChjaGFyYWN0ZXIpIHsKKyAgICAgICAgICAgIC8v
IEludmVydCB0aGUgc2VsZWN0aW9uIHNvIHRoYXQgdGhlIGN1cnNvciBwb2ludCBpcyBhdCB0aGUg
YmVnaW5uaW5nLgorICAgICAgICAgICAgY29udHJvbGxlci0+c2V0U2VsZWN0aW9uKFZpc2libGVT
ZWxlY3Rpb24oY29udHJvbGxlci0+c2VsZWN0aW9uKCkuZW5kKCksIGNvbnRyb2xsZXItPnNlbGVj
dGlvbigpLnN0YXJ0KCkpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZW5kSXNPdXRzaWRl
T2ZGaWVsZCkgeworICAgICAgICBjaGFyYWN0ZXIgPSBleHRlbmRTZWxlY3Rpb25Ub0ZpZWxkQm91
bmRhcnkoZmFsc2UgLyogaXNTdGFydEhhbmRsZSAqLywgcmVsYXRpdmVFbmQsIG5ld1NlbGVjdGlv
bik7CisgICAgICAgIGlmIChjaGFyYWN0ZXIpIHsKKyAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBz
ZWxlY3Rpb24gc28gdGhhdCB0aGUgZW5kIGlzIHRoZSBlZGl0IHBvaW50LgorICAgICAgICAgICAg
Y29udHJvbGxlci0+c2V0U2VsZWN0aW9uKFZpc2libGVTZWxlY3Rpb24oY29udHJvbGxlci0+c2Vs
ZWN0aW9uKCkuc3RhcnQoKSwgY29udHJvbGxlci0+c2VsZWN0aW9uKCkuZW5kKCkpKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIGlmICghY2hhcmFjdGVyKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5m
bywgIlNlbGVjdGlvbkhhbmRsZXI6OnNldFNlbGVjdGlvbiBtYWtpbmcgc2VsZWN0aW9uIGNoYW5n
ZSBhdHRlbXB0IHVzaW5nIG5hdmlnYXRpb24iKTsKKworICAgIGlmIChzaG91bGRFeHRlbmRTZWxl
Y3Rpb25JbkRpcmVjdGlvbihjb250cm9sbGVyLT5zZWxlY3Rpb24oKSwgY2hhcmFjdGVyKSkKKyAg
ICAgICAgbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aGFuZGxlTmF2aWdhdGlvbk1vdmUoY2hh
cmFjdGVyLCB0cnVlIC8qIHNoaWZ0RG93biAqLywgZmFsc2UgLyogYWx0RG93biAqLywgZmFsc2Ug
LyogY2FuRXhpdEZpZWxkICovKTsKKworICAgIC8vIE11c3Qgc2VuZCB0aGUgc2VsZWN0aW9uUG9z
aXRpb25DaGFuZ2VkIGV2ZXJ5IHRpbWUsIHNvbWV0aW1lcyB0aGlzIHdpbGwgZHVwbGljYXRlIGJ1
dCBhbiBhY2NlcHRlZAorICAgIC8vIGhhbmRsZU5hdmlnYXRpb25Nb3ZlIG1heSBub3QgbWFrZSBh
biBhY3R1YWwgc2VsZWN0aW9uIGNoYW5nZS4KKyAgICBzZWxlY3Rpb25Qb3NpdGlvbkNoYW5nZWQo
KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTZWxlY3Rpb25IYW5kbGVyOjpzZXRTZWxl
Y3Rpb24oY29uc3QgSW50UG9pbnQmIHN0YXJ0LCBjb25zdCBJbnRQb2ludCYgZW5kKQoreworICAg
IG1fc2VsZWN0aW9uQWN0aXZlID0gdHJ1ZTsKKworICAgIEFTU0VSVChtX3dlYlBhZ2UpOworICAg
IEFTU0VSVChtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpKTsKKyAgICBBU1NFUlQobV93
ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+c2VsZWN0aW9uKCkpOworCisgICAgRnJhbWUq
IGZvY3VzZWRGcmFtZSA9IG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisgICAgRnJh
bWVTZWxlY3Rpb24qIGNvbnRyb2xsZXIgPSBmb2N1c2VkRnJhbWUtPnNlbGVjdGlvbigpOworCisg
ICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJT
ZWxlY3Rpb25IYW5kbGVyOjpzZXRTZWxlY3Rpb24gYWRqdXN0ZWQgcG9pbnRzICVkLCAlZCwgJWQs
ICVkIiwgc3RhcnQueCgpLCBzdGFydC55KCksIGVuZC54KCksIGVuZC55KCkpOworCisgICAgLy8g
Tm90ZSB0aGF0IEludFBvaW50KC0xLCAtMSkgaXMgYmVpbmcgb3VyIHNlbnRpbmVsIHNvIGZhciBm
b3IKKyAgICAvLyBjbGlwcGVkIG91dCBzZWxlY3Rpb24gc3RhcnRpbmcgb3IgZW5kaW5nIGxvY2F0
aW9uLgorICAgIGJvb2wgc3RhcnRJc1ZhbGlkID0gc3RhcnQgIT0gRE9NU3VwcG9ydDo6SW52YWxp
ZFBvaW50OworICAgIG1fbGFzdFVwZGF0ZWRFbmRQb2ludElzVmFsaWQgPSBlbmQgIT0gRE9NU3Vw
cG9ydDo6SW52YWxpZFBvaW50OworCisgICAgLy8gQXQgbGVhc3Qgb25lIG9mIHRoZSBsb2NhdGlv
bnMgbXVzdCBiZSB2YWxpZC4KKyAgICBBU1NFUlQoc3RhcnRJc1ZhbGlkIHx8IG1fbGFzdFVwZGF0
ZWRFbmRQb2ludElzVmFsaWQpOworCisgICAgSW50UG9pbnQgcmVsYXRpdmVTdGFydCA9IHN0YXJ0
OworICAgIEludFBvaW50IHJlbGF0aXZlRW5kID0gZW5kOworCisgICAgVmlzaWJsZVNlbGVjdGlv
biBuZXdTZWxlY3Rpb24oY29udHJvbGxlci0+c2VsZWN0aW9uKCkpOworCisgICAgLy8gV2UgbmVl
ZCB0aGUgc2VsZWN0aW9uIHRvIGJlIG9yZGVyZWQgYmFzZSB0aGVuIGV4dGVudC4KKyAgICBpZiAo
IWNvbnRyb2xsZXItPnNlbGVjdGlvbigpLmlzQmFzZUZpcnN0KCkpCisgICAgICAgIGNvbnRyb2xs
ZXItPnNldFNlbGVjdGlvbihWaXNpYmxlU2VsZWN0aW9uKGNvbnRyb2xsZXItPnNlbGVjdGlvbigp
LnN0YXJ0KCksIGNvbnRyb2xsZXItPnNlbGVjdGlvbigpLmVuZCgpKSk7CisKKyAgICBpZiAoc3Rh
cnRJc1ZhbGlkKSB7CisgICAgICAgIHJlbGF0aXZlU3RhcnQgPSBET01TdXBwb3J0Ojpjb252ZXJ0
UG9pbnRUb0ZyYW1lKG1fd2ViUGFnZS0+bWFpbkZyYW1lKCksIGZvY3VzZWRGcmFtZSwgc3RhcnQp
OworCisgICAgICAgIC8vIFNldCB0aGUgc2VsZWN0aW9uIHdpdGggdmFsaWRhdGlvbi4KKyAgICAg
ICAgbmV3U2VsZWN0aW9uLnNldEJhc2UodmlzaWJsZVBvc2l0aW9uRm9yUG9pbnRJZ25vcmluZ0Ns
aXBwaW5nKCpmb2N1c2VkRnJhbWUsIHJlbGF0aXZlU3RhcnQpKTsKKworICAgICAgICAvLyBSZXNl
dCB0aGUgc2VsZWN0aW9uIHVzaW5nIHRoZSBleGlzdGluZyBleHRlbnQgd2l0aG91dCB2YWxpZGF0
aW9uLgorICAgICAgICBuZXdTZWxlY3Rpb24uc2V0V2l0aG91dFZhbGlkYXRpb24obmV3U2VsZWN0
aW9uLmJhc2UoKSwgY29udHJvbGxlci0+c2VsZWN0aW9uKCkuZW5kKCkpOworICAgIH0KKworICAg
IGlmIChtX2xhc3RVcGRhdGVkRW5kUG9pbnRJc1ZhbGlkKSB7CisgICAgICAgIHJlbGF0aXZlRW5k
ID0gRE9NU3VwcG9ydDo6Y29udmVydFBvaW50VG9GcmFtZShtX3dlYlBhZ2UtPm1haW5GcmFtZSgp
LCBmb2N1c2VkRnJhbWUsIGVuZCk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBzZWxlY3Rpb24gd2l0
aCB2YWxpZGF0aW9uLgorICAgICAgICBuZXdTZWxlY3Rpb24uc2V0RXh0ZW50KHZpc2libGVQb3Np
dGlvbkZvclBvaW50SWdub3JpbmdDbGlwcGluZygqZm9jdXNlZEZyYW1lLCByZWxhdGl2ZUVuZCkp
OworCisgICAgICAgIC8vIFJlc2V0IHRoZSBzZWxlY3Rpb24gdXNpbmcgdGhlIGV4aXN0aW5nIGJh
c2Ugd2l0aG91dCB2YWxpZGF0aW9uLgorICAgICAgICBuZXdTZWxlY3Rpb24uc2V0V2l0aG91dFZh
bGlkYXRpb24oY29udHJvbGxlci0+c2VsZWN0aW9uKCkuc3RhcnQoKSwgbmV3U2VsZWN0aW9uLmV4
dGVudCgpKTsKKyAgICB9CisKKyAgICBpZiAobV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNJ
bnB1dE1vZGUoKSkgeworICAgICAgICBpZiAodXBkYXRlT3JIYW5kbGVJbnB1dFNlbGVjdGlvbihu
ZXdTZWxlY3Rpb24sIHJlbGF0aXZlU3RhcnQsIHJlbGF0aXZlRW5kKSkKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBpZiAoY29udHJvbGxlci0+c2VsZWN0aW9uKCkgPT0gbmV3U2Vs
ZWN0aW9uKSB7CisgICAgICAgIHNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCgpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBzaXplIGlzIHJlZHVjZSB0
byBsZXNzIHRoYW4gYSBjaGFyYWN0ZXIsIHNlbGVjdGlvbiB0eXBlIGJlY29tZXMKKyAgICAvLyBD
YXJldC4gQXMgbG9uZyBhcyBpdCBpcyBzdGlsbCBhIHJhbmdlLCBpdCdzIGEgdmFsaWQgc2VsZWN0
aW9uLiBTZWxlY3Rpb24gY2Fubm90CisgICAgLy8gYmUgY2FuY2VsbGVkIHRocm91Z2ggdGhpcyBm
dW5jdGlvbi4KKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiByZWdpb247
CisgICAgZ2V0Q29uc29saWRhdGVkUmVnaW9uT2ZUZXh0UXVhZHNGb3JTZWxlY3Rpb24obmV3U2Vs
ZWN0aW9uLCByZWdpb24pOworICAgIGNsaXBSZWdpb25Ub1Zpc2libGVDb250YWluZXIocmVnaW9u
KTsKKyAgICBpZiAoIXJlZ2lvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhl
IGhhbmRsZXMgcmV2ZXJzZWQgcG9zaXRpb24uCisgICAgICAgIGlmIChtX3NlbGVjdGlvbkFjdGl2
ZSAmJiAhbmV3U2VsZWN0aW9uLmlzQmFzZUZpcnN0KCkpCisgICAgICAgICAgICBtX3dlYlBhZ2Ut
Pm1fY2xpZW50LT5ub3RpZnlTZWxlY3Rpb25IYW5kbGVzUmV2ZXJzZWQoKTsKKworICAgICAgICBj
b250cm9sbGVyLT5zZXRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKTsKKworICAgICAgICBERUJVR19T
RUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlvbkhh
bmRsZXI6OnNldFNlbGVjdGlvbiBzZWxlY3Rpb24gcG9pbnRzIHZhbGlkLCBzZWxlY3Rpb24gdXBk
YXRlZCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFJlcXVlc3RlZCBzZWxlY3Rpb24gcmVz
dWx0cyBpbiBhbiBlbXB0eSBzZWxlY3Rpb24sIHNraXAgdGhpcyBjaGFuZ2UuCisgICAgICAgIHNl
bGVjdGlvblBvc2l0aW9uQ2hhbmdlZCgpOworCisgICAgICAgIERFQlVHX1NFTEVDVElPTihCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxXYXJuLCAiU2VsZWN0aW9uSGFuZGxlcjo6c2V0U2Vs
ZWN0aW9uIHNlbGVjdGlvbiBwb2ludHMgaW52YWxpZCwgc2VsZWN0aW9uIG5vdCB1cGRhdGVkIik7
CisgICAgfQorfQorCisvLyBGSVhNRSByZS11c2UgdGhpcyBpbiBjb250ZXh0LiBNdXN0IGJlIHVw
ZGF0ZWQgdG8gaW5jbHVkZSBhbiBvcHRpb24gdG8gcmV0dXJuIHRoZSBocmVmLgorLy8gVGhpcyBm
dW5jdGlvbiBzaG91bGQgYmUgbW92ZWQgdG8gYSBuZXcgdW5pdCBmaWxlLiBOYW1lcyBzdWdnZXRp
b25zIGluY2x1ZGUgRE9NUXVlcmllcworLy8gYW5kIE5vZGVUeXBlcy4gRnVuY3Rpb25zIGN1cnJl
bnRseSBpbiBJbnB1dEhhbmRsZXIuY3BwLCBTZWxlY3Rpb25IYW5kbGVyLmNwcCBhbmQgV2ViUGFn
ZS5jcHAKKy8vIGNhbiBhbGwgYmUgbW92ZWQgaW4uCitzdGF0aWMgTm9kZSogZW5jbG9zaW5nTGlu
a0V2ZW50UGFyZW50Rm9yTm9kZShOb2RlKiBub2RlKQoreworICAgIGlmICghbm9kZSkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBOb2RlKiBsaW5rTm9kZSA9IG5vZGUtPmVuY2xvc2luZ0xpbmtF
dmVudFBhcmVudE9yU2VsZigpOworICAgIHJldHVybiBsaW5rTm9kZSAmJiBsaW5rTm9kZS0+aXNM
aW5rKCkgPyBsaW5rTm9kZSA6IDA7Cit9CisKK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6c2VsZWN0
QXRQb2ludChjb25zdCBJbnRQb2ludCYgbG9jYXRpb24pCit7CisgICAgLy8gSWYgcG9pbnQgaXMg
aW52YWxpZCB0cmlnZ2VyIHNlbGVjdGlvbiBiYXNlZCBleHBhbnNpb24uCisgICAgaWYgKGxvY2F0
aW9uID09IERPTVN1cHBvcnQ6OkludmFsaWRQb2ludCkgeworICAgICAgICBzZWxlY3RPYmplY3Qo
V29yZEdyYW51bGFyaXR5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE5vZGUqIHRh
cmdldE5vZGU7CisgICAgSW50UG9pbnQgdGFyZ2V0UG9zaXRpb247CisgICAgLy8gRklYTUU6IEZh
Y3RvcnkgdGhpcyBnZXQgcmlnaHQgZmF0IGZpbmdlciBjb2RlIGludG8gYSBoZWxwZXIuCisgICAg
Y29uc3QgRmF0RmluZ2Vyc1Jlc3VsdCBsYXN0RmF0RmluZ2Vyc1Jlc3VsdCA9IG1fd2ViUGFnZS0+
bV90b3VjaEV2ZW50SGFuZGxlci0+bGFzdEZhdEZpbmdlcnNSZXN1bHQoKTsKKyAgICBpZiAobGFz
dEZhdEZpbmdlcnNSZXN1bHQucG9zaXRpb25XYXNBZGp1c3RlZCgpICYmIGxhc3RGYXRGaW5nZXJz
UmVzdWx0Lm5vZGVBc0VsZW1lbnRJZkFwcGxpY2FibGUoKSkgeworICAgICAgICB0YXJnZXROb2Rl
ID0gbGFzdEZhdEZpbmdlcnNSZXN1bHQudmFsaWROb2RlKCk7CisgICAgICAgIHRhcmdldFBvc2l0
aW9uID0gbGFzdEZhdEZpbmdlcnNSZXN1bHQuYWRqdXN0ZWRQb3NpdGlvbigpOworICAgIH0gZWxz
ZSB7CisgICAgICAgIEZhdEZpbmdlcnNSZXN1bHQgbmV3RmF0RmluZ2Vyc1Jlc3VsdCA9IEZhdEZp
bmdlcnMobV93ZWJQYWdlLCBsb2NhdGlvbiwgRmF0RmluZ2Vyczo6VGV4dCkuZmluZEJlc3RQb2lu
dCgpOworICAgICAgICBpZiAoIW5ld0ZhdEZpbmdlcnNSZXN1bHQucG9zaXRpb25XYXNBZGp1c3Rl
ZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHRhcmdldFBvc2l0aW9uID0gbmV3
RmF0RmluZ2Vyc1Jlc3VsdC5hZGp1c3RlZFBvc2l0aW9uKCk7CisgICAgICAgIHRhcmdldE5vZGUg
PSBuZXdGYXRGaW5nZXJzUmVzdWx0LnZhbGlkTm9kZSgpOworICAgIH0KKworICAgIEFTU0VSVCh0
YXJnZXROb2RlKTsKKworICAgIC8vIElmIHRoZSBub2RlIGF0IHRoZSBwb2ludCBpcyBhIGxpbmss
IGZvY3VzIG9uIHRoZSBlbnRpcmUgbGluaywgbm90IGEgd29yZC4KKyAgICBpZiAoTm9kZSogbGlu
ayA9IGVuY2xvc2luZ0xpbmtFdmVudFBhcmVudEZvck5vZGUodGFyZ2V0Tm9kZSkpIHsKKyAgICAg
ICAgc2VsZWN0T2JqZWN0KGxpbmspOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8g
c2VsZWN0QXRQb2ludCBBUEkgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgV29yZEdyYW51bGFyaXR5
IGJ1dCBtYXkgYmUgZXh0ZW5kZWQgaW4gdGhlIGZ1dHVyZS4KKyAgICBzZWxlY3RPYmplY3QodGFy
Z2V0UG9zaXRpb24sIFdvcmRHcmFudWxhcml0eSk7Cit9CisKK3N0YXRpYyBib29sIGV4cGFuZFNl
bGVjdGlvblRvR3JhbnVsYXJpdHkoRnJhbWUqIGZyYW1lLCBWaXNpYmxlU2VsZWN0aW9uIHNlbGVj
dGlvbiwgVGV4dEdyYW51bGFyaXR5IGdyYW51bGFyaXR5LCBib29sIGlzSW5wdXRNb2RlKQorewor
ICAgIEFTU0VSVChmcmFtZSk7CisgICAgQVNTRVJUKGZyYW1lLT5zZWxlY3Rpb24oKSk7CisKKyAg
ICBpZiAoIShzZWxlY3Rpb24uc3RhcnQoKS5hbmNob3JOb2RlKCkgJiYgc2VsZWN0aW9uLnN0YXJ0
KCkuYW5jaG9yTm9kZSgpLT5pc1RleHROb2RlKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBpZiAoZ3JhbnVsYXJpdHkgPT0gV29yZEdyYW51bGFyaXR5KQorICAgICAgICBzZWxlY3Rp
b24gPSBET01TdXBwb3J0Ojp2aXNpYmxlU2VsZWN0aW9uRm9yQ2xvc2VzdEFjdHVhbFdvcmRTdGFy
dChzZWxlY3Rpb24pOworCisgICAgc2VsZWN0aW9uLmV4cGFuZFVzaW5nR3JhbnVsYXJpdHkoZ3Jh
bnVsYXJpdHkpOworICAgIFJlZlB0cjxSYW5nZT4gbmV3UmFuZ2UgPSBzZWxlY3Rpb24udG9Ob3Jt
YWxpemVkUmFuZ2UoKTsKKyAgICBSZWZQdHI8UmFuZ2U+IG9sZFJhbmdlID0gZnJhbWUtPnNlbGVj
dGlvbigpLT5zZWxlY3Rpb24oKS50b05vcm1hbGl6ZWRSYW5nZSgpOworICAgIEVBZmZpbml0eSBh
ZmZpbml0eSA9IGZyYW1lLT5zZWxlY3Rpb24oKS0+YWZmaW5pdHkoKTsKKworICAgIGlmIChpc0lu
cHV0TW9kZSAmJiAhZnJhbWUtPmVkaXRvcigpLT5jbGllbnQoKS0+c2hvdWxkQ2hhbmdlU2VsZWN0
ZWRSYW5nZShvbGRSYW5nZS5nZXQoKSwgbmV3UmFuZ2UuZ2V0KCksIGFmZmluaXR5LCBmYWxzZSkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBmcmFtZS0+c2VsZWN0aW9uKCkt
PnNldFNlbGVjdGVkUmFuZ2UobmV3UmFuZ2UuZ2V0KCksIGFmZmluaXR5LCB0cnVlKTsKK30KKwor
dm9pZCBTZWxlY3Rpb25IYW5kbGVyOjpzZWxlY3RPYmplY3QoY29uc3QgSW50UG9pbnQmIGxvY2F0
aW9uLCBUZXh0R3JhbnVsYXJpdHkgZ3JhbnVsYXJpdHkpCit7CisgICAgQVNTRVJUKGxvY2F0aW9u
LngoKSA+PSAwICYmIGxvY2F0aW9uLnkoKSA+PSAwKTsKKyAgICBBU1NFUlQobV93ZWJQYWdlICYm
IG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkgJiYgbV93ZWJQYWdlLT5mb2N1c2VkT3JN
YWluRnJhbWUoKS0+c2VsZWN0aW9uKCkpOworICAgIEZyYW1lKiBmb2N1c2VkRnJhbWUgPSBtX3dl
YlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpOworCisgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJTZWxlY3Rpb25IYW5kbGVyOjpzZWxlY3RP
YmplY3QgYWRqdXN0ZWQgcG9pbnRzICVkLCAlZCIsIGxvY2F0aW9uLngoKSwgbG9jYXRpb24ueSgp
KTsKKworICAgIEludFBvaW50IHJlbGF0aXZlUG9pbnQgPSBET01TdXBwb3J0Ojpjb252ZXJ0UG9p
bnRUb0ZyYW1lKG1fd2ViUGFnZS0+bWFpbkZyYW1lKCksIGZvY3VzZWRGcmFtZSwgbG9jYXRpb24p
OworICAgIFZpc2libGVQb3NpdGlvbiBwb2ludExvY2F0aW9uKGZvY3VzZWRGcmFtZS0+dmlzaWJs
ZVBvc2l0aW9uRm9yUG9pbnQocmVsYXRpdmVQb2ludCkpOworICAgIFZpc2libGVTZWxlY3Rpb24g
c2VsZWN0aW9uID0gVmlzaWJsZVNlbGVjdGlvbihwb2ludExvY2F0aW9uLCBwb2ludExvY2F0aW9u
KTsKKworICAgIG1fc2VsZWN0aW9uQWN0aXZlID0gZXhwYW5kU2VsZWN0aW9uVG9HcmFudWxhcml0
eShmb2N1c2VkRnJhbWUsIHNlbGVjdGlvbiwgZ3JhbnVsYXJpdHksIG1fd2ViUGFnZS0+bV9pbnB1
dEhhbmRsZXItPmlzSW5wdXRNb2RlKCkpOworfQorCit2b2lkIFNlbGVjdGlvbkhhbmRsZXI6OnNl
bGVjdE9iamVjdChUZXh0R3JhbnVsYXJpdHkgZ3JhbnVsYXJpdHkpCit7CisgICAgQVNTRVJUKG1f
d2ViUGFnZSAmJiBtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyKTsKKyAgICAvLyBVc2luZyBjYXJl
dCBsb2NhdGlvbiwgbXVzdCBiZSBpbnNpZGUgYW4gaW5wdXQgZmllbGQuCisgICAgaWYgKCFtX3dl
YlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBBU1NFUlQobV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKSAmJiBtX3dlYlBhZ2Ut
PmZvY3VzZWRPck1haW5GcmFtZSgpLT5zZWxlY3Rpb24oKSk7CisgICAgRnJhbWUqIGZvY3VzZWRG
cmFtZSA9IG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisKKyAgICBERUJVR19TRUxF
Q1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIlNlbGVjdGlvbkhhbmRs
ZXI6OnNlbGVjdE9iamVjdCB1c2luZyBjdXJyZW50IHNlbGVjdGlvbiIpOworCisgICAgLy8gVXNl
IHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhcyB0aGUgc2VsZWN0aW9uIHBvaW50LgorICAgIEFTU0VS
VChmb2N1c2VkRnJhbWUtPnNlbGVjdGlvbigpLT5zZWxlY3Rpb25UeXBlKCkgIT0gVmlzaWJsZVNl
bGVjdGlvbjo6Tm9TZWxlY3Rpb24pOworICAgIG1fc2VsZWN0aW9uQWN0aXZlID0gZXhwYW5kU2Vs
ZWN0aW9uVG9HcmFudWxhcml0eShmb2N1c2VkRnJhbWUsIGZvY3VzZWRGcmFtZS0+c2VsZWN0aW9u
KCktPnNlbGVjdGlvbigpLCBncmFudWxhcml0eSwgdHJ1ZSAvKiBpc0lucHV0TW9kZSAqLyk7Cit9
CisKK3ZvaWQgU2VsZWN0aW9uSGFuZGxlcjo6c2VsZWN0T2JqZWN0KE5vZGUqIG5vZGUpCit7Cisg
ICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3NlbGVjdGlvbkFjdGl2ZSA9
IHRydWU7CisKKyAgICBBU1NFUlQobV93ZWJQYWdlICYmIG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFp
bkZyYW1lKCkgJiYgbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+c2VsZWN0aW9uKCkp
OworICAgIEZyYW1lKiBmb2N1c2VkRnJhbWUgPSBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFt
ZSgpOworCisgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZl
bEluZm8sICJTZWxlY3Rpb25IYW5kbGVyOjpzZWxlY3ROb2RlIik7CisKKyAgICBWaXNpYmxlU2Vs
ZWN0aW9uIHNlbGVjdGlvbiA9IFZpc2libGVTZWxlY3Rpb246OnNlbGVjdGlvbkZyb21Db250ZW50
c09mTm9kZShub2RlKTsKKyAgICBmb2N1c2VkRnJhbWUtPnNlbGVjdGlvbigpLT5zZXRTZWxlY3Rp
b24oc2VsZWN0aW9uKTsKK30KKworc3RhdGljIFRleHREaXJlY3Rpb24gZGlyZWN0aW9uT2ZFbmNs
b3NpbmdCbG9jayhGcmFtZVNlbGVjdGlvbiogc2VsZWN0aW9uKQoreworICAgIE5vZGUqIGVuY2xv
c2luZ0Jsb2NrTm9kZSA9IGVuY2xvc2luZ0Jsb2NrKHNlbGVjdGlvbi0+c2VsZWN0aW9uKCkuZXh0
ZW50KCkuZGVwcmVjYXRlZE5vZGUoKSk7CisgICAgaWYgKCFlbmNsb3NpbmdCbG9ja05vZGUpCisg
ICAgICAgIHJldHVybiBMVFI7CisKKyAgICBpZiAoUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGVu
Y2xvc2luZ0Jsb2NrTm9kZS0+cmVuZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuIHJlbmRlcmVyLT5z
dHlsZSgpLT5kaXJlY3Rpb24oKTsKKworICAgIHJldHVybiBMVFI7Cit9CisKKy8vIFJldHVybnMg
PiAwIGlmIHAxIGlzICJjbG9zZXIiIHRvIHJlZmVyZW5jZVBvaW50LCA8IDAgaWYgcDIgaXMgImNs
b3NlciIsIDAgaWYgdGhleSBhcmUgZXF1aWRpc3RhbnQuCisvLyBCZWNhdXNlIHRleHQgaXMgdXN1
YWxseSBhcnJhbmdlZCBpbiBob3Jpem9udGFsIHJvd3MsIGRpc3RhbmNlIGlzIG1lYXN1cmVkIGFs
b25nIHRoZSB5LWF4aXMsIHdpdGggeC1heGlzIHVzZWQgb25seSB0byBicmVhayB0aWVzLgorLy8g
SWYgcmlnaHRHcmF2aXR5IGlzIHRydWUsIHRoZSByaWdodC1tb3N0IHgtY29vcmRpbmF0ZSBpcyBj
aG9zZW4sIG90aGVyd2lzZSB0ZWggbGVmdC1tb3N0IGNvb3JkaW5hdGUgaXMgY2hvc2VuLgorc3Rh
dGljIGlubGluZSBpbnQgY29tcGFyZVBvaW50c1RvUmVmZXJlbmNlUG9pbnQoY29uc3QgSW50UG9p
bnQmIHAxLCBjb25zdCBJbnRQb2ludCYgcDIsIGNvbnN0IEludFBvaW50JiByZWZlcmVuY2VQb2lu
dCwgYm9vbCByaWdodEdyYXZpdHkpCit7CisgICAgaW50IGR5MSA9IGFicyhyZWZlcmVuY2VQb2lu
dC55KCkgLSBwMS55KCkpOworICAgIGludCBkeTIgPSBhYnMocmVmZXJlbmNlUG9pbnQueSgpIC0g
cDIueSgpKTsKKyAgICBpZiAoZHkxICE9IGR5MikKKyAgICAgICAgcmV0dXJuIGR5MiAtIGR5MTsK
KworICAgIC8vIFNhbWUgeS1jb29yZGluYXRlLCBjaG9vc2UgdGhlIGZhcnRoZXN0IHJpZ2h0IChv
ciBsZWZ0KSBwb2ludC4KKyAgICBpZiAocDEueCgpID09IHAyLngoKSkKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICBpZiAocDEueCgpID4gcDIueCgpKQorICAgICAgICByZXR1cm4gcmlnaHRHcmF2
aXR5ID8gMSA6IC0xOworCisgICAgcmV0dXJuIHJpZ2h0R3Jhdml0eSA/IC0xIDogMTsKK30KKwor
Ly8gTk9URS9GSVhNRTogRHVlIHRvIHI3NzI4Niwgd2UgYXJlIGdldHRpbmcgb2ZmLWJ5LW9uZSBy
ZXN1bHRzIGluIHRoZSBJbnRSZWN0IGNsYXNzIGNvdW50ZXJwYXJ0IGltcGxlbWVudGF0aW9uIG9m
IHRoZQorLy8gICAgICAgICAgICAgbWV0aG9kcyBiZWxvdy4gQXMgZG9uZSBpbiByODk4MDMsIHI3
NzkyOCBhbmQgYSBmZXcgb3RoZXJzLCBsZXRzIHVzZSBsb2NhbCBtZXRob2QgdG8gZml4IGl0Lgor
Ly8gICAgICAgICAgICAgV2Ugc2hvdWxkIGtlZXAgb3VyIGV5ZXMgdmVyeSBvcGVuIG9uIGl0LCBz
aW5jZSBpdCBjYW4gYWZmZWN0IEJhY2tpbmdTdG9yZSB2ZXJ5IGJhZGx5Lgorc3RhdGljIEludFBv
aW50IG1pblhNaW5ZQ29ybmVyKGNvbnN0IEludFJlY3QmIHJlY3QpIHsgcmV0dXJuIHJlY3QubG9j
YXRpb24oKTsgfSAvLyB0eXBpY2FsbHkgdG9wTGVmdAorc3RhdGljIEludFBvaW50IG1heFhNaW5Z
Q29ybmVyKGNvbnN0IEludFJlY3QmIHJlY3QpIHsgcmV0dXJuIEludFBvaW50KHJlY3QueCgpICsg
cmVjdC53aWR0aCgpIC0gMSwgcmVjdC55KCkpOyB9IC8vIHR5cGljYWxseSB0b3BSaWdodAorc3Rh
dGljIEludFBvaW50IG1pblhNYXhZQ29ybmVyKGNvbnN0IEludFJlY3QmIHJlY3QpIHsgcmV0dXJu
IEludFBvaW50KHJlY3QueCgpLCByZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCkgLSAxKTsgfSAvLyB0
eXBpY2FsbHkgYm90dG9tTGVmdAorc3RhdGljIEludFBvaW50IG1heFhNYXhZQ29ybmVyKGNvbnN0
IEludFJlY3QmIHJlY3QpIHsgcmV0dXJuIEludFBvaW50KHJlY3QueCgpICsgcmVjdC53aWR0aCgp
IC0gMSwgcmVjdC55KCkgKyByZWN0LmhlaWdodCgpIC0gMSk7IH0gLy8gdHlwaWNhbGx5IGJvdHRv
bVJpZ2h0CisKKy8vIFRoZSBjYXJldCBpcyBhIG9uZS1waXhlbCB3aWRlIGxpbmUgZG93biBlaXRo
ZXIgdGhlIHJpZ2h0IG9yIGxlZnQgZWRnZSBvZiBhCisvLyByZWN0LCBkZXBlbmRpbmcgb24gdGhl
IHRleHQgZGlyZWN0aW9uLgorc3RhdGljIGlubGluZSBib29sIGNhcmV0SXNPbkxlZnQoYm9vbCBp
c1N0YXJ0Q2FyZXQsIGJvb2wgaXNSVEwpCit7CisgICAgaWYgKGlzU3RhcnRDYXJldCkKKyAgICAg
ICAgcmV0dXJuICFpc1JUTDsKKworICAgIHJldHVybiBpc1JUTDsKK30KKworc3RhdGljIGlubGlu
ZSBJbnRQb2ludCBjYXJldExvY2F0aW9uRm9yUmVjdChjb25zdCBJbnRSZWN0JiByZWN0LCBib29s
IGlzU3RhcnRDYXJldCwgYm9vbCBpc1JUTCkKK3sKKyAgICByZXR1cm4gY2FyZXRJc09uTGVmdChp
c1N0YXJ0Q2FyZXQsIGlzUlRMKSA/IG1pblhNaW5ZQ29ybmVyKHJlY3QpIDogbWF4WE1pbllDb3Ju
ZXIocmVjdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgSW50UG9pbnQgY2FyZXRDb21wYXJpc29uUG9p
bnRGb3JSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgaXNTdGFydENhcmV0LCBib29sIGlz
UlRMKQoreworICAgIGlmIChpc1N0YXJ0Q2FyZXQpCisgICAgICAgIHJldHVybiBjYXJldElzT25M
ZWZ0KGlzU3RhcnRDYXJldCwgaXNSVEwpID8gbWluWE1pbllDb3JuZXIocmVjdCkgOiBtYXhYTWlu
WUNvcm5lcihyZWN0KTsKKworICAgIHJldHVybiBjYXJldElzT25MZWZ0KGlzU3RhcnRDYXJldCwg
aXNSVEwpID8gbWluWE1heFlDb3JuZXIocmVjdCkgOiBtYXhYTWF4WUNvcm5lcihyZWN0KTsKK30K
Kworc3RhdGljIHZvaWQgYWRqdXN0Q2FyZXRSZWN0cyhJbnRSZWN0JiBzdGFydENhcmV0LCBib29s
IGlzU3RhcnRDYXJldENsaXBwZWRPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElu
dFJlY3QmIGVuZENhcmV0LCBib29sIGlzRW5kQ2FyZXRDbGlwcGVkT3V0LAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
SW50UmVjdD4gcmVjdExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElu
dFBvaW50JiBzdGFydFJlZmVyZW5jZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBJbnRQb2ludCYgZW5kUmVmZXJlbmNlUG9pbnQsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGJvb2wgaXNSVEwpCit7CisgICAgLy8gc3RhcnRSZWZlcmVuY2VQb2ludCBpcyB0
aGUgYmVzdCBndWVzcyBhdCB0aGUgdG9wIGxlZnQgb2YgdGhlIHNlbGVjdGlvbjsgZW5kUmVmZXJl
bmNlUG9pbnQgaXMgdGhlIGJlc3QgZ3Vlc3MgYXQgdGhlIGJvdHRvbSByaWdodC4KKyAgICBpZiAo
aXNTdGFydENhcmV0Q2xpcHBlZE91dCkKKyAgICAgICAgc3RhcnRDYXJldC5zZXRMb2NhdGlvbihE
T01TdXBwb3J0OjpJbnZhbGlkUG9pbnQpOworICAgIGVsc2UgeworICAgICAgICBzdGFydENhcmV0
ID0gcmVjdExpc3RbMF07CisgICAgICAgIHN0YXJ0Q2FyZXQuc2V0TG9jYXRpb24oY2FyZXRMb2Nh
dGlvbkZvclJlY3Qoc3RhcnRDYXJldCwgdHJ1ZSwgaXNSVEwpKTsKKyAgICB9CisKKyAgICBpZiAo
aXNFbmRDYXJldENsaXBwZWRPdXQpCisgICAgICAgIGVuZENhcmV0LnNldExvY2F0aW9uKERPTVN1
cHBvcnQ6OkludmFsaWRQb2ludCk7CisgICAgZWxzZSB7CisgICAgICAgIGVuZENhcmV0ID0gcmVj
dExpc3RbMF07CisgICAgICAgIGVuZENhcmV0LnNldExvY2F0aW9uKGNhcmV0TG9jYXRpb25Gb3JS
ZWN0KGVuZENhcmV0LCBmYWxzZSwgaXNSVEwpKTsKKyAgICB9CisKKyAgICBpZiAoaXNTdGFydENh
cmV0Q2xpcHBlZE91dCAmJiBpc0VuZENhcmV0Q2xpcHBlZE91dCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgLy8gUmVzZXQgd2lkdGggdG8gMSBhcyB3ZSBhcmUgc3RyaWN0bHkgaW50ZXJlc3RlZCBp
biBjYXJldCBsb2NhdGlvbi4KKyAgICBzdGFydENhcmV0LnNldFdpZHRoKDEpOworICAgIGVuZENh
cmV0LnNldFdpZHRoKDEpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IHJlY3RMaXN0
LnNpemUoKTsgaSsrKSB7CisgICAgICAgIEludFJlY3QgY3VycmVudFJlY3QocmVjdExpc3RbaV0p
OworCisgICAgICAgIC8vIENvbXBhcmUgYW5kIHVwZGF0ZSB0aGUgc3RhcnQgYW5kIGVuZCBjYXJl
dHMgd2l0aCB0aGVpciByZXNwZWN0aXZlIHJlZmVyZW5jZSBwb2ludHMuCisgICAgICAgIGlmICgh
aXNTdGFydENhcmV0Q2xpcHBlZE91dCAmJiBjb21wYXJlUG9pbnRzVG9SZWZlcmVuY2VQb2ludCgK
KyAgICAgICAgICAgICAgICAgICAgY2FyZXRDb21wYXJpc29uUG9pbnRGb3JSZWN0KGN1cnJlbnRS
ZWN0LCB0cnVlLCBpc1JUTCksCisgICAgICAgICAgICAgICAgICAgIGNhcmV0Q29tcGFyaXNvblBv
aW50Rm9yUmVjdChzdGFydENhcmV0LCB0cnVlLCBpc1JUTCksCisgICAgICAgICAgICAgICAgICAg
IHN0YXJ0UmVmZXJlbmNlUG9pbnQsIGlzUlRMKSA+IDApIHsKKyAgICAgICAgICAgIHN0YXJ0Q2Fy
ZXQuc2V0TG9jYXRpb24oY2FyZXRMb2NhdGlvbkZvclJlY3QoY3VycmVudFJlY3QsIHRydWUsIGlz
UlRMKSk7CisgICAgICAgICAgICBzdGFydENhcmV0LnNldEhlaWdodChjdXJyZW50UmVjdC5oZWln
aHQoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzRW5kQ2FyZXRDbGlwcGVkT3V0ICYm
IGNvbXBhcmVQb2ludHNUb1JlZmVyZW5jZVBvaW50KAorICAgICAgICAgICAgICAgICAgICBjYXJl
dENvbXBhcmlzb25Qb2ludEZvclJlY3QoY3VycmVudFJlY3QsIGZhbHNlLCBpc1JUTCksCisgICAg
ICAgICAgICAgICAgICAgIGNhcmV0Q29tcGFyaXNvblBvaW50Rm9yUmVjdChlbmRDYXJldCwgZmFs
c2UsIGlzUlRMKSwKKyAgICAgICAgICAgICAgICAgICAgZW5kUmVmZXJlbmNlUG9pbnQsICFpc1JU
TCkgPiAwKSB7CisgICAgICAgICAgICBlbmRDYXJldC5zZXRMb2NhdGlvbihjYXJldExvY2F0aW9u
Rm9yUmVjdChjdXJyZW50UmVjdCwgZmFsc2UsIGlzUlRMKSk7CisgICAgICAgICAgICBlbmRDYXJl
dC5zZXRIZWlnaHQoY3VycmVudFJlY3QuaGVpZ2h0KCkpOworICAgICAgICB9CisgICAgfQorfQor
Cit2b2lkIFNlbGVjdGlvbkhhbmRsZXI6OmNsaXBSZWdpb25Ub1Zpc2libGVDb250YWluZXIoQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb24mIHJlZ2lvbikKK3sKKyAgICBBU1NFUlQo
bV93ZWJQYWdlLT5tX21haW5GcmFtZSAmJiBtX3dlYlBhZ2UtPm1fbWFpbkZyYW1lLT52aWV3KCkp
OworCisgICAgRnJhbWUqIGZyYW1lID0gbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsK
KworICAgIC8vIERvbid0IGFsbG93IHRoZSByZWdpb24gdG8gZXh0ZW5kIG91dHNpZGUgb2YgdGhl
IGFsbCBpdHMgYW5jZXN0b3IgZnJhbWVzJyB2aXNpYmxlIGFyZWEuCisgICAgaWYgKGZyYW1lICE9
IG1fd2ViUGFnZS0+bWFpbkZyYW1lKCkpIHsKKyAgICAgICAgSW50UmVjdCBjb250YWluaW5nQ29u
dGVudFJlY3Q7CisgICAgICAgIGNvbnRhaW5pbmdDb250ZW50UmVjdCA9IG1fd2ViUGFnZS0+Z2V0
UmVjdXJzaXZlVmlzaWJsZVdpbmRvd1JlY3QoZnJhbWUtPnZpZXcoKSwgdHJ1ZSAvKiBubyBjbGlw
IHRvIG1haW4gZnJhbWUgd2luZG93ICovKTsKKyAgICAgICAgY29udGFpbmluZ0NvbnRlbnRSZWN0
ID0gbV93ZWJQYWdlLT5tX21haW5GcmFtZS0+dmlldygpLT53aW5kb3dUb0NvbnRlbnRzKGNvbnRh
aW5pbmdDb250ZW50UmVjdCk7CisgICAgICAgIHJlZ2lvbiA9IGludGVyc2VjdFJlZ2lvbnMoQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb24oY29udGFpbmluZ0NvbnRlbnRSZWN0KSwg
cmVnaW9uKTsKKyAgICB9CisKKyAgICAvLyBEb24ndCBhbGxvdyB0aGUgcmVnaW9uIHRvIGV4dGVu
ZCBvdXRzaWRlIG9mIHRoZSBpbnB1dCBmaWVsZC4KKyAgICBpZiAobV93ZWJQYWdlLT5tX2lucHV0
SGFuZGxlci0+aXNJbnB1dE1vZGUoKQorICAgICAgICAmJiBmcmFtZS0+ZG9jdW1lbnQoKS0+Zm9j
dXNlZE5vZGUoKQorICAgICAgICAmJiBmcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKS0+
cmVuZGVyZXIoKSkgeworCisgICAgICAgIC8vIEFkanVzdCB0aGUgYm91bmRpbmcgYm94IHRvIHRo
ZSBmcmFtZSBvZmZzZXQuCisgICAgICAgIEludFJlY3QgYm91bmRpbmdCb3goZnJhbWUtPmRvY3Vt
ZW50KCktPmZvY3VzZWROb2RlKCktPnJlbmRlcmVyKCktPmFic29sdXRlQm91bmRpbmdCb3hSZWN0
KCkpOworICAgICAgICBib3VuZGluZ0JveCA9IG1fd2ViUGFnZS0+bWFpbkZyYW1lKCktPnZpZXco
KS0+d2luZG93VG9Db250ZW50cyhmcmFtZS0+dmlldygpLT5jb250ZW50c1RvV2luZG93KGJvdW5k
aW5nQm94KSk7CisKKyAgICAgICAgcmVnaW9uID0gaW50ZXJzZWN0UmVnaW9ucyhCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbihib3VuZGluZ0JveCksIHJlZ2lvbik7CisgICAgfQor
fQorCitzdGF0aWMgSW50UG9pbnQgcmVmZXJlbmNlUG9pbnQoY29uc3QgVmlzaWJsZVBvc2l0aW9u
JiBwb3NpdGlvbiwgY29uc3QgSW50UmVjdCYgYm91bmRpbmdSZWN0LCBjb25zdCBJbnRQb2ludCYg
ZnJhbWVQb3NpdGlvbiwgYm9vbCBpc1N0YXJ0Q2FyZXQsIGJvb2wgaXNSVEwpCit7CisgICAgLy8g
SWYgb25lIG9mIHRoZSBjYXJldHMgaXMgaW52YWxpZCAodGhpcyBoYXBwZW5zLCBmb3IgaW5zdGFu
Y2UsIGlmIHRoZQorICAgIC8vIHNlbGVjdGlvbiBlbmRzIGluIGFuIGVtcHR5IGRpdikgZmFsbCBi
YWNrIHRvIHVzaW5nIHRoZSBjb3JuZXIgb2YgdGhlCisgICAgLy8gZW50aXJlIHJlZ2lvbiAod2hp
Y2ggaXMgYWxyZWFkeSBpbiBmcmFtZSBjb29yZGluYXRlcyBzbyBkb2Vzbid0IG5lZWQKKyAgICAv
LyBhZGp1c3RpbmcpLgorICAgIEludFJlY3Qgc3RhcnRDYXJldEJvdW5kcyhwb3NpdGlvbi5hYnNv
bHV0ZUNhcmV0Qm91bmRzKCkpOworICAgIGlmIChzdGFydENhcmV0Qm91bmRzLmlzRW1wdHkoKSkK
KyAgICAgICAgc3RhcnRDYXJldEJvdW5kcyA9IGJvdW5kaW5nUmVjdDsKKyAgICBlbHNlCisgICAg
ICAgIHN0YXJ0Q2FyZXRCb3VuZHMubW92ZShmcmFtZVBvc2l0aW9uLngoKSwgZnJhbWVQb3NpdGlv
bi55KCkpOworCisgICAgcmV0dXJuIGNhcmV0Q29tcGFyaXNvblBvaW50Rm9yUmVjdChzdGFydENh
cmV0Qm91bmRzLCBpc1N0YXJ0Q2FyZXQsIGlzUlRMKTsKK30KKworLy8gTm90ZTogVGhpcyBpcyB0
aGUgb25seSBmdW5jdGlvbiBpbiBTZWxlY3Rpb25IYW5kbGVyIGluIHdoaWNoIHRoZSBjb29yZGlu
YXRlCisvLyBzeXN0ZW0gaXMgbm90IGVudGlyZWx5IFdlYktpdC4KK3ZvaWQgU2VsZWN0aW9uSGFu
ZGxlcjo6c2VsZWN0aW9uUG9zaXRpb25DaGFuZ2VkKGJvb2wgdmlzdWFsQ2hhbmdlT25seSkKK3sK
KyAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywg
IlNlbGVjdGlvbkhhbmRsZXI6OnNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCB2aXNpYmxlQ2hhbmdl
T25seSA9ICVzIiwgdmlzdWFsQ2hhbmdlT25seSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCisgICAg
Ly8gVGhpcyBtZXRob2QgY2FuIGdldCBjYWxsZWQgZHVyaW5nIFdlYlBhZ2Ugc2h1dGRvd24gcHJv
Y2Vzcy4KKyAgICAvLyBJZiB0aGF0IGlzIHRoZSBjYXNlLCBqdXN0IGJhaWwgb3V0IHNpbmNlIHRo
ZSBjbGllbnQgaXMgbm90CisgICAgLy8gaW4gYSBzYWZlIHN0YXRlIG9mIHRydXN0IHRvIHJlcXVl
c3QgYW55dGhpbmcgZWxzZSBmcm9tIGl0LgorICAgIGlmICghbV93ZWJQYWdlLT5tX21haW5GcmFt
ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fd2ViUGFnZS0+bV9pbnB1dEhhbmRsZXIt
PmlzSW5wdXRNb2RlKCkgJiYgbV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+cHJvY2Vzc2luZ0No
YW5nZSgpKSB7CisgICAgICAgIG1fd2ViUGFnZS0+bV9jbGllbnQtPmNhbmNlbFNlbGVjdGlvblZp
c3VhbHMoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtX2NhcmV0QWN0aXZl
IHx8IChtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpICYmIG1fd2ViUGFn
ZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnNlbGVjdGlvbigpLT5pc0NhcmV0KCkpKSB7CisgICAg
ICAgIC8vIFRoaXMgbWF5IHVwZGF0ZSB0aGUgY2FyZXQgdG8gbm8gbG9uZ2VyIGJlIGFjdGl2ZS4K
KyAgICAgICAgY2FyZXRQb3NpdGlvbkNoYW5nZWQoKTsKKyAgICB9CisKKyAgICAvLyBFbnRlciBz
ZWxlY3Rpb24gbW9kZSBpZiBzZWxlY3Rpb24gdHlwZSBpcyBSYW5nZVNlbGVjdGlvbiwgYW5kIGRp
c2FibGUgc2VsZWN0aW9uIGlmCisgICAgLy8gc2VsZWN0aW9uIGlzIGFjdGl2ZSBhbmQgYmVjb21l
cyBjYXJldCBzZWxlY3Rpb24uCisgICAgRnJhbWUqIGZyYW1lID0gbV93ZWJQYWdlLT5mb2N1c2Vk
T3JNYWluRnJhbWUoKTsKKyAgICBJbnRQb2ludCBmcmFtZVBvcyA9IG1fd2ViUGFnZS0+ZnJhbWVP
ZmZzZXQoZnJhbWUpOworICAgIGlmIChtX3NlbGVjdGlvbkFjdGl2ZSAmJiAobV9jYXJldEFjdGl2
ZSB8fCBmcmFtZS0+c2VsZWN0aW9uKCktPmlzTm9uZSgpKSkKKyAgICAgICAgbV9zZWxlY3Rpb25B
Y3RpdmUgPSBmYWxzZTsKKyAgICBlbHNlIGlmIChmcmFtZS0+c2VsZWN0aW9uKCktPmlzUmFuZ2Uo
KSkKKyAgICAgICAgbV9zZWxlY3Rpb25BY3RpdmUgPSB0cnVlOworICAgIGVsc2UgaWYgKCFtX3Nl
bGVjdGlvbkFjdGl2ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCBzdGFydENhcmV0
OworICAgIEludFJlY3QgZW5kQ2FyZXQ7CisKKyAgICAvLyBHZXQgdGhlIHRleHQgcmVjdHMgZnJv
bSB0aGUgc2VsZWN0aW9ucyByYW5nZS4KKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVj
dFJlZ2lvbiByZWdpb247CisgICAgZ2V0Q29uc29saWRhdGVkUmVnaW9uT2ZUZXh0UXVhZHNGb3JT
ZWxlY3Rpb24oZnJhbWUtPnNlbGVjdGlvbigpLT5zZWxlY3Rpb24oKSwgcmVnaW9uKTsKKworICAg
IC8vIElmIHRoZXJlIGlzIG5vIGNoYW5nZSBpbiBzZWxlY3RlZCB0ZXh0IGFuZCB0aGUgdmlzdWFs
IHJlY3RzCisgICAgLy8gaGF2ZSBub3QgY2hhbmdlZCB0aGVuIGRvbid0IGJvdGhlciBub3RpZnlp
bmcgYW55dGhpbmcuCisgICAgaWYgKHZpc3VhbENoYW5nZU9ubHkgJiYgbV9sYXN0U2VsZWN0aW9u
UmVnaW9uLmlzRXF1YWwocmVnaW9uKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9sYXN0U2Vs
ZWN0aW9uUmVnaW9uID0gcmVnaW9uOworCisgICAgaWYgKCFyZWdpb24uaXNFbXB0eSgpKSB7Cisg
ICAgICAgIEludFJlY3QgdW5jbGlwcGVkU3RhcnRDYXJldDsKKyAgICAgICAgSW50UmVjdCB1bmNs
aXBwZWRFbmRDYXJldDsKKworICAgICAgICBib29sIGlzUlRMID0gZGlyZWN0aW9uT2ZFbmNsb3Np
bmdCbG9jayhmcmFtZS0+c2VsZWN0aW9uKCkpID09IFJUTDsKKworICAgICAgICBzdGQ6OnZlY3Rv
cjxCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdD4gcmVjdExpc3QgPSByZWdpb24ucmVjdHMo
KTsKKworICAgICAgICBJbnRQb2ludCBzdGFydENhcmV0UmVmZXJlbmNlUG9pbnQgPSByZWZlcmVu
Y2VQb2ludChmcmFtZS0+c2VsZWN0aW9uKCktPnNlbGVjdGlvbigpLnZpc2libGVTdGFydCgpLCBy
ZWdpb24uZXh0ZW50cygpLCBmcmFtZVBvcywgdHJ1ZSAvKiBpc1N0YXJ0Q2FyZXQgKi8sIGlzUlRM
KTsKKyAgICAgICAgSW50UG9pbnQgZW5kQ2FyZXRSZWZlcmVuY2VQb2ludCA9IHJlZmVyZW5jZVBv
aW50KGZyYW1lLT5zZWxlY3Rpb24oKS0+c2VsZWN0aW9uKCkudmlzaWJsZUVuZCgpLCByZWdpb24u
ZXh0ZW50cygpLCBmcmFtZVBvcywgZmFsc2UgLyogaXNTdGFydENhcmV0ICovLCBpc1JUTCk7CisK
KyAgICAgICAgYWRqdXN0Q2FyZXRSZWN0cyh1bmNsaXBwZWRTdGFydENhcmV0LCBmYWxzZSAvKiB1
bmNsaXBwZWQgKi8sIHVuY2xpcHBlZEVuZENhcmV0LCBmYWxzZSAvKiB1bmNsaXBwZWQgKi8sIHJl
Y3RMaXN0LCBzdGFydENhcmV0UmVmZXJlbmNlUG9pbnQsIGVuZENhcmV0UmVmZXJlbmNlUG9pbnQs
IGlzUlRMKTsKKworICAgICAgICBjbGlwUmVnaW9uVG9WaXNpYmxlQ29udGFpbmVyKHJlZ2lvbik7
CisKKyNpZiBTSE9XREVCVUdfU0VMRUNUSU9OSEFORExFUiAvLyBEb24ndCByZWx5IGp1c3Qgb24g
REVCVUdfU0VMRUNUSU9OIHRvIGF2b2lkIGxvb3AuCisgICAgICAgIGZvciAodW5zaWduZWQgaW50
IGkgPSAwOyBpIDwgcmVjdExpc3Quc2l6ZSgpOyBpKyspCisgICAgICAgICAgICBERUJVR19TRUxF
Q1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJSZWN0IGxpc3Qg
LSBVbm1vZGlmaWVkICMlZCwgKCVkLCAlZCkgKCVkIHggJWQpIiwgaSwgcmVjdExpc3RbaV0ueCgp
LCByZWN0TGlzdFtpXS55KCksIHJlY3RMaXN0W2ldLndpZHRoKCksIHJlY3RMaXN0W2ldLmhlaWdo
dCgpKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCByZWdpb24ubnVtUmVj
dHMoKTsgaSsrKQorICAgICAgICAgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiUmVjdCBsaXN0ICAtIENvbnNvbGlkYXRlZCAjJWQsICgl
ZCwgJWQpICglZCB4ICVkKSIsIGksIHJlZ2lvbi5yZWN0cygpW2ldLngoKSwgcmVnaW9uLnJlY3Rz
KClbaV0ueSgpLCByZWdpb24ucmVjdHMoKVtpXS53aWR0aCgpLCByZWdpb24ucmVjdHMoKVtpXS5o
ZWlnaHQoKSk7CisjZW5kaWYKKworICAgICAgICBib29sIHNob3VsZENhcmVBYm91dFBvc3NpYmxl
Q2xpcHBlZE91dFNlbGVjdGlvbiA9IGZyYW1lICE9IG1fd2ViUGFnZS0+bWFpbkZyYW1lKCkgfHwg
bV93ZWJQYWdlLT5tX2lucHV0SGFuZGxlci0+aXNJbnB1dE1vZGUoKTsKKworICAgICAgICBpZiAo
IXJlZ2lvbi5pc0VtcHR5KCkgfHwgc2hvdWxkQ2FyZUFib3V0UG9zc2libGVDbGlwcGVkT3V0U2Vs
ZWN0aW9uKSB7CisgICAgICAgICAgICAvLyBBZGp1c3QgdGhlIGhhbmRsZSBtYXJrZXJzIHRvIGJl
IGF0IHRoZSBlbmQgb2YgdGhlIHBhaW50ZWQgcmVjdC4gV2hlbiBzZWxlY3RpbmcgbGlua3MKKyAg
ICAgICAgICAgIC8vIGFuZCBvdGhlciBlbGVtZW50cyB0aGF0IG1heSBoYXZlIGEgbGFyZ2VyIHZp
c2libGUgYXJlYSB0aGFuIG5lZWRzIHRvIGJlIHJlbmRlcmVkIGEgZ2FwCisgICAgICAgICAgICAv
LyBjYW4gZXhpc3QgYmV0d2VlbiB0aGUgaGFuZGxlIGFuZCBvdmVybGF5IHJlZ2lvbi4KKworICAg
ICAgICAgICAgYm9vbCBzaG91bGRDbGlwU3RhcnRDYXJldCA9ICFyZWdpb24uaXNSZWN0SW5SZWdp
b24odW5jbGlwcGVkU3RhcnRDYXJldCk7CisgICAgICAgICAgICBib29sIHNob3VsZENsaXBFbmRD
YXJldCA9ICFyZWdpb24uaXNSZWN0SW5SZWdpb24odW5jbGlwcGVkRW5kQ2FyZXQpOworCisgICAg
ICAgICAgICAvLyBGaW5kIHRoZSB0b3AgY29ybmVyIGFuZCBib3R0b20gY29ybmVyLgorICAgICAg
ICAgICAgc3RkOjp2ZWN0b3I8QmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3Q+IGNsaXBwZWRS
ZWN0TGlzdCA9IHJlZ2lvbi5yZWN0cygpOworICAgICAgICAgICAgYWRqdXN0Q2FyZXRSZWN0cyhz
dGFydENhcmV0LCBzaG91bGRDbGlwU3RhcnRDYXJldCwgZW5kQ2FyZXQsIHNob3VsZENsaXBFbmRD
YXJldCwgY2xpcHBlZFJlY3RMaXN0LCBzdGFydENhcmV0UmVmZXJlbmNlUG9pbnQsIGVuZENhcmV0
UmVmZXJlbmNlUG9pbnQsIGlzUlRMKTsKKworICAgICAgICAgICAgLy8gVHJhbnNsYXRlIHRoZSBj
YXJldCB2YWx1ZXMgYXMgdGhleSBtdXN0IGJlIGluIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgor
ICAgICAgICAgICAgaWYgKCFzaG91bGRDbGlwU3RhcnRDYXJldCkgeworICAgICAgICAgICAgICAg
IHN0YXJ0Q2FyZXQgPSBtX3dlYlBhZ2UtPm1hcFRvVHJhbnNmb3JtZWQoc3RhcnRDYXJldCk7Cisg
ICAgICAgICAgICAgICAgbV93ZWJQYWdlLT5jbGlwVG9UcmFuc2Zvcm1lZENvbnRlbnRzUmVjdChz
dGFydENhcmV0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzaG91bGRDbGlw
RW5kQ2FyZXQpIHsKKyAgICAgICAgICAgICAgICBlbmRDYXJldCA9IG1fd2ViUGFnZS0+bWFwVG9U
cmFuc2Zvcm1lZChlbmRDYXJldCk7CisgICAgICAgICAgICAgICAgbV93ZWJQYWdlLT5jbGlwVG9U
cmFuc2Zvcm1lZENvbnRlbnRzUmVjdChlbmRDYXJldCk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICB9CisKKyAgICBERUJVR19TRUxFQ1RJT04oQmxhY2tCZXJyeTo6UGxhdGZvcm06Okxv
Z0xldmVsSW5mbywgIlNlbGVjdGlvbkhhbmRsZXI6OnNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCBT
dGFydCBSZWN0PSVzIEVuZCBSZWN0PSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0
Q2FyZXQudG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpLCBlbmRDYXJldC50b1N0cmluZygpLnV0Zjgo
KS5kYXRhKCkpOworCisgICAgbV93ZWJQYWdlLT5tX2NsaWVudC0+bm90aWZ5U2VsZWN0aW9uRGV0
YWlsc0NoYW5nZWQoc3RhcnRDYXJldCwgZW5kQ2FyZXQsIHJlZ2lvbik7Cit9CisKKy8vIE5PVEU6
IFRoaXMgZnVuY3Rpb24gaXMgbm90IGluIFdlYktpdCBjb29yZGluYXRlcy4KK3ZvaWQgU2VsZWN0
aW9uSGFuZGxlcjo6Y2FyZXRQb3NpdGlvbkNoYW5nZWQoKQoreworICAgIERFQlVHX1NFTEVDVElP
TihCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiU2VsZWN0aW9uSGFuZGxlcjo6
Y2FyZXRQb3NpdGlvbkNoYW5nZWQiKTsKKworICAgIEludFJlY3QgY2FyZXRMb2NhdGlvbjsKKyAg
ICAvLyBJZiB0aGUgaW5wdXQgZmllbGQgaXMgbm90IGFjdGl2ZSwgd2UgbXVzdCBiZSB0dXJuaW5n
IG9mZiB0aGUgY2FyZXQuCisgICAgaWYgKCFtX3dlYlBhZ2UtPm1faW5wdXRIYW5kbGVyLT5pc0lu
cHV0TW9kZSgpICYmIG1fY2FyZXRBY3RpdmUpIHsKKyAgICAgICAgbV9jYXJldEFjdGl2ZSA9IGZh
bHNlOworICAgICAgICAvLyBTZW5kIGFuIGVtcHR5IGNhcmV0IGNoYW5nZSB0byB0dXJuIG9mZiB0
aGUgY2FyZXQuCisgICAgICAgIG1fd2ViUGFnZS0+bV9jbGllbnQtPm5vdGlmeUNhcmV0Q2hhbmdl
ZChjYXJldExvY2F0aW9uLCBtX3dlYlBhZ2UtPm1fdG91Y2hFdmVudEhhbmRsZXItPmxhc3RGYXRG
aW5nZXJzUmVzdWx0KCkuaXNUZXh0SW5wdXQoKSAvKiB1c2VyVG91Y2hUcmlnZ2VyZWQgKi8pOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUKG1fd2ViUGFnZSAmJiBtX3dlYlBh
Z2UtPmZvY3VzZWRPck1haW5GcmFtZSgpICYmIG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1l
KCktPnNlbGVjdGlvbigpKTsKKworICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgcmVh
Y2ggdGhpcyBwb2ludCBpZiBpbnB1dCBtb2RlIGlzIGFjdGl2ZS4KKyAgICBBU1NFUlQobV93ZWJQ
YWdlLT5tX2lucHV0SGFuZGxlci0+aXNJbnB1dE1vZGUoKSk7CisKKyAgICBpZiAobV93ZWJQYWdl
LT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+c2VsZWN0aW9uKCktPnNlbGVjdGlvblR5cGUoKSA9PSBW
aXNpYmxlU2VsZWN0aW9uOjpDYXJldFNlbGVjdGlvbikgeworICAgICAgICBJbnRQb2ludCBmcmFt
ZU9mZnNldCA9IG1fd2ViUGFnZS0+ZnJhbWVPZmZzZXQobV93ZWJQYWdlLT5mb2N1c2VkT3JNYWlu
RnJhbWUoKSk7CisKKyAgICAgICAgY2FyZXRMb2NhdGlvbiA9IG1fd2ViUGFnZS0+Zm9jdXNlZE9y
TWFpbkZyYW1lKCktPnNlbGVjdGlvbigpLT5zZWxlY3Rpb24oKS52aXNpYmxlU3RhcnQoKS5hYnNv
bHV0ZUNhcmV0Qm91bmRzKCk7CisgICAgICAgIGNhcmV0TG9jYXRpb24ubW92ZShmcmFtZU9mZnNl
dC54KCksIGZyYW1lT2Zmc2V0LnkoKSk7CisKKyAgICAgICAgLy8gQ2xpcCBhZ2FpbnN0IHRoZSBj
b250YWluaW5nIGZyYW1lIGFuZCBub2RlIGJvdW5kYXJpZXMuCisgICAgICAgIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIHJlZ2lvbihjYXJldExvY2F0aW9uKTsKKyAgICAgICAg
Y2xpcFJlZ2lvblRvVmlzaWJsZUNvbnRhaW5lcihyZWdpb24pOworICAgICAgICBjYXJldExvY2F0
aW9uID0gcmVnaW9uLmV4dGVudHMoKTsKKyAgICB9CisKKyAgICBtX2NhcmV0QWN0aXZlID0gIWNh
cmV0TG9jYXRpb24uaXNFbXB0eSgpOworCisgICAgREVCVUdfU0VMRUNUSU9OKEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJTZWxlY3Rpb25IYW5kbGVyOjpjYXJldFBvc2l0aW9u
Q2hhbmdlZCBjYXJldCBSZWN0ICVkLCAlZCwgJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICAg
ICAgY2FyZXRMb2NhdGlvbi54KCksIGNhcmV0TG9jYXRpb24ueSgpLCBjYXJldExvY2F0aW9uLndp
ZHRoKCksIGNhcmV0TG9jYXRpb24uaGVpZ2h0KCkpOworCisgICAgY2FyZXRMb2NhdGlvbiA9IG1f
d2ViUGFnZS0+bWFwVG9UcmFuc2Zvcm1lZChjYXJldExvY2F0aW9uKTsKKyAgICBtX3dlYlBhZ2Ut
PmNsaXBUb1RyYW5zZm9ybWVkQ29udGVudHNSZWN0KGNhcmV0TG9jYXRpb24pOworCisgICAgbV93
ZWJQYWdlLT5tX2NsaWVudC0+bm90aWZ5Q2FyZXRDaGFuZ2VkKGNhcmV0TG9jYXRpb24sIG1fd2Vi
UGFnZS0+bV90b3VjaEV2ZW50SGFuZGxlci0+bGFzdEZhdEZpbmdlcnNSZXN1bHQoKS5pc1RleHRJ
bnB1dCgpIC8qIHVzZXJUb3VjaFRyaWdnZXJlZCAqLyk7Cit9CisKK2Jvb2wgU2VsZWN0aW9uSGFu
ZGxlcjo6c2VsZWN0aW9uQ29udGFpbnMoY29uc3QgSW50UG9pbnQmIHBvaW50KQoreworICAgIEFT
U0VSVChtX3dlYlBhZ2UgJiYgbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKSAmJiBtX3dl
YlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5zZWxlY3Rpb24oKSk7CisgICAgcmV0dXJuIG1f
d2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPnNlbGVjdGlvbigpLT5jb250YWlucyhwb2lu
dCk7Cit9CisKK30KK30KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJL
aXRTdXBwb3J0L1NlbGVjdGlvbkhhbmRsZXIuaCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9X
ZWJLaXRTdXBwb3J0L1NlbGVjdGlvbkhhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hZDRlMzk4NGJmZmY3
NmNhNTI1MmVhMTAzYTlhYzBkNGJiYzQzMmM1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YktpdC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvU2VsZWN0aW9uSGFuZGxlci5oCkBAIC0wLDAg
KzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2gg
SW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90
LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisg
Ki8KKworI2lmbmRlZiBTZWxlY3Rpb25IYW5kbGVyX2gKKyNkZWZpbmUgU2VsZWN0aW9uSGFuZGxl
cl9oCisKKyNpbmNsdWRlICJCbGFja0JlcnJ5UGxhdGZvcm1JbnRSZWN0UmVnaW9uLmgiCisjaW5j
bHVkZSAiQmxhY2tCZXJyeVBsYXRmb3JtUHJpbWl0aXZlcy5oIgorI2luY2x1ZGUgIlRleHRHcmFu
dWxhcml0eS5oIgorCituYW1lc3BhY2UgV1RGIHsKK2NsYXNzIFN0cmluZzsKK30KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworY2xhc3MgSW50UG9pbnQ7CitjbGFzcyBJbnRSZWN0OworY2xhc3MgTm9k
ZTsKK2NsYXNzIFZpc2libGVQb3NpdGlvbjsKK2NsYXNzIFZpc2libGVTZWxlY3Rpb247Cit9CisK
K25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIFdl
YlBhZ2VQcml2YXRlOworY2xhc3MgV2ViU3RyaW5nOworCitjbGFzcyBTZWxlY3Rpb25IYW5kbGVy
IHsKK3B1YmxpYzoKKyAgICBTZWxlY3Rpb25IYW5kbGVyKFdlYlBhZ2VQcml2YXRlKik7CisgICAg
flNlbGVjdGlvbkhhbmRsZXIoKTsKKworICAgIGJvb2wgaXNTZWxlY3Rpb25BY3RpdmUoKSB7IHJl
dHVybiBtX3NlbGVjdGlvbkFjdGl2ZTsgfQorICAgIHZvaWQgc2V0U2VsZWN0aW9uQWN0aXZlKGJv
b2wgYWN0aXZlKSB7IG1fc2VsZWN0aW9uQWN0aXZlID0gYWN0aXZlOyB9CisKKyAgICB2b2lkIGNh
bmNlbFNlbGVjdGlvbigpOworICAgIFdlYlN0cmluZyBzZWxlY3RlZFRleHQoKSBjb25zdDsKKwor
ICAgIGJvb2wgZmluZE5leHRTdHJpbmcoY29uc3QgV1RGOjpTdHJpbmcmLCBib29sKTsKKyAgICBi
b29sIHNlbGVjdGlvbkNvbnRhaW5zKGNvbnN0IFdlYkNvcmU6OkludFBvaW50Jik7CisKKyAgICB2
b2lkIHNldFNlbGVjdGlvbihjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgc3RhcnQsIGNvbnN0IFdl
YkNvcmU6OkludFBvaW50JiBlbmQpOworICAgIHZvaWQgc2VsZWN0QXRQb2ludChjb25zdCBXZWJD
b3JlOjpJbnRQb2ludCYpOworICAgIHZvaWQgc2VsZWN0T2JqZWN0KGNvbnN0IFdlYkNvcmU6Oklu
dFBvaW50JiwgV2ViQ29yZTo6VGV4dEdyYW51bGFyaXR5KTsKKyAgICB2b2lkIHNlbGVjdE9iamVj
dChXZWJDb3JlOjpUZXh0R3JhbnVsYXJpdHkpOworICAgIHZvaWQgc2VsZWN0T2JqZWN0KFdlYkNv
cmU6Ok5vZGUqKTsKKworICAgIHZvaWQgc2VsZWN0aW9uUG9zaXRpb25DaGFuZ2VkKGJvb2wgdmlz
dWFsQ2hhbmdlT25seSA9IGZhbHNlKTsKKworICAgIHZvaWQgc2V0Q2FyZXRQb3NpdGlvbihjb25z
dCBXZWJDb3JlOjpJbnRQb2ludCYpOworCisgICAgYm9vbCBsYXN0VXBkYXRlZEVuZFBvaW50SXNW
YWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1fbGFzdFVwZGF0ZWRFbmRQb2ludElzVmFsaWQ7IH0KKwor
cHJpdmF0ZToKKyAgICB2b2lkIGNhcmV0UG9zaXRpb25DaGFuZ2VkKCk7CisgICAgdm9pZCBnZXRD
b25zb2xpZGF0ZWRSZWdpb25PZlRleHRRdWFkc0ZvclNlbGVjdGlvbihjb25zdCBXZWJDb3JlOjpW
aXNpYmxlU2VsZWN0aW9uJiwgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb24mKSBj
b25zdDsKKyAgICB2b2lkIGNsaXBSZWdpb25Ub1Zpc2libGVDb250YWluZXIoQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkludFJlY3RSZWdpb24mKTsKKyAgICBib29sIHVwZGF0ZU9ySGFuZGxlSW5wdXRT
ZWxlY3Rpb24oV2ViQ29yZTo6VmlzaWJsZVNlbGVjdGlvbiYgbmV3U2VsZWN0aW9uLCBjb25zdCBX
ZWJDb3JlOjpJbnRQb2ludCYgcmVsYXRpdmVTdGFydAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiByZWxhdGl2ZUVuZCk7Cisg
ICAgV2ViQ29yZTo6Tm9kZSogRE9NQ29udGFpbmVyTm9kZUZvclZpc2libGVQb3NpdGlvbihjb25z
dCBXZWJDb3JlOjpWaXNpYmxlUG9zaXRpb24mKSBjb25zdDsKKyAgICBib29sIHNob3VsZFVwZGF0
ZVNlbGVjdGlvbk9yQ2FyZXRGb3JQb2ludChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYsIGNvbnN0
IFdlYkNvcmU6OkludFJlY3QmLCBib29sIHN0YXJ0Q2FyZXQgPSB0cnVlKSBjb25zdDsKKyAgICB1
bnNpZ25lZCBzaG9ydCBleHRlbmRTZWxlY3Rpb25Ub0ZpZWxkQm91bmRhcnkoYm9vbCBpc1N0YXJ0
SGFuZGxlLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgc2VsZWN0aW9uUG9pbnQsIFdlYkNvcmU6
OlZpc2libGVTZWxlY3Rpb24mIG5ld1NlbGVjdGlvbik7CisKKyAgICBXZWJQYWdlUHJpdmF0ZSog
bV93ZWJQYWdlOworCisgICAgYm9vbCBtX3NlbGVjdGlvbkFjdGl2ZTsKKyAgICBib29sIG1fY2Fy
ZXRBY3RpdmU7CisgICAgYm9vbCBtX2xhc3RVcGRhdGVkRW5kUG9pbnRJc1ZhbGlkOworICAgIEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIG1fbGFzdFNlbGVjdGlvblJlZ2lvbjsK
K307CisKK30KK30KKworI2VuZGlmIC8vIFNlbGVjdGlvbkhhbmRsZXJfaAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>